From f33f4399381398b484ef2dd4cf76ee6d04d15a18 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Tue, 14 May 2024 12:02:56 +0200 Subject: [PATCH] iteratewhile -> grouping --- latte/bg/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/bg/cookbook/iteratewhile.texy | 215 +--------------------------- latte/cs/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/cs/cookbook/iteratewhile.texy | 215 +--------------------------- latte/de/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/de/cookbook/iteratewhile.texy | 215 +--------------------------- latte/el/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/el/cookbook/iteratewhile.texy | 215 +--------------------------- latte/en/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/en/cookbook/iteratewhile.texy | 215 +--------------------------- latte/es/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/es/cookbook/iteratewhile.texy | 215 +--------------------------- latte/fr/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/fr/cookbook/iteratewhile.texy | 215 +--------------------------- latte/hu/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/hu/cookbook/iteratewhile.texy | 215 +--------------------------- latte/it/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/it/cookbook/iteratewhile.texy | 215 +--------------------------- latte/ja/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/ja/cookbook/iteratewhile.texy | 215 +--------------------------- latte/pl/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/pl/cookbook/iteratewhile.texy | 215 +--------------------------- latte/pt/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/pt/cookbook/iteratewhile.texy | 215 +--------------------------- latte/ro/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/ro/cookbook/iteratewhile.texy | 215 +--------------------------- latte/ru/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/ru/cookbook/iteratewhile.texy | 215 +--------------------------- latte/sl/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/sl/cookbook/iteratewhile.texy | 215 +--------------------------- latte/tr/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/tr/cookbook/iteratewhile.texy | 215 +--------------------------- latte/uk/cookbook/grouping.texy | 214 +++++++++++++++++++++++++++ latte/uk/cookbook/iteratewhile.texy | 215 +--------------------------- 34 files changed, 3655 insertions(+), 3638 deletions(-) create mode 100644 latte/bg/cookbook/grouping.texy create mode 100644 latte/cs/cookbook/grouping.texy create mode 100644 latte/de/cookbook/grouping.texy create mode 100644 latte/el/cookbook/grouping.texy create mode 100644 latte/en/cookbook/grouping.texy create mode 100644 latte/es/cookbook/grouping.texy create mode 100644 latte/fr/cookbook/grouping.texy create mode 100644 latte/hu/cookbook/grouping.texy create mode 100644 latte/it/cookbook/grouping.texy create mode 100644 latte/ja/cookbook/grouping.texy create mode 100644 latte/pl/cookbook/grouping.texy create mode 100644 latte/pt/cookbook/grouping.texy create mode 100644 latte/ro/cookbook/grouping.texy create mode 100644 latte/ru/cookbook/grouping.texy create mode 100644 latte/sl/cookbook/grouping.texy create mode 100644 latte/tr/cookbook/grouping.texy create mode 100644 latte/uk/cookbook/grouping.texy 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` и освен че всяка категория е в отделна колона, всяка подкатегория ще бъде в отделна колона. `