PHPTAL动态表生成

时间:2011-12-13 14:52:09

标签: template-tal 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" />

我正在寻找的是如何从PHPTAL本身定义data(数组结构)。我无法在PHP(例如$tpl->data = array(...))中将其定义为模板变量的原因是因为数据的顺序和布局属于模板。因此,例如,如果我想翻转表的X轴和Y轴,我只需要修改模板, PHP代码。


修改

举个例子,假设我有任意模板变量foobarbaz。我可以在模板中使用这些:

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

稍后,如果我想换掉foobar的位置,我只需要修改模板并将data的定义更改为{{1 }}

2 个答案:

答案 0 :(得分:1)

你应该使用辅助方法,例如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代码。

答案 1 :(得分:0)

对于通用表生成: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>