我要修改radio_widget
,并希望<label>
和<input>
提供相同的 ID ,这应该是唯一< / strong>每对。
目前我正在使用random(),但我更喜欢内部计数器,例如{{loop.index}}
(Twig: for),以避免冲突。
{% block radio_widget -%}
{% set id = random() %}
<div class="radio">
<label for="radio_{{ id }}">Label for {{ id }}</label>
<input type="radio" id="radio_{{ id }}" {# ...#}/>
</div>
{%- endblock radio_widget %}
有谁知道更好的解决方案?
提前致谢!
答案 0 :(得分:1)
ProjectTwigExtension.php
class ProjectTwigExtension extends Twig_Extension {
public function getFunctions() {
return array(
new Twig_SimpleFunction('get_unique_key', array($this, 'getUniqueKey')),
);
}
private $keys = array();
/**
* Create an unique HTML identifier for a form element
*
* @param $name String to make unique
*
* @returns String
*/
public function getUniqueKey($name) {
if (!in_array($name, $this->keys)) {
$this->keys[] = $name;
return $name;
}
$i = 0;
while(in_array($name.++$i,$this->keys)) {}
$this->keys[] = $name.$i;
return $name.$i;
}
public function getName() {
return 'ProjectTwigExtension';
}
}
的config.php
$twig = new Twig_Environment($loader);
$twig->addExtension(new ProjectTwigExtension());
template.twig
{% block radio_widget -%}
{% set id = get_unique_key('radio_') %}
<div class="radio">
<label for="{{ id }}">Label for {{ id }}</label>
<input type="radio" id="{{ id }}" {# ...#}/>
</div>
{%- endblock radio_widget %}
答案 1 :(得分:1)
可能你可以尝试这样的事情:
{% block radio_widget -%}
{% if counter is defined %} {# set desired id #}
{% set id = counter %}
{% else %}
{% set id = random() %} {# default value #}
{% endif %}
<div class="radio">
<label for="radio_{{ id }}">Label for {{ id }}</label>
<input type="radio" id="radio_{{ id }}" {# ...#}/>
</div>
{%- endblock radio_widget %}
使用示例:
{% for i in 0..10 %}
{% set counter = loop.index %}
{{- block('radio_widget') }}
{% endfor %}
答案 2 :(得分:1)
对于每个表单小部件,已经存在预先计算的唯一ID。
请参阅:\Symfony\Component\Form\Extension\Core\Type\BaseType::buildView
在twig中,可以通过{{ form.vars.id }}
访问此ID。
本质上,id只是嵌套表单类型名称的串联。
请注意,form.vars
通常包含您需要进行表单自定义的所有有用的内容。在使用FormTypeInterface::buildView
或FormTypeInterface::finishView
将数据传输到表单呈现时,它也是放置自定义值的地方。