我想在自定义Symfony 2表单字段类型扩展中使用javascript。所以,我有这样的Twig扩展模板:
{% block some_widget %}
<input ... />
<script src="some.js"></script>
<link href="some.css" />
{% endblock %}
但是我只想让这些脚本和链接标签在我的HTML中出现一次,最好是在head标签中,而不修改基本模板。我试图扩展Twig块,但我无法访问表单模板中的动作模板块。或者像这样:
{# widget tempate #}
{% block some_widget %}
<input ... />
{{ use_javascript('some.js') }}
{{ use_css('some.css') }}
{% endblock %}
{# main action template #}
...
<head>
{{ dump_javascripts() }}
{{ dump_css() }}
</head>
...
如何使用Symfony 2 Forms + Twig做到这一点?
另外,很抱歉我的英语不好。
发布于 2012-07-03 19:51:20
最好的方法是提供css和脚本加载单独的模板。使用自述文件中的注释,所以开发人员唯一必须做的就是
{% block stylesheets %}
{{ parent() }}
include "@MyBestBundle/Resources/view/styles.html.twig"
{% endblock %}
或者尝试使用DI截取表单渲染并添加资产。但如果可能的话,这样做会更加困难。
发布于 2020-05-17 19:50:40
我的方法是创建一个自定义的twig扩展,在其中我将JS添加到缓冲区中,并在表单呈现期间,稍后将其转储到我的布局的末尾。
如下所示:
<?php
namespace AppBundle\Twig;
use Twig\Extension\AbstractExtension;
use Twig\TwigFunction;
class WysiwygExtension extends AbstractExtension
{
/**
* @var array
*
* A pool of elements IDs for Wysiwyg binding.
*/
private $wysiwygElements = [];
/**
* {@inheritdoc}
*/
public function getFunctions()
{
return array(
new TwigFunction('addWysiwygBinding', [$this, 'addWysiwygBinding']),
new TwigFunction('popWysiwygBindings', [$this, 'popWysiwygBindings']),
);
}
public function addWysiwygBinding(string $id): void
{
$this->wysiwyglements[] = $id;
}
public function popWysiwygBindings(): array
{
$elements = array_unique($this->wysiwygElements);
$this->wysiwygElements = [];
return $elements;
}
}
然后是form-fields.html.twig
...
{% block wysiwyg_widget %}
{% apply spaceless %}
{{ form_widget(form) }}
{% do addWysiwygBinding(id) %}
{% endapply %}
{% endblock %}
...
然后是layout.html.twig
<!DOCTYPE html>
<html>
<head>
...
</head>
<body>
...
{% set ids = popWysiwygBindings() %}
{% if ids is not empty %}
{% javascripts
'bundles/admin/plugins/wysiwyg_1.js'
'bundles/admin/plugins/wysiwyg_2.js'
%}
<script type="text/javascript" src="{{ asset_url }}"></script>
{% endjavascripts %}
{% endif %}
{% for id in ids %}
{{ include('_wysiwyg.html.twig', { id: id }) }}
{% endfor %}
</body>
</html>
发布于 2012-04-09 05:17:28
这就是我使用它的方式。希望这就是你要找的。
base.html.twig
<head>
{% block stylesheets %}
css...
{% endblock %}
</head>
foo.html.twig
{% extends '::base.html.twig' %}
{% block stylesheets %}
{{ parent() }}
css that you need in foo.html.twig
{% endblock %}
https://stackoverflow.com/questions/10009352
复制相似问题