Jak v latte chytře zapsat {if $a}{$a->name}{/if} jinak?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jasir
Člen | 746
+
0
-

No, možná to někde už je a mě jenom dneska hrabe, ale hodilo by se mi, aby v latte šla zapsat taková konstrukce:

{if $director}
  {$director-subject->names->individual}
{/if}

Zapisuji to takto:

{$director ? $director->subject->names->individual : ''}

…ale štvě mě tam to „: ''“. Nešlo by to nějak vynechat? A nebo co rovnou v latte implementovat existential operatorcoffeescriptu.

{$director?->subject?->names?->individual}

Editoval jasir (11. 6. 2012 17:59)

Jan Tvrdík
Nette guru | 2595
+
0
-

Když tě to štve, tak proč to tam píšeš?

{$director ? $director->subject->names->individual}
jasir
Člen | 746
+
0
-

Hmm, nojo. Dneska jsem fakt vypatlanej. Proto sem to taky hodil do začátečníků… ;-)
A co ten existenční operátor, taky blbost?

Editoval jasir (11. 6. 2012 18:17)

Jan Tvrdík
Nette guru | 2595
+
0
-

Ten se mi líbí :)

Chápu dobře, že {$a?->b?->c} by se přeložilo jako

<?php echo isset($a) : (isset($a->b ? $a->b->c : NULL) : NULL); ?>

Nebo jak si to představuješ?

jasir
Člen | 746
+
0
-

Ano, přesně tak jsem to myslel. Ideálně ještě rozšířeno i o ArrayAccess přístup:

{$a?->b?['c']}
isset($a) : (isset($a->b) ? (isset($a->b['c'] : $a->b['c'] ? NULL) : NULL) : NULL

Editoval jasir (11. 6. 2012 20:03)

Majkl578
Moderator | 1364
+
0
-

To se mi líbí. JSF v Javě umí něco podobného (je to implicitní chování, není třeba přidávat ? za každou úroveň, je ale pravda, že tam je to součást EL).

jasir
Člen | 746
+
0
-

Moderátoři, nemůžete toto vlákno přesunout do „Diskuze o vývoji frameworku“ ?

Majkl578
Moderator | 1364
+
0
-

jasir napsal(a):

nemůžete toto vlákno přesunout do „Diskuze o vývoji frameworku“

Hotovo.

Jan Tvrdík
Nette guru | 2595
+
0
-

Je otázka, zda není lepší použít místo isset třeba is_object.

jasir
Člen | 746
+
0
-

Okej, pokusil jsem se to implementovat: https://github.com/…te/pull/1033

Zatím jako proof-of-concept.

David Grudl
Nette Core | 8227
+
0
-

Psát někde {$a?->b?['c']?->d()} mi připadá děsně stupidní… Proč vůbec tolik otazníků?

Filip Procházka
Moderator | 4668
+
0
-

Když už to musí být, tak mně by se líbila syntaxe {$a->b['c']->d()|?}, jakože magickej helper :)

Ale obecně bych raději doporučil nastudovat si null-object pattern.

Editoval Filip Procházka (14. 4. 2013 18:47)

Jan Tvrdík
Nette guru | 2595
+
0
-

@David Grudl: Většinou nejsou všechny úrovně možná NULL.

@Filip Procházka: To se mi nelíbí. Nechci to automaticky na všechny úrovně. Mohl bych si tak omylem schovat nějakou chybu.

jasir
Člen | 746
+
0
-

@Jan Tvrdík +1

Je to prostě nový operátor ?->, takže kde se použije, tam je otazník. Proto tolik otazníků. Inspirací byl coffescript existential operator:

<script>
zip = lottery.drawWinner?().address?.zipcode
</script>

Funguje to stejně, akorát že v php je ?→ (zdá se mi to logické)

Je pravda, že Nette do teď kromě vylepšení polí a ternárního operátoru nijak php kód neupravovala, toto je první vlaštovka

Edit: viz také „Safe Navigation Operator“ z groovy

Editoval jasir (13. 4. 2013 20:45)

David Grudl
Nette Core | 8227
+
0
-

Vlaštovka rozhodně není mrtvá, jen to chce důkladněji promyslet.

Rozhodně bych to neimplementoval jako operátor ?->, ale čistě jako otazník, aby fungovalo třeba {$a?}.

Také je třeba řešit vnoření, jako např. $a?[ $b?->c ], ujasnit si, zda {$a?->b?->c?} je totéž jako {$a->b->c?} a jak implementovat výraz, kde je volání funkce {$a->b()?}, který nelze vložit do isset. Asi by nemělo být povoleno {$a->b?()}.

jasir
Člen | 746
+
0
-

Jen malá poznámka, v mém pokusné implementaci volání metod {$a->getMessage()?->text} funguje snad dobře. Je pravda, že jsem implementoval pouze property access, na arraye to není. Jede to přes is_object, nikoliv isset.

Samotný otaznímk mě ani nenapadlo zvažovat, nechtěl jsem modifikovat chování stávajícího (ternárního) operátoru.

Majkl578
Moderator | 1364
+
0
-

David Grudl napsal(a):

kde je volání funkce {$a->b()?}, který nelze vložit do isset.

Od PHP 5.5 to možné bude. Otázkou je, zda to hackovat pro 5.4 a níže nebo z toho nechat čistě převod „? becomes isset“ bez další magie, což by podle mě bylo o něco transparentnější.

+ jsem na GitHubu před chvílí připsal komentář.

Editoval Majkl578 (15. 4. 2013 2:00)