#1 17. 2. 2010 23:53

rokerkony
Člen
Místo: Děčín 27
Registrovaný: 29. 7. 2008
Příspěvky: 120

n:foreach a n:if … řazení

Ahoj mám tento kód

<tr n:if="!empty($notes)" n:foreach="$notes as $note">
        <td>
                {$note->note_created|date}
        </td>
</tr>

a předpokládal jsem že se nejdříve vykoná podmínka IF a teprve když to projde, tak dojde ke zpracování foreache… ale ať zadám kód výše nebo to prohodím takto

<tr n:foreach="$notes as $note" n:if="!empty($notes)">

tak mi to vždy vygeneruje toto:

<?php foreach ($iterator = $_cb->its[] = new SmartCachingIterator($notes) as $note): if (!empty($notes)): ?>

čili podmínku if to hodí za foreach…
nevím zda je to bug nebo chtěné chování, ale asi spíš bug

jsem na vývojové verzi…

Offline

 

#2 20. 2. 2010 18:50

v6ak
Člen
Registrovaný: 1. 5. 2008
Příspěvky: 129

Re: n:foreach a n:if … řazení

Co jsem četl diskuzi, tak je to spíš vlastnost. Na pořadí parametrů AFAIK zřetel brán obecně není a podmínka se může hodit k filtraci.

Offline

 

#3 20. 2. 2010 23:38

rokerkony
Člen
Místo: Děčín 27
Registrovaný: 29. 7. 2008
Příspěvky: 120

Re: n:foreach a n:if … řazení

chapu ze neni brat zretel na poradi v jakem to pises… ale melo by to snad zachovavat poradi ktere zadas ne?

a nebo jinak.. jak to resite?

<tr n:foreach="$notes as $note">

když je $notes prazdny tak to zarve chybu… takhle by se to dalo osetrit… ?? nebo lepsi napad??

Offline

 

#4 21. 2. 2010 9:11

JannBaill
Člen
Registrovaný: 9. 5. 2009
Příspěvky: 34

Re: n:foreach a n:if … řazení

Možná zkusit tohle

<table n:if="$notes">
        <tr n:foreach="$notes as $note">
        </tr>
</table>

Offline

 

#5 21. 2. 2010 11:03

rokerkony
Člen
Místo: Děčín 27
Registrovaný: 29. 7. 2008
Příspěvky: 120

Re: n:foreach a n:if … řazení

problem je ze jsem chtel halvicku tabulky zachovat… ale zatim asi jine reseni pomoci n: syntax neni noooo

Offline

 

#6 21. 2. 2010 11:07

Petr Motejlek
Nette guru
Registrovaný: 9. 1. 2009
Příspěvky: 283

Re: n:foreach a n:if … řazení

Já se vždycky snažím proměnnou definovat (tzn. mít jich co nejméně null), takže i pole, nejdřív definuju jako array() a pak je začnu plnit.

Offline

 

#7 21. 2. 2010 19:32

rokerkony
Člen
Místo: Děčín 27
Registrovaný: 29. 7. 2008
Příspěvky: 120

Re: n:foreach a n:if … řazení

to je rohodne dobre reseni… :) a resi i muj problem…

Offline

 

#8 19. 3. 2010 20:59

nAS
Nette guru
Místo: Praha
Registrovaný: 18. 12. 2008
Příspěvky: 210
Web

Re: n:foreach a n:if … řazení

Mně by se také líbilo, kdyby se zachovávalo pořadí parametrů. Tak jsem se na to koukal a stačí přepsat metodu attrsMacro v LatteMacros.php:

public function attrsMacro($code, $attrs, $closing)
{
        $left = $right = '';
        foreach ($attrs as $name => $foo) {

                $macro = $closing ? "/$name" : $name;
                if (isset($this->macros[$macro])) {
                        if ($closing) {
                                $right = $this->macro($macro, '', '') . $right;
                        } else {
                                $left .= $this->macro($macro, $attrs[$name], '');
                        }
                }

                else if (strpos($name, 'inner-') === 0) {
                        $innerName = substr($name, 6); // strip starting "inner-"
                        $macro = $closing ? "/$innerName" : $innerName;
                        if (isset($this->macros[$macro])) {
                                if ($closing) {
                                        $left .= $this->macro($macro, '', '');
                                } else {
                                        $right = $this->macro($macro, $attrs[$name], '') . $right;
                                }
                        } else {
                                return NULL;
                        }
                }

                else if (strpos($name, 'tag-') === 0) {
                        $tagName = substr($name, 4); // strip starting "tag-"
                        if (isset($this->macros[$tagName])) {
                                $left .= $this->macro($tagName, $attrs[$name], '');
                                $right = $this->macro("/$tagName", '', '') . $right;
                        } else {
                                return NULL;
                        }
                }

                else {
                        return NULL;
                }

                unset($attrs[$name]);
        }

        return $left . $code . $right;
}

Ještě by to chtělo, aby někdo zkontroloval, jestli to nemá nějaké vedlejší efekty, ale já jsem žádné nepozoroval. A kód by měl být rychlejší než originální.

Jenom se musí dávat n:tag- parametry za všechny ostatní n:, jinak to nefunguje správně. Ale na to by šla udělat jednoduše kontrola a vyhazovat výjimku.


$application->run(); // Run Forrest, run!

@MartinMajor

Offline

 

Zápatí