Параметры выбора формы symfony2
Я пытаюсь сделать простую форму, чтобы добавить активность с именем и цветом.
Итак, я хочу создать список с каким-то массивом цветов, так как теперь он работает, у меня есть имя цвета.
Я могу добавить любой атрибут в свой тег select:
$form = $this->createFormBuilder($myclass)
->add('Colors','choice',array('label'=>'select some colors',
'multiple'=>true,
'choices'=>array(1=>'red', 2=>'blue', 3=>'green'),
'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata')
));
Результат будет примерно таким:
<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata">
<option value="1">red</option>
<option value="2">blue</option>
<option value="3">green</option>
</select>
Но как я могу добавить selected="selected"
и любой атрибут, который я хочу использовать для своих опций выбора? например:
<select name="select" style="width: 300px;" multiple="multiple" customattr="customdata">
<option style="background-color: #F00;" value="1" selected="selected">red</option>
<option style="background-color: #00F;" value="2" selected="selected">blue</option>
<option style="background-color: #0F0;" value="3">green</option>
</select>
Мой вопрос: как добавить пользовательский attr для тега option
(не для тега select
) с помощью symfony FormBuilder.
УВЕДОМЛЕНИЕ: Я не хочу использовать JavaScript. Я хочу использовать symfony2 FormBuilder для настройки моих опций выбора.
Ответы
Ответ 1
Обычно данные по умолчанию для поля определяются значением, хранящимся в вашем объекте. Например, если
class MyClass
{
private $Colors = array(1, 2);
}
то по умолчанию будут отображаться записи "1" и "2" (с надписями "красный" и "зеленый" ). Вы также можете сохранить это значение в объекте, прежде чем передать его в форму:
$myObject->Colors = array(1, 2);
$form = $this->createFormBuilder($myObject)
...
Последняя возможность заключается в переопределении значения по умолчанию, хранящегося в объекте, путем передачи опции "данные":
$builder->add('Colors', 'choice', array(
'label' => 'select some colors',
'multiple' => true,
'choices' => array(1 => 'red', 2 => 'blue', 3 => 'green'),
'attr' => array('style' => 'width:300px', 'customattr' => 'customdata'),
'data' => array(1, 2),
));
Ответ 2
используйте параметр данных, как описано здесь fo selected = "selected":
http://symfony.com/doc/current/reference/forms/types/field.html
в ур случае может быть как это
$form = $this->createFormBuilder($myclass)
->add('Colors','choice',array('label'=>'select some colors',
'multiple'=>true,
'choices'=>array(1=>'red', 2=>'blue', 3=>'green'),
'attr'=>array('style'=>'width:300px', 'customattr'=>'customdata'),
'data'=> 1
));
новый элемент datastrong > устанавливает номер массива выбора в качестве выбранного атрибута
Ответ 3
Каждый Field
в Symfony наследует от абстрактный тип поля, который имеет T21 > параметр <, в котором вы можете передать параметр по умолчанию.
Кстати, не пропустите style
stuff, а для пользовательских attrs используйте data-*
атрибуты.
Ответ 4
Похоже, Symfony 2.7 добавит поддержку, чтобы сделать это проще:
https://github.com/symfony/symfony/pull/14050
Ответ 5
Добавить в метод класса формы Symfony\Component\Form\AbstractType:: finishView
public function finishView(FormView $view, FormInterface $form, array $options)
{
parent::finishView($view, $form, $options);
$additionalAttributes = array();
// myMethod - method $choice, returns a value that is to be substituted into the attribute
foreach ($view->children['orders']->vars['choices'] as $id => $choice) {
$additionalAttributes[$id] = array(
'data-cost' => $this->propertyAccessor->getValue($choice->data, 'myMethod'),
'disabled' => 'disabled',
);
}
foreach ($view->children['orders']->children as $id => $child) {
$child->vars['attr'] = array_replace(
isset($child->vars['attr']) ? $child->vars['attr'] : array(),
$additionalAttributes[$id]
);
}
}
Symfony2 Form - добавить параметр тега атрибута в поле выбора типа
Ответ 6
Чтобы добавить свой собственный атрибут в выбор, в зависимости от значения этого выбора, рассмотрите возможность использования опции choice_attr
ChoiceType поле.
Например, если вы хотите передать json encoded entity в этот параметр, вы можете использовать что-то вроде этого:
'choice_attr' => function($val, $key) {
return ['data-object' => json_encode($val)];
},