РЕДАКТИРОВАТЬ : насколько я понимаю, передача array('attr' => array('myattr1' => 'value1'))
в качестве опции для компоновщика предназначена для общих атрибутов компоновщика и всех его дочерних элементов . Вот почему, например, передача array('required' => false)
на уровне формы отключит встроенную проверку HTML5 на стороне клиента для каждого поля внутри этой формы.
(всегда в поисках лучшего решения) я опубликую свой путь, вдохновленный этим сообщением в блоге : настраиваемым полем формы с атрибутами просмотра и Блок Twig для создания новых атрибутов.
class TypeheadType extends AbstractType
{
public function buildForm(FormBuilder $builder, array $options)
{
$builder
->setAttribute('mode', $options['mode'])
->setAttribute('items', $options['items']);
}
public function buildView(FormView $view, FormInterface $form)
{
$view
->set('mode', $form->getAttribute('mode'))
->set('items', $form->getAttribute('items'));
}
public function getDefaultOptions(array $options)
{
return array(
'mode' => 'single',
'items' => 10
);
}
public function getName() { return 'typehead'; }
public function getParent(array $options) { return 'field'; }
}
Новый тип формы должен быть зарегистрирован как сервис, а псевдоним должен совпадать с тем, что возвращается getName()
(это обязательно? Dunno ...):
form.type.typehead:
class: Acme\HelloBundle\Form\Type\TypeheadType
tags:
- { name: form.type, alias: typehead }
Создание нового поля (в другом месте):
$builder->add('myfield', 'typehead', array('items' => 15));
В блоке виджетов темы формы Twig (шаблон для имени as getName() . '_widget
) вы можете использовать атрибуты вида, установленные в TypeheadType
:
{% block typehead_widget %}
{% spaceless %}
<input type="text" {{ block('widget_attributes') }}
{% if value is not empty %}value="{{ value }}" {% endif %}
data-items="{{ items }}" data-mode="{{ mode }}" />
{% endspaceless %}
{% endblock typehead_widget %}
И, наконец:
{{ form_row(form.myfield) }}