Способы ограничить итерацию foreach

merlak

Новичок
Всем доброго дня

Есть вывод массива в шаблоне(smarty):

{foreach from=$article_array item=articleentry name=foo}

{if $articleentry.article->article_info.article_articlecat_id == 60}

<img src='{$articleentry.article->article_photo('./images/nophoto.gif', true)}' class='photo' >

{/if}

{/foreach}
как ограничить итерацию между условиями {if}{/if} до 5 например ??
Знаю что есть такие команды как:


{$smarty.foreach.foo.iteration } выводит номер итерации, т.е. номер цикла(незнаю как правильно)
{$smarty.foreach.foo.index } то же самое только с нуля
{$smarty.foreach.foo.total } понятно что общее кол-во

Все они для работы со всем массивом, а мне нужно только с фактическим, т.е. с тем массивом, который был ограничен условием {IF}.

Если написать типа:

{$smarty.foreach.foo.iteration < 5}

<img src='{$articleentry.article->article_photo('./images/nophoto.gif', true)}' class='photo' >
{else}

{/if}
То выводит как положено. Массив выводится типа: 1, 2, 3, 4, 5, 6, ......36
и первые 5 показывает

А если:
{if $articleentry.article->article_info.article_articlecat_id == 60} // сначала ограничиваем по id
{$smarty.foreach.foo.iteration < 5} // потом ограничиваем по выводу то что ограничили по условию {if}

<img src='{$articleentry.article->article_photo('./images/nophoto.gif', true)}' class='photo' >
{else}

{/if}
{/if}


Массив выводится типа: 2, 5, 11, 4, 3, 21



Так вот нужно чтобы из этих чисел он делал ограничение до 5 итераций

Есть ещё
{counter assign=i start=0 print=false} но тоже не получилось понять. Это вроде типа счётчика который выводит фактический вывод. Т.е. можно было бы if totalcount < 5.. как то так сделать..

Но прошу напрваить на нужный путь
 

peon

Lok'tar ogar
Жесть какая, вложенные условия запутывают
Сделай два обхода: в первом отфильтруй нужные значения и сохрани их в одну переменную в виде массива, а во второй выведи 5 значений из этого полученного массива
Реализуй сначало без шаблонизатора, потом реализуй на смарти что ли

Но прошу напрваить на нужный путь
Первый этап лучше реализовать в бэкенде.
 

merlak

Новичок
Жесть какая, вложенные условия запутывают
Сделай два обхода: в первом отфильтруй нужные значения и сохрани их в одну переменную в виде массива, а во второй выведи 5 значений из этого полученного массива
Реализуй сначало без шаблонизатора, потом реализуй на смарти что ли


Первый этап лучше реализовать в бэкенде.

Да, я при обработке данных базы в php файле, делал сортировку по критериям. Т.е. критерий был {$articlecat_id == 60} и всё работало, в шаблоне только надо было ограничить по итерации. Но у меня проблема, у меня не только один foreach, у меня их как минимум 6 должно быть.. Это типа новостные блоки и каждый должен с отдельным id выводиться и с определённым кол-вом.

А так, в пхп чтобы для 6 блоков сделать сортировку по критериям, надо много много писанины, дублировать переменные, класы, условия.. у меня ведь там чего только нет, и пагинации, и теги, и дата, и коменты, всё отображается в блоках...короче жуть там полная
 

peon

Lok'tar ogar
хз, делай как хотел, значит инкрементируй количество выведенных новостей в условии {$x = 0} {if $articleentry.article->article_info.article_articlecat_id == 60} {x++} {/if}
далее в теле foreach делай break если $x равен количеству нужных новостей
 

merlak

Новичок
хз, делай как хотел, значит инкрементируй количество выведенных новостей в условии {$x = 0} {if $articleentry.article->article_info.article_articlecat_id == 60} {x++} {/if}
далее в теле foreach делай break если $x равен количеству нужных новостей

А {break} разве работает?? Он же вроде уже всё, не функционирует?!)) я сколько пробвоал в шаблоне, не получалось, и примеры на форумах вставлял..
 

peon

Lok'tar ogar
А {break} разве работает?? Он же вроде уже всё, не функционирует?!)) я сколько пробвоал в шаблоне, не получалось, и примеры на форумах вставлял..
старый смарти видимо, так как сталкивался с этим в движке древнего шопа
лечится очень просто, так: http://www.smarty.net/forums/viewtopic.php?p=64102#64102
 

merlak

Новичок
Начать надо с того, что использовать нормальный синтаксис. http://www.smarty.net/docs/en/language.function.foreach.tpl
В этом вашем from item name чёрт голову сломит.
Ничего необычного в синтаксисе нет и проблема то не в нём. Тем боле что проблема решена благодаря пользователю peon, и огромное спасибо ему. !!!

Причём решение это элементарное оказалось)))
 

AnrDaemon

Продвинутый новичок
Необычного может и нет, зато читать его - свихнуться можно.
Почему не использовать нормальный
{foreach $var as $key => $value}
?
 
Сверху