it-swarm.com.ru

Smarty - цикл foreach 10 раз и остановка

Я использую следующий код 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 раз, а затем остановиться?

13
CLiown

Вы можете использовать функции 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}

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

Перерыв в Smarty's/Forew Dwoo

28
hsz

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

{foreach $entries|@array_slice:0:10 as $topic}
  ...
{/foreach}
21
acme

Используйте 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}
8
Dominic Rodger

В этом примере используется 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, используя итерацию вместо счетчика начинается с 1, для простого инкрементного подсчета используйте итерация, а не индекс .

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

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

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

(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 <=

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

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

Лучший пересмотр

{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. Использование итерации с модулем упростит вашу жизнь. это эквивалент установки счетчика, потому что индекс строки не будет делать то, что вам нужно.

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

4
Chris

Если вы не хотите писать плагин 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} 
2
Zsolti

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

{foreach $products as $product}
{if [email protected] eq 3}
    {break}
{/if}
<img src="..products/{$product.product_image}" alt="">

{/для каждого}

1
Maxximum Rider

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

{foreach $result_set as $result}
    {if [email protected] 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
Chris

Малый простирай в умнице, чтобы ограничить 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 = #, чтобы ограничить свои результаты.

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

0
Divion D