代码之家  ›  专栏  ›  技术社区  ›  Kamil Szot

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

  •  1
  • Kamil Szot  · 技术社区  · 14 年前

    这个问题和这个有关 Is there anything like Dwoo-s {with} or {loop} in Smarty 3 or earlier?

    基本上,我希望从XSLT模板中获得类似current node的内容。

    在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]/artist(当然还有[2],[3]。。。如果有更多的cd-s等)

    当前上下文中字段名被理解时,每个块的内部都会发生变化。

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

    // 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 回复  |  直到 7 年前
        1
  •  1
  •   Manos Dilaverakis    14 年前

    PHP本身?

    如果我理解正确,你需要这个功能

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

        2
  •  0
  •   Tim Fountain    14 年前

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

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

    全部的 模板选项和PHP本身可以做到这一点。

        3
  •  0
  •   joe    14 年前

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

        4
  •  0
  •   Kamil Szot    14 年前

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