我发现自己为表格数据创建了各种表,并且希望创建一个宏,该宏可以根据调用模板(而不是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代码。
编辑:
举个例子,假设我有任意的模板变量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]
。
您可能应该使用辅助方法,例如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代码
对于泛型表生成:PHPTAL: Repeat列标头和值
<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>