有可能做我想做的事吗?
我知道如何创建表单字段:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('field', null, array_of_options)
;
}
add method
的第三个参数是一系列预定义的选项,例如:label
,attr
等......如果您执行以下操作:
$builder
->add('field', null, array('my_option' => 'my value'));
你会收到这个错误:
The option "my_option" does not exist. Known options are: "action", "attr", "auto_initialize", "block_name", "by_reference", "cascade_validation", "compound", "constraints", "csrf_field_name", "csrf_message", "csrf_protection", "csrf_provider", "data", "data_class", "disabled", "empty_data", "error_bubbling", "error_mapping", "extra_fields_message", "grouping", "inherit_data", "intention", "invalid_message", "invalid_message_parameters", "label", "label_attr", "mapped", "max_length", "method", "pattern", "post_max_size_message", "precision", "property_path", "read_only", "required", "rounding_mode", "translation_domain", "trim", "validation_groups", "virtual"
我已经阅读并了解this,但这不是我想要的。我不想从控制器传递createForm
方法中的选项。
我想要的是为option
中第三个参数的数组创建自定义add method
。
对不起,如果我不清楚的话!
答案 0 :(得分:3)
我已经解决了这个问题。
首先,要回答@ hcoat的评论,我想为custom options
提供3 open_col
(close_col
,col_dims
,form theming
)。我在attr
选项中传递了它们:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('field1', null, array('attr' => array('open_col' => true, 'col_dims' => '2-8')))
->add('field2', null, array('attr' => array('close_col' => true, 'col_dims' => '6-8')))
;
}
并检索这些选项值:
{% block form_row %}
{% spaceless %}
{% set open_col, close_col = 'open_col', 'close_col' %}
{% if open_col in attr|keys %}
<div class="mws-form-row">
<div class="mws-form-cols">
<div class="mws-form-col-{{ (open_col in attr|keys) ? attr['col_dims']:'4-8' }}">
{% elseif close_col in attr|keys %}
<div class="mws-form-col-{{ (open_col in attr|keys) ? attr['col_dims']:'4-8' }}">
{% else %}
<div class="mws-form-row">
{% endif %}
{{ form_label(form) }}
<div class="mws-form-item">
{{ form_widget(form) }}
</div>
{% if close_col in attr|keys %}
</div>
</div>
</div>
{% elseif open_col in attr|keys %}
</div>
{% else %}
</div>
{% endif %}
{% endspaceless %}
{% endblock form_row %}
一切正常!
答案 1 :(得分:2)
我认为你的解决方案并不完美。当然它可以工作,但你应该考虑另一个解决方案。
您应该使用选项解析器,它允许您添加自己的属性。 http://symfony.com/doc/current/components/options_resolver.html
因此,在formType类中,您应该添加以下方法:
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(
array(
'my_option' => 'my_default_value',
)
);
}
然后你可以在twig模板中获得这个属性:
{{ my_option }} //it return"my_defaul_value"
{{ form.your_field_name.my_option }} //it retun your field value