PHPTAL Dynamic Table Generation - PullRequest
       29

PHPTAL Dynamic Table Generation

1 голос
/ 13 декабря 2011

Я довольно часто создаю различные таблицы для табличных данных и хотел бы создать макрос, который может динамически создавать таблицы на основе структуры данных, определенной в вызывающем шаблоне (а не в коде 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.

<ч />

Edit:

В качестве примера, скажем, у меня есть произвольные переменные шаблона 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 ]

1 голос
/ 14 декабря 2011

Возможно, вам следует использовать вспомогательные методы, например, либо php:transpose_table(input_data), либо оберните его в функцию TALES:

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.

0 голосов
/ 28 января 2013

Для генерации обобщенной таблицы: 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>
...