Novinky v Latte 2.6: volitelné řetězení a vlastní funkce

před 5 lety od David Grudl  

Nedávno vyšlo Latte 2.6, se kterým přicházejí dvě šikovné novinky, které zjednoduší a zpřehlední vaše šablony. Pojďme se na ně podívat.

Volitelné řetězení

Volitelné řetězení (optional chaining) umožňuje psát kód, kde Latte okamžitě zastaví vyhodnocování výrazů, pokud narazí na null. A to díky novému operátoru ? umožňujícímu volitelný přístup k proměnným nebo prvkům pole. Když píšeme výraz jako

{$order?->id}

říkáme tím, že když je definován $order, bude vypsán $order->id, ale když je $order null, zastaví se vyhodnocování a prostě se vrátí null.

Uvidíte, že pomocí ? nahradíte spoustu kódu, který by jinak opakovaně kontroloval null:

{$user?->address?->street}
// znamená cca isset($user) && isset($user->address) ? $user->address->street : null

{$items[2]?->count}
// znamená cca isset($items[2]) ? $items[2]->count : null

{$user->getIdentity()?->name}
// znamená cca $user->getIdentity() !== null ? $user->getIdentity()->name : null

V příkladech píši cca, protože ve skutečnosti se výraz vyhodnocuje důmyslněji a žádný krok se neopakuje. Například $user->getIdentity() se zavolá jen jednou, tedy nemůže nastat problém způsobený tím, že by metoda poprvé vrátila objekt a podruhé null.

Výrazy s volitelným řetězením lze používat kdekoliv, například v podmínkách:

{if $blogPost?->count('*')}
	// znamená if (isset($blogPost) && $blogPost->count('*'))
	...
{/if}

Vlastní funkce

V Latte můžete používat všechny globální funkce PHP, ale nyní si také definovat své vlastní:

$latte = new Latte\Engine;
$latte->addFunction('random', function (...$args) {
	return $args[array_rand($args)];
});

nebo v presenterech (vyžaduje nette/application v3.0.3):

$this->template->addFunction('random', function (...$args) {
	return array_rand($args);
});

Použití je pak stejné, jako když voláte PHP funkci:

{random(jablko, pomeranč, citron)} // vypíše například: jablko

Podporu vlastních funkcí najdete i v Latte pluginu pro PhpStorm (lze nastavit i přes XML konfiguraci):

Jak obrázek naznačuje, společně s novou verzí nette/application můžete v šablonách používat novou dvojici funkcí isLinkCurrent() a isModuleCurrent().

<a n:href="Photo:" n:class="isLinkCurrent('Photo:') ? actual">Fotogalerie</a>

Komentáře

  1. Tak tohle je bomba :)

    před 5 lety
  2. Vypadá to skvěle.

    U příkladů s vlastní funkcí by myslím mělo být

    return $args[array_rand($args)];
    
    před 4 lety · replied [3] Michal Kumžák [4] David Grudl
  3. #2 uestla Teď budu dělat chytrýho, protože sem to dneska četl. To je syntaxe z PHP8, viz https://blog.nette.org/…e-noveho-1-4.

    před 4 lety
  4. #2 uestla díky, opraveno

    před 4 lety

Chcete-li odeslat komentář, přihlaste se