Smarty - цикл foreach 10 раз и остановка - PullRequest
13 голосов
/ 13 августа 2010

Я использую следующий код Smarty:

{foreach from=$entries key=i item=topic}
  {if $topic.topic_style == question}
    <li>
      <a href="topic.php?id={$topic.id}">{$topic.title}</a>
    </li>
  {/if}
{/foreach}

Как я могу выполнить {foreach} максимум 10 раз, а затем остановиться?

Ответы [ 8 ]

30 голосов
/ 13 августа 2010

Вы можете использовать функции index и break:

{foreach from=$entries key=i item=topic name=foo}
  {if $smarty.foreach.foo.index == 10}
    {break}
  {/if}
  {if $topic.topic_style == question}
    <li>
      <a href="topic.php?id={$topic.id}">{$topic.title}</a>
    </li>
  {/if}
{/foreach}

Функция прерывания описана здесь:

Перерыв в foreach Смарти / Дву

23 голосов
/ 08 декабря 2014

Вы можете просто использовать array_slice:

{foreach $entries|@array_slice:0:10 as $topic}
  ...
{/foreach}
8 голосов
/ 13 августа 2010

Использование index:

{foreach from=$entries key=i item=topic name=foo}
  {if $smarty.foreach.foo.index < 10}
    {if $topic.topic_style == question}
      <li>
        <a href="topic.php?id={$topic.id}">{$topic.title}</a>
      </li>
    {/if}
  {/if}
{/foreach}
4 голосов
/ 21 марта 2013

В этом примере используется index , вы получите 11 результатов.См. Мои заметки

{foreach from=$entries key=i item=topic name=foo} // note (1)
    {if $smarty.foreach.foo.index == 10} // notes (2.1, 2.2 and 2.3)
       {php}break;{/php} // note (2.4) 
    {/if} 
    {if $topic.topic_style == question} // note (3)
        <li> 
            <a href="topic.php?id={$topic.id}">{$topic.title}</a> 
       </li> 
   {/if} 
{/foreach}

Заметки

(1) Если вы не используете ключ, нет необходимости определять его

(2.1) Есливы используете index начало цикла 0, используя iteration вместо счетчика, начинающегося с 1, для простого инкрементного подсчета используйте iteration not index .

(2.2) Хотя в коде smarty все нормально, вы используете ==,! = И т. Д., Для удобства чтения лучше использовать eq, neq, is, not, и / или. список можно продолжить, полный список см. в документации smarty.

(2.3) Я отметил выше об 11 результатах, используя index .Это может произойти в приведенном выше примере просто потому, что число равно 10, чтобы получить результат 10 для печати разрыва, вам нужно было бы использовать 9 в качестве значения.

(2.4) Вместо этого используйте умный разрыв,вам не обязательно писать умный плагин, есть множество плагинов, доступных для установки.

(3) Как и в PHP, вам не нужно использовать кавычки для переменных, целых чисел, констант или логических значений.строка не является ни одной из них и должна быть заключена в кавычки.

Старая редакция

{foreach from=$entries item=topic name=foo} 
        {if $smarty.foreach.foo.iteration eq 10} 
           {break}    
        {/if} 
        {if $topic.topic_style eq "question"} 
            <li> 
                <a href="topic.php?id={$topic.id}">{$topic.title}</a> 
           </li>
       {/if}
    {/foreach}

Я переосмыслил это, и в результате я выяснилЧтобы полностью исключить необходимость прерывания, цикл просто завершится на последней итерации.почему я не думал об этом раньше, я не знаю, но в любом случае, вот лучший способ закончить цикл без прерывания. lte и le оба означают меньше или равно, точно так же, как PHP <= </p>

Вы также можете использовать neq (не равнок) и сделать число 11, но если у вас будет больше результатов в массиве, он просто пропустит итерацию 11 и продолжит работу до конца массива.Если у вас есть только 10 элементов в массиве, вы можете использовать любой из трех способов, но для простоты в этом случае я бы придерживался операторов менее равных.

Теперь вы заметите, что этот цикл foreach очень велик

The Better Revision

{foreach from=$entries item=topic name=foo} 
    {if $smarty.foreach.foo.iteration lte 10 AND $topic.topic_style eq "question"} 
        <li> 
            <a href="topic.php?id={$topic.id}">{$topic.title}</a> 
       </li>
   {/if}
{/foreach}

Сводка

Короче говоря, оба способа будут работать, я отметил выше вариант с использованием оператора меньше чем синдекс, который был бы предпочтительным способом оценки.

Однако, переключаясь на итерацию, вы допускаете более прямой цикл, вам не нужно думать о том, что правильное значение, его простое, я хочу 10 результатов, так что итерационное уравнение 10 .

Небольшая боковая дорожка здесь : Другая проблема с индексом по итерации - индекс не будет отображать таблицу правильно, если вы используете модуль, Этоодинаково верно в программах PHP.Использование итерации с модулем упростит вашу жизнь.это эквивалентно установке счетчика, потому что индекс строки не будет делать то, что вам нужно.

Используя операторы smarty вместо аналогов PHP, вы можете написать более читаемый файл шаблона.Помните, что шаблоны не предназначены для логики php, они предназначены для дизайнеров внешнего интерфейса.Для программиста PHP операторы становятся второй натурой, но для дизайнера они могут быть чужды своей обычной работе.

2 голосов
/ 13 августа 2010

Если вы не хотите писать плагин smarty, вы можете сделать это тоже:

{foreach from=$entries key=i item=topic name=foo} 
  {if $smarty.foreach.foo.index == 10} 
       {php}break;{/php}    
  {/if} 
  {if $topic.topic_style == question} 
    <li> 
      <a href="topic.php?id={$topic.id}">{$topic.title}</a> 
    </li> 
  {/if} 
{/foreach} 
1 голос
/ 20 сентября 2018

Все вышеперечисленное работало в определенной степени, но не совсем то, что я хотел.Вот что сработало для меня.Я в основном использовал свойство индекса foreach

{foreach $products as $product}
{if $product@index eq 3}
    {break}
{/if}
<img src="..products/{$product.product_image}" alt="">

{/ foreach}

0 голосов
/ 11 марта 2015

У Smarty 3 есть еще один вариант, если это вообще возможно, тогда рекомендуется обновление. Если вы не можете поговорить с разработчиком вашего приложения.

{foreach $result_set as $result}
    {if $result@iteration lte 10}
        // just as in php both forms of access are available.
        {$result.assoc_key}
        {$result.0}
    {/if}
{/foreach}

Также стоит отметить, что в Smarty 3 также есть встроенный {break}. Однако, если вы выходите из цикла foreach до конца и, по существу, отбрасываете оставшиеся данные, вы можете подумать, возможно ли ОГРАНИЧИТЬ ваши sql-запросы.

0 голосов
/ 13 ноября 2013

Небольшое расширение в smarty для ограничения foreach.

В файле: sysplugins / smarty_internal_compile_foreach.php

Добавить ограничение к исходным атрибутам:

public $optional_attributes = array('name', 'key','limit'); 

Добавить после $output = "<?php "; это>

if (isset($_attr['limit'])) {
    $limit = $_attr['limit'];
    $output .= "\n \$_limitCnt = 0; \n \$_limit = $limit; \n";
}

Добавить до $output .= "?>"; это>

if (isset($_attr['limit'])) {
     $output .= "\n if (\$_limitCnt == \$_limit) { break; }";
     $output .= "\n \$_limitCnt++;";
}

Используйте в качестве обычного значения для каждого и добавьте limit = # для ограничения ваших результатов.

Надеюсь, я помог.

...