PHPTAL Динамическое создание таблиц
Я довольно часто создаю различные таблицы для табличных данных и хотел бы создать макрос, который может динамически создавать таблицы на основе структуры данных, определенной в вызывающем шаблоне (а не в коде PHP). Вот упрощенный пример:
<!-- Define the macro -->
<tal:block metal:define-macro="table">
<table>
<tr tal:repeat="row data">
<td tal:repeat="col row" tal:content="col" />
</tr>
</table>
</tal:block>
<!-- Use the macro -->
<tal:block tal:define="data ???" metal:use-macro="table" />
То, что я ищу, это как определить data
(структура массива) из самого PHPTAL. Причина, по которой я не могу определить это как переменную шаблона в PHP (например, $tpl->data = array(...)
), потому что порядок и расположение данных принадлежат шаблону. Так, например, если я хочу перевернуть оси X и Y таблицы, мне нужно только изменить шаблон, а не код PHP.
Редактировать:
В качестве примера, скажем, у меня есть произвольные переменные шаблона foo
, bar
, а также baz
, Я могу использовать их в шаблонах так:
<span tal:content="foo" /><br />
<span tal:content="bar" /><br />
<span tal:content="baz" />
Как я могу построить эти переменные в двумерной структуре данных строк и столбцов, которые затем я могу передать в макрос, генерирующий таблицы? Примерно так (примечание: на самом деле это не работает):
<tal:block tal:define="data [foo, bar; baz]" metal:use-macro="table" />
Где желаемый результат из макроса будет:
<table>
<tr>
<td>foo</td>
<td>bar</td>
</tr>
<tr>
<td>baz</td>
</tr>
</table>
А потом, если бы я хотел поменяться местами foo
а также bar
Мне нужно только изменить шаблон и изменить определение data
в data [bar, foo; baz]
,
2 ответа
Вы, вероятно, должны использовать вспомогательные методы, например, либо php:transpose_table(input_data)
или оберните это в функцию СКАЗКИ:
function phptal_tales_transposed($expr, $nothrow) {
return 'transpose_table(' . phptal_tales($expr, $nothrow) . ')';
}
<tal:block tal:define="data transposed:input_data" metal:use-macro="table" />
Транспонирование или сортировка в самом PHPTAL были бы излишне сложными (PHPTAL - это не XSLT:)
Ответ для редактирования:)
Если вы хотите объединить несколько переменных в массив, используйте:
<tal:block tal:define="data php:array(foo, bar, baz)" metal:use-macro="table" />
array_chunk()
Функция может быть полезна, если вы хотите иметь определенное количество столбцов.
и если вам нравится пользовательский синтаксис, то напишите phptal_tales_…
функция, которая переводит ваш […]
синтаксис в коде PHP.
Для генерации общей таблицы: PHPTAL: Повторить заголовки столбца и значения
<table>
<thead>
<tr>
<th tal:repeat="r results/0">${repeat/r/key}</th>
</tr>
</thead>
<tbody>
<tal:block tal:repeat="r results">
<tr>
<td tal:repeat="t r">${t}</td>
</tr>
</tal:block>
</tbody>
</table>