我正在努力找出解决这个问题的最佳方法。我正在查询一个数据库以获得一个值列表,我正在使用该列表创建一个表单字段。然而,实际上,它将创建大约12个<input type="checkmark" />
标签。我需要为每个复选标记(实际上是与之相关的标签)提供一个同样来自数据库的图像URL。
如果我只是通过创建一个Form Extension来单独渲染每个<input />
,这似乎是小菜一碟。我并不是单独构建它们,而且循环遍历一个数组(Propel会提供)来构建所需的复选框似乎是不对的,即使我是这样做的。
Propel model
表单字段类型很容易使用,但会将image
列数据直接传递到标签中,这是完全不切实际的。它将标签变成一个类似的字符串(分解字符串似乎也不是一个好的选择):
Label => "
ID: 2
Title: Label of Checkmark
Parent ID: null
Image: ek9dkB.jpeg"
那么,将参数传递给每个子项以便在fields.html.twig
中访问它的最佳方式是什么呢?
相关表单生成器(PictureCheckbox
是我的自定义字段类型,因此它将呈现自定义Twig表单模板):
$builder->add('skills', new PictureCheckbox(), array(
'choices' => $choices,
'required' => true,
'label' => 'What are your skills?',
'multiple' => true,
'expanded' => true,
));
我也使用了上面的模型类型,它在风格上非常相似,但想法是一样的。
这是field.html.twig
,我在其中创建了一个新的表单类型。{%block picture_checkbox_widget%}
{% if expanded %}
{% for child in form.children %}
{% spaceless %}
<label for="{{ id }}">
{# Most of this would change, but is here for example: #}
{{ form_label(child.label) }}
{% set file = path.from.child %}
<img src="{{ asset('uploads' ~ file) }}" alt="Test Image" />
</label>
{% endspaceless %}
{% endfor %}
<input type="checkbox" id="{{ id }}"{{ block('widget_attributes') }}{% if value is defined %} value="{{ value }}"{% endif %}{% if checked %} checked="checked"{% endif %} />
{% endif %}
{% endblock %}
我正在使用带有Propel的Symfony 2(.6)作为ORM。如果我错过了相关内容,我很乐意添加信息。
也许choice_list
是我的答案?但似乎有一种方法可以在我转储子项时将一个变量添加到我看到的列表中:{% dump(child) %}
。
我相信我已经找到了答案。我构建了一个ChoiceList
,并添加了图像和标题。我相信还有更好的方法,但它似乎工作得很好,而且从图像无论如何都在<label />
中的角度来看似乎是合乎逻辑的,所以将其作为label
的一部分来交付是很自然的。
当我有更多的时间时,我会尝试更新细节。