Вывод по тегу ditto:

Прерыватель вывода Ditto
23 October 2009

Буду по возможности краток :) В CMS MODx есть модуль Ditto, который позволяет выводить списки. С помощью него выводятся новости, документы раздела, и прочие однотипные сущности. Пример:

<div>  
<span>Иванов Иван</span>
<span>Петров Петр</span>
<span>Сидоров Сидр</span>
...
</div>

Всё здорово, однако что делать если надо прерывать вывод списка? Вот как-то так:

<div>  
<span>Иванов Иван</span>
<span>Петров Петр</span>
</div>
<div>
<span>Сидоров Сидр</span>
...
</div>

Ага, одни тут же вспомнили про [+ditto_iteration+], а другие, покопавшись в MODx Wiki, нашли [+phx:evenodd+]. Всё верно: копирем тот сниппет, немного редактируем, ставим в конце чанка-шаблона [+ditto_iteration:evenodd+], и получаем требуемый результат.

А что делать если надо не через два? Ведь чет и нечет пролетают мимо. Правильно — можно взять всё тот же сниппет и переписать его "через каждые 3", ничего сложного.

И всё это здорово, но есть пара НО:
1) Каждый раз прерывать поток сознания на переписывание таких глупостей весьма глупо.  
2) Если в проекте надо и через 2, и через 3, и через 7, да еще и прерыватели везде разные, то хочется это как-то автоматизировать.

 

Собственно, после пары подобных ситуаций я немного переписал тот самый phx:evenodd, в результате чего предлагаю вам ознакомиться с phx:evenoddx. Разница, если кто не понял, в последней букве.

Сам сниппет:

<?php  
$x = explode('::', $options); 
$num = is_numeric($x[0]) ? $x[0] : 3; 
$html = isset($x[1]) ? $x[1] : '<div></div>';

if (!($output % $num) && ($output))  
    return $html; 
else
    return ' ';
?>

Ну, если кто не в курсе, то надо создать сниппет, назвать его phx:evenoddx, и записать в него вышеприведенный код. И, разумеется, иметь установленный phx. После этого в конце чанка, который будет использовать Ditto, вызываем наш сниппет вот так:

[+ditto_iteration:evenoddx+]

Если параметров нет (как в этом примере), то на каждый 3-ий вывод будет генерироваться '</div><div>'. Таким нехитрым образом решается последняя задача из вышеприведенных (она весьма часта). Но можно написать и так:

[+ditto_iteration:evenoddx=`5`+]

— '</div><div>' будет выводиться через каждые 5 элементов.

[+ditto_iteration:evenoddx=`17::</span><span class="pictures">`+]

— Через каждые 17 будет выводиться '</span><span class="pictures">'. Двойное двоеточие — это просто такой разделитель.

 

Таким образом задача прерываемого перечисления элементов с помощью Ditto решается однажды и навсегда, можно через сколько угодно элементов вставлять любой прерыватель. Пользуйтесь на здоровье, если кому понадобится. С удовольствием узнаю ваши варианты решения подобной проблемы.

1