你知道PHP的任何流行的PHP模板引擎有当前上下文节点的概念吗?

时间:2010-10-15 12:03:24

标签: php templates

此问题与此Is there anything like Dwoo-s {with} or {loop} in Smarty 3 or earlier?

有关

基本上我想从XSLT模板中获得类似当前节点的东西。

在XSLT中我写的内容如下:

<xsl:for-each select="catalog/cd">
<tr>
  <td><xsl:value-of select="title"/></td>
  <td><xsl:value-of select="artist"/></td>
</tr>
</xsl:for-each>

艺术家实际上是指目录/ cd [1] /艺术家(当然还有[2],[3] ......等等,如果还有更多的CD-s)

理解字段名称的当前上下文在每个块内部发生了变化。

我非常喜欢这个功能。你知道任何流行的PHP模板引擎(除了Dwoo)有这个功能吗?

更新

Tim Fountain建议:

// smarty
{foreach from=$cds item=cd}
    <tr>
        <td>{$cd->title}</td>
        <td>{$cd->artist}</td>
    </tr>
{/foreach}

但我更喜欢这样的东西:

// dwoo
{foreach from=$cds}
    <tr>
        <td>{$title}</td>
        <td>{$artist}</td>
    </tr>
{/foreach}

哪个不起作用。

考虑嵌套循环(让我们假设cd有多个艺术家):

// smarty
{foreach from=$cds item=cd}
    <tr>
        <td>{$cd->title}</td>
        <td><ul>
        {foreach from=$cd->artist item=$ar}
           <li>{$ar}</li>
        {/foreach}
        </ul></td>
    </tr>
{/foreach}

当我更喜欢

// dwoo
{foreach from=$cds}
    <tr>
        <td>{$title}</td>
        <td><ul>
        {foreach from=$artist}
           <li>{$}</li>
        {/foreach}
        </ul></td>
    </tr>
{/foreach}

此外,如果我在磁带上也有音乐集合,我可以用相同的代码迭代它:

// dwoo
{foreach from=$mcs}
    <tr>
        <td>{$title}</td>
        <td><ul>
        {foreach from=$artist}
           <li>{$}</li>
        {/foreach}
        </ul></td>
    </tr>
{/foreach}

我不知道我是否可以像这里一样反复使用相同的循环变量名称:

// smarty, buggy?
{foreach from=$mcs item=o}
    <tr>
        <td>{$o->title}</td>
        <td><ul>
        {foreach from=$o->artist item=o}
           <li>{$o}</li>
        {/foreach}
        </ul></td>
        <td>{$o->title}</td>
    </tr>
{/foreach}

但我认为内在$ o会覆盖外部$ o

4 个答案:

答案 0 :(得分:1)

PHP本身?

如果我理解正确,您需要此功能

<?php foreach($catalog as $cd): ?>
    <tr>
        <td><?php echo $cd['title'] ?>
        <td><?php echo $cd['artist'] ?>
    </tr>
<?php endforeach ?>

您可以在模板文件中单独使用它,让控制器创建$ catalog数组并将其传递给模板。

答案 1 :(得分:0)

这不仅仅是一个普通的foreach循环吗?因此,例如在Smarty中,等价物将是:

{foreach from=$cds item=cd}
    <tr>
        <td>{$cd->title}</td>
        <td>{$cd->artist}</td>
    </tr>
{/foreach}

所有模板选项和PHP本身都可以做到这一点。

答案 2 :(得分:0)

恕我直言,省略“发明”名称更加令人困惑,因为没有提及数据来自何种范围。这很像PHP中非常滥用的extract()函数,它将数组提取到当前符号表,这使得代码很难管理。

答案 3 :(得分:0)

据我所知,具有此功能的唯一相当流行的开源模板引擎是Dwoo