2015-07-24 6 views
3

В моем приложении Symfony 2 я использую FormBuilder, чтобы создать форму для выбора данных, содержащихся в сгенерированном документе.Добавить класс для выбора опции в Symfony FormBuilder

$typeChoices = [ 
    '001' => 'first factor', 
    '002' => 'another factor', 
    '003' => 'some surcharge', 
    '004' => 'custom discount', 
    '005' => 'another surcharge' 
]; 

$formDownload = $this->createFormBuilder(array()) 
    ->add('category', 'entity', array(
     'class' => 'MyApp\CategoryBundle\Entity\Category', 
     'choice_label' => 'name' 
    )) 
    ->add('type', 'choice', array(
     'choices' => $typeChoices, 
     'multiple' => true 
    )) 
    ->add('download', 'submit', array(
     'attr' => array(
      'class' => 'btn-primary' 
     ), 
    )) 
    ->setAction($this->generateUrl('myapp_data_download')) 
    ->getForm(); 

Данные $typeChoices загружается из EntityRepository - я просто упростил код для этой демонстрации.

Таким образом, избранная окно генерируется так:

<select multiple="multiple" class="form-control" required="required" name="form[type][]" id="form_type"> 
    <option value="001">first factor</option> 
    <option value="002">another factor</option> 
    <option value="003">some surcharge</option> 
    <option value="004">custom discount</option> 
    <option value="005">another surcharge</option> 
</select> 

Как я могу добавить атрибут к каждому optionclass? Он должен быть создан на основе атрибута исходных данных, поступающих из EntityRepository. До сих пор я не мог добавить атрибут class к option с при использовании FormBuilder, и я хотел бы избежать создания разметки формы вручную.

ответ

2

Новые в Symfony 2.7: Choice form type refactorization

В Symfony 2.7 этой формы тип был полностью переработан для поддержки динамической генерации для этикеток, значений, указателей и атрибутов. Это теперь возможно благодаря новой опции choice_label, CHOICE_NAME, choice_value, choice_attr, group_by и choices_as_values ​​.

Вы можете, например, генерировать динамическую метку выбора.

Пример:

$builder->add('attending', 'choice', array(
    'choices' => array(
     'yes' => true, 
     'no' => false, 
     'maybe' => null, 
    ), 
    'choices_as_values' => true, 
    'choice_label' => function ($allChoices, $currentChoiceKey) { 
     return 'form.choice.'.$currentChoiceKey; 
    }, 
)); 

В вашем случае, вы хотите манипулировать класс атрибута каждого варианта.

Пример:

$builder->add('attending', 'choice', array(
    'choices' => array(
     'Yes' => true, 
     'No' => false, 
     'Maybe' => null, 
    ), 
    'choices_as_values' => true, 
    'choice_attr' => function ($allChoices, $currentChoiceKey) { 
     if (null === $currentChoiceKey) { 
      return array('class' => 'text-muted'); 
     } 
    }, 
)); 

Надеется, что это поможет.

1

Добавить Symfony \ Component \ Form \ AbstractType :: finishView в Форме классе

/** 
* @param FormView $view 
* @param FormInterface $form 
* @param array $options 
*/ 
public function finishView(FormView $view, FormInterface $form, array $options) 
{ 
    parent::finishView($view, $form, $options); 

    $additionalAttributes = array(); 

    // myMethod - object method $choice, returns a value that must be replaced by attribute 
    foreach ($view->children['type']->vars['choices'] as $id => $choice) { 
     $additionalAttributes[$id] = array(
      'class' => $this->propertyAccessor->getValue($choice->data, 'myMethod'), 
     ); 
    } 

    foreach ($view->children['type']->children as $id => $child) { 
     $child->vars['attr'] = array_replace(
      isset($child->vars['attr']) ? $child->vars['attr'] : array(), 
      $additionalAttributes[$id] 
     ); 
    } 
} 

Symfony2 Form - adding an attribute to the tag option in the select type

 Смежные вопросы

  • Нет связанных вопросов^_^