我在网站上使用 .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() ?>
Run Code Online (Sandbox Code Playgroud)
在浏览器上,上面的代码将基本模板中的所有 .twig 代码呈现为浏览器中的文本(即模板引擎不会执行它)。
PS - 是的,我在 app/config/config.yml 中设置了 .twig 和 .php
templating: { engines: ['twig', 'php'] }
Run Code Online (Sandbox Code Playgroud)
好的,这里是“复杂”内容的详细信息......这取自用 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 ?>
Run Code Online (Sandbox Code Playgroud)
复杂的逻辑确实应该放在 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 %}
Run Code Online (Sandbox Code Playgroud)