From 91d0b92390adec87a128e5cf4cb4b724bb8ace6b Mon Sep 17 00:00:00 2001 From: David Grudl Date: Tue, 14 May 2024 13:29:49 +0200 Subject: [PATCH] x --- latte/en/cookbook/grouping.texy | 217 +++++++++++++++++++------------- 1 file changed, 130 insertions(+), 87 deletions(-) diff --git a/latte/en/cookbook/grouping.texy b/latte/en/cookbook/grouping.texy index 6e94eefdb0..172be8db44 100644 --- a/latte/en/cookbook/grouping.texy +++ b/latte/en/cookbook/grouping.texy @@ -1,10 +1,17 @@ Everything You Always Wanted to Know About Grouping -*************************************************** +*********************************************** .[perex] -The tag `{iterateWhile}` is suitable for various tricks in foreach cycles. +Při práci s daty ve šablonách můžete často narazit na potřebu jejich seskupování nebo specifického zobrazení podle určitých kritérií. Latte pro tento účel nabízí hned několik silných nástrojů. -Suppose we have the following database table, where the items are divided into categories: +Filtr a funkce `|group` umožňují efektivní seskupení dat podle zadaného kritéria, filtr `|batch` zase usnadňuje rozdělení dat do pevně daných dávek a značka `{iterateWhile}` poskytuje možnost složitějšího řízení průběhu cyklů s podmínkami. +Každá z těchto značek nabízí specifické možnosti pro práci s daty, čímž se stávají nepostradatelnými nástroji pro dynamické a strukturované zobrazení informací v Latte šablonách. + + +Filtr a funkce `group` .{data-version:3.0.16} +============================================= + +Představte si databázovou tabulku `items` s položkami rozdělenou do kategorií: | id | categoryId | name |------------------ @@ -15,7 +22,7 @@ Suppose we have the following database table, where the items are divided into c | 5 | 3 | Red | 6 | 3 | Blue -Of course, drawing items in a foreach loop as a list is easy: +Jednoduchý seznam všech položek pomocí Latte šablony by vypadal takto: ```latte ``` -But what to do if you want render each category in a separate list? In other words, how to solve the task of grouping items from a linear list in a foreach cycle. The output should look like this: +Pokud bychom ale chtěli, aby položky byly uspořádány do skupin podle kategorie, potřebujeme je rozdělit tak, že každá kategorie bude mít svůj vlastní seznam. Výsledek by pak měl vypadat následovně: ```latte ``` -We will show you how easily and elegantly the task can be solved with iterateWhile: +Úkol se dá snadno a elegantně vyřešit pomocí `|group`. Jako parametr uvedeme `categoryId`, což znamená, že se položky rozdělí do menších polí podle hodnoty `$item->categoryId` (pokud by `$item` bylo pole, použije se `$item['categoryId']`): ```latte -{foreach $items as $item} +{foreach ($items|group: categoryId) as $categoryId => $categoryItems} {/foreach} ``` -While `{foreach}` marks the outer part of the cycle, ie the drawing of lists for each category, the tags `{iterateWhile}` indicate the inner part, ie the individual items. -The condition in the end tag says that the repetition will continue as long as the current and the next element belong to the same category (`$iterator->nextValue` is [next item |/tags#$iterator]). +Filtr lze v Latte použít i jako funkci, což nám dává alternativní syntaxi: `{foreach group($items, categoryId) ...}`. -If the condition is always met, then all elements are drawn in the inner cycle: +Chcete-li seskupovat položky podle složitějších kritérií, můžete v parametru filtru použít funkci. Například, seskupení položek podle délky názvu by vypadalo takto: ```latte -{foreach $items as $item} +{foreach ($items|group: fn($item) => strlen($item->name)) as $items} + ... +{/foreach} +``` + +Je důležité si uvědomit, že `$categoryItems` není běžné pole, ale objekt, který se chová jako iterátor. Pro přístup k první položce skupiny můžete použít funkci [`first()`|latte:functions#first]. + +Tato flexibilita v seskupování dat činí `group` výjimečně užitečným nástrojem pro prezentaci dat v šablonách Latte. + + +Vnořené smyčky +-------------- + +Představme si, že máme databázovou tabulku s dalším sloupcem `subcategoryId`, který definuje podkategorie jednotlivých položek. Chceme zobrazit každou hlavní kategorii v samostatném seznamu `