Расположите элементы в столбцы с помощью Smarty
-
20-08-2019 - |
Вопрос
У меня есть страница PHP, которая создает массив элементов.Для простоты скажем, что он содержит цифры от 1 до 5 в порядке номеров.Эти числа должны быть поровну (или как можно ближе к равным) разделены на два столбца (с использованием таблицы html), например:
1 4
2 5
3
Количество столбцов может измениться в будущем.Поскольку это изменение на уровне представления, я предполагаю, что этого можно достичь, внося изменения исключительно в файл шаблона.Что мне наводит на мысль, что именно Smarty должен заниматься разделением элементов на столбцы.
Есть ли способ добиться этого с помощью Smarty (и как) или мне следует позволить php-файлу выполнить всю работу?
Решение
Это можно сделать в Smarty, но поскольку HTML и CSS на самом деле не поддерживают столбцы, это затруднительно.Он включает в себя выяснение количества элементов в массиве и использование тегов {section} сначала для захвата первой половины (округленной вверх) элементов и отображения их в одном столбце, а затем отдельного {section} для захвата второго. половину (округляя в большую сторону) предметов и поместите их во второй столбец.
Для {section} вы можете указать, с какого индекса массива начинать и сколько элементов вы хотите.Если вы зададите количество элементов в массиве в качестве другой переменной, вы сможете просто вычислить это значение.
Вы могли бы попробовать такой код, но боюсь, я не проверял эти расчеты, поэтому они могут быть неправильными...
<td>
{section name=myitem loop=$items max=(($itemcount/2)+0.499)}
{$items[myitem]}
{/section}
</td>
<td>
{section name=myitem loop=$items start=(($itemcount/2)+0.499)}
{$items[myitem]}
{/section}
</td>
Другие советы
Вот мое решение с использованием foreach и итераций:
<ul>
{foreach from=$items item=item name=firstFE}
{if $smarty.foreach.firstFE.index lt ($items|@count / 2)}
<li>{$item->title}</li>
{/if}
{/foreach}
</ul><ul>
{foreach from=$items item=item name=secFE}
{if $smarty.foreach.secFE.index gte ($items|@count / 2)}
<li>{$item->title}</li>
{/if}
{/foreach}
</ul>