【问题标题】:Include a .twig base template in a .php template在 .php 模板中包含 .twig 基本模板
【发布时间】:2012-02-09 23:02:29
【问题描述】:

我在网站上使用 .twig 模板,但是我需要非常巧妙地处理一些视图的逻辑。我不认为 twig 可以处理这个问题,而且它在 PHP 中是小菜一碟。 (我不打算解释它的细节,只知道它在 PHP 中很容易,而且我实际上已经有了代码)。问题是,我可以在 .twig 类型的基础模板或父模板中包含 .PHP 模板吗?

下面的示例(不起作用) - blah.html.php 是扩展 base.html.twig 模板的模板...

/some/web/directory/bundlename/Resources/views/blah/blah.html.php

<?php $view->extend('::base.html.twig') ?>

<?php $view['slots']->set('title', 'Welcome to nowhere!') ?>

<?php $view['slots']->start('body') ?>

    <div id="body">
        html stuff here, blah blah blah...
        <?php .... ?>
            complex php and html stuff, and so on...
        </php end....?> 
        you get the idea...
    </div>

<?php $view['slots']->stop() ?>

在浏览器上,上面的代码将基础模板中的所有 .twig 代码呈现为浏览器中的文本(即它不会被模板引擎执行)。

PS - 是的,我在 app/config/config.yml 中同时设置了 .twig 和 .php

templating:      { engines: ['twig', 'php'] }

好的,这里是“复杂”内容的详细信息... 这是取自在 Symfony 1.4 中编码的站点版本 - 它正在升级到 Symfony 2,我们希望使用所有 .twig

<?php foreach ($all_items as $item): ?>
<tr>
    <td valign="top">
        //<?php include_partial('global/item', array('item' => $item)) ?>

 <<< some code snipped out here >>>

    <td valign="top">
        <table border="1" width="100%">
        <?php echo $form->renderFormTag('memberitems/additem') ?>
        <?php echo $form['item_id']->render(array('value' => $item->getIid())) ?>
        <?php echo $form['user_id']->render(array('value' => 1)) ?>
        <?php echo $form['_csrf_token'] ?>
            <tr>
                <td width="50" colspan="2" align="center">Quantity<br><?php echo $form['quantity']->render() ?></td>
                <td width="50" colspan="2" align="center">Amount<br><?php echo $form['value']->render() ?></td>
                <td width="50" colspan="2" align="center"><input type="submit" value="Add"></td>
            </tr>
        </form>

    <<< here is a complex portion, we're declaring a variable with a value >>>
    <<< cant do this with twig - from what I know... >>>

        <?php // determine if item is in registry - if so display "Currently Asking For:" ?>
        <?php $is_in_registry = false; ?>
        <?php foreach($member_items as $m_item): ?>
        <?php   if($m_item->getIid() == $item->getIid()): ?>
        <?php       if($is_in_registry == false): ?>
        <?php           $is_in_registry = true; ?>
                        <tr>
                            <td width="50" colspan="6" align="center"><br>Currently Asking For:</td>
                        </tr>
        <?php       endif ?>

        <?php echo $form->renderFormTag('memberitems/removeitem') ?>
        <?php echo $form['item_id']->render(array('value' => $item->getIid())) ?>
        <?php echo $form['user_id']->render(array('value' => 1)) ?>
        <?php echo $form['id']->render(array('value' => $m_item->getMIid())) ?>
        <?php echo $form['_csrf_token']->render() ?>

                        <tr>
                            <td width="50" colspan="4" align="center">
                                <?php echo $m_item->getMIqty()." @ ".$m_item->getMIval() ?>
                            </td>
                            <td width="50" colspan="2" align="center"><input type="submit" value="Remove"></td>
                        </tr>
                    </form>
        <?php   endif ?>
        <?php endforeach ?>

【问题讨论】:

  • 什么复杂的东西?你可以把它放在树枝函数或宏上。
  • Carlosz - 我已经用复杂的东西的一些细节更新了这个问题......这只是我所说的复杂的一个例子,我所说的复杂是指复杂的 .twig 因为我不认为twig 旨在处理这样的逻辑。 (我可能是错的)。

标签: php symfony twig


【解决方案1】:

复杂的逻辑真的应该放在 Symfony2 的服务层。对于所有不熟悉 PHP 的开发人员(例如前端开发人员),模板应该看起来干净整洁。

但是,我在该模板中没有看到任何无法在 Twig 中完成的内容。这是用 Twig 编写的用于证明这一点的棘手部分:

{% set is_in_registry = false %}
{% for m_item in member_items %}

    {% if m_item.getIid == item.getIid %}
        {% if is_in_registry is false %}
            {% set is_in_registry = true %}
            <tr>
                {# you should use css for styling the td #}
                <td width="50" colspan="6" align="center"><br />Currently asking for:</td>
            </tr>
        {% endif %}

        {{ form.renderFormTag('memberitems/removeitem') }}
        {{ form.item_id.render({ value: item.getIid }) }}
        {{ form.user_id.render({ value: 1 }) }}
        {{ form.id.render({ value: m_item.getMIid }) }}
        {{ form._csrf_token.render }}

        <tr>
            <td width="50" colspan="4" align="center">
                {{ m_item.getMIqty ~ ' @ ' ~ m_item.getMIval }}
            </td>
            <td width="50" colspan="2" align="center"><input type="submit" value="Remove"></td>
        </tr>
        {# didn't notice your form opening tag. I'm assuming you're dynamically generating it #}
        </form>
    {% endif %}
{% endfor %}

【讨论】:

  • gilden - 感谢您提供上面的代码!我完全同意“棘手”的东西甚至不应该出现在视图中。我不知道 twig 能够声明变量,这可能会解决 90% 的复杂代码。稍后我应该能够将另外 10% 的部分移出并投入服务。
  • @CocoaNoob Twig 非常强大,并且提供的可扩展性确实没有限制。以防万一您还没有这样做,我建议您阅读(非常短的)manual 以充分利用 Twig。
  • 会做 - 我阅读了 symfony.com 网站 (symfony.com/doc/current/book/templating.html) 上的简短介绍,但没有阅读 (twig.sensiolabs.org) 上的信息。接下来就是了!再次感谢!
猜你喜欢
  • 2012-12-25
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 2016-02-10
  • 1970-01-01
  • 2015-03-06
  • 1970-01-01
相关资源
最近更新 更多