diff --git a/latte/bg/cookbook/grouping.texy b/latte/bg/cookbook/grouping.texy new file mode 100644 index 0000000000..52370c801c --- /dev/null +++ b/latte/bg/cookbook/grouping.texy @@ -0,0 +1,214 @@ +Всичко, което винаги сте искали да знаете за {iterateWhile} +*********************************************************** + +.[perex] +Тагът `{iterateWhile}` е подходящ за различни трикове в цикли foreach. + +Да предположим, че имаме следната таблица в базата данни, в която елементите са разделени на категории: + +| id | categoryId | name +|------------------ +| 1 | 1 | Apple +| 2 | 1 | Banana +| 3 | 2 | PHP +| 4 | 3 | Green +| 5 | 3 | Red +| 6 | 3 | Blue + +Разбира се, много е лесно да изведете елементите в цикъла foreach като списък: + +```latte + +``` + +Но какво да направите, ако искате да изведете всяка категория като отделен списък? С други думи, как се решава проблемът с групирането на елементи от линеен списък в цикъл foreach. Резултатът трябва да изглежда така: + +```latte + + + + + +``` + +Ще ви покажем как да решите този проблем лесно и елегантно с помощта на iterateWhile: + +```latte +{foreach $items as $item} + +{/foreach} +``` + +Докато `{foreach}` се отнася до външната част на цикъла, т.е. изготвянето на списъци за всяка категория, таговете `{iterateWhile}` се отнасят до вътрешната част, т.е. отделните елементи. +Условието в крайния таг гласи, че повторението ще продължи, докато текущият и следващият елемент принадлежат към една и съща категория (`$iterator->nextValue` - [следващ елемент |/tags#iterator]). + +Ако условието е винаги изпълнено, всички елементи се изтеглят във вътрешния цикъл: + +```latte +{foreach $items as $item} + +{/foreach} +``` + +Резултатът ще изглежда по следния начин: + +```latte + +``` + +Как е полезно да се използва iterateWhile по този начин? По какво се различава от решението, което показахме в началото на това ръководство? Разликата е, че ако таблицата е празна и не съдържа елементи, тя няма да се изведе празна ``. + + +Решение без `{iterateWhile}` .[#toc-solution-without-iteratewhile] +------------------------------------------------------------------ + +Ако трябва да решим същия проблем, като използваме напълно елементарни шаблони, например в Twig, Blade или чист PHP, решението би изглеждало по следния начин + +```latte +{var $prevCategoryId = null} +{foreach $items as $item} + {if $item->categoryId !== $prevCategoryId} + {* the category has changed *} + + {* we close the previous + {/if} + + {* we will open a new list *} + +{/if} +``` + +Този код обаче е неразбираем и неинтуитивен. Връзката между началния и крайния HTML таг не е съвсем ясна. От пръв поглед не е ясно дали има грешка. А това изисква помощни променливи като `$prevCategoryId`. + +За разлика от това решението с `{iterateWhile}` е чисто, ясно, не изисква помощни променливи и е надеждно. + + +Условие в затварящия таг .[#toc-condition-in-the-closing-tag] +------------------------------------------------------------- + +Ако посочите условие в отварящия таг `{iterateWhile}`, поведението се променя: условието (и преходът към следващия елемент) се изпълнява в началото на вътрешния цикъл, а не в края. +Така, докато `{iterateWhile}` без условие се въвежда винаги, `{iterateWhile $cond}` се въвежда само когато е изпълнено условието `$cond`. В същото време следващият елемент се записва в `$item`. + +Това е полезно например в ситуация, в която първият елемент във всяка категория трябва да се показва по различен начин, напр: + +```latte +

Apple

+ + +

PHP

+ + +

Green

+ +``` + +Променете изходния код, като визуализираме първия елемент и след това допълнителни елементи от същата категория във вътрешния цикъл `{iterateWhile}`: + +```latte +{foreach $items as $item} +

{$item->name}

+ +{/foreach} +``` + + +Вложени цикли .[#toc-nested-loops] +---------------------------------- + +Можем да създадем няколко вътрешни цикъла в един цикъл и дори да ги вложим един в друг. По този начин например подкатегориите могат да бъдат групирани заедно. + +Да предположим, че в таблицата има още една колона `subcategoryId` и освен че всяка категория е в отделна колона, всяка подкатегория ще бъде в отделна колона. `