Symfony在PRE_SUBMIT事件中添加元素以形成集合

时间:2015-01-16 10:11:43

标签: php symfony

有没有办法将元素添加到PRE_SUBMIT eventListner中的表单中的集合字段?

我有这个(form1):

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
        ->add('file',
              'file',
              array(
                    'data_class' => null,
                    'mapped' => false, //il campo non è mappato (il file non è blob ma sta su filesistem)
                    //'constraints' => new NotBlank(),
                    'render_required_asterisk' => true,
              )

        )
        ->add('name',
              'text',
               array(
                    'label' => 'Nome documento',
                    'required' => true,
                    'render_required_asterisk' => true,
                    'mapped' => 'name'
               )
        )
        ->add('document_category',
              'entity',
               array(
                'property' => 'name', //valore da visualizzare nel form 
                'mapped' => 'document_category',
                'class' => 'docliteBundle:Document\documentCategory', //Classe da dove deve prendere i dati
                'multiple' => false, //E' possibile la selezione di un solo campo 
                'expanded' => false, //Per rendere un campo select
                'empty_value' => 'Selezionare una categoria documento', //questo sarà impostato all'inizio ed identifica la voce vuoto
                'label' => 'Categoria documento', //label del campo
                'required' => true, //la selezione del campo è obbligatoria
                'render_required_asterisk' => true, //visualizza asterisco di campo obbligatorio
               )
        )
        ->add('attributes_rel',
                'collection',
                array(
                        'type' => new documentAttributeRelType(),
                        'label' => false,
                        'mapped' => 'attributes_rel',
                        'allow_add' => true,
                        'show_legend' => false,
                        'allow_delete' => true,
                )
        );

documentAttributeRelType(form2):

$builder
        ->add('dynamic_attribute',
              'entity',
               array(
                    'property' => 'name',
                    'class' => 'docliteBundle:Document\dynamicAttribute',
                    'mapped' => 'dynamic_attribute',
                    'multiple' => false,
                    'expanded' => false,
                    'label' => 'Attributo',
                    'required' => true,
                    'constraints' => new NotBlank(),
               )
        )
        ->add('value',
              'choice',
              array(
                'mapped' => 'value',
              )
        )
    ;

在Form1中定义了Listner:

 $builder->get('attributes_rel')->addEventListener(
            FormEvents::PRE_SUBMIT,
            function(FormEvent $event){
                $data = $event->getData();

                $rel = array();
                $rel['dynamic_attribute'] = '1';
                array_push($data, $rel);
                $event->setData($data);
            });

但是这个添加元素没有映射,也没有出现在视图中:

    {% for attribute in form.attributes_rel %}
        <div data-attribute_row>
            {{ form_row(attribute.dynamic_attribute) }}
            {{ form_row(attribute.value) }}
        </div>
    {% endfor %}

1 个答案:

答案 0 :(得分:1)

我认为你可以发现这对你的情况有用,如何在PRE_SUBMIT事件上操作字段选项:

$builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) {
    $data = $event->getData();
    $form = $event->getForm();
    $pageId = $data['page_id'];

    $newOptions = $this->myManager->getPages();

    // change form field
    $form->add('page_id', 'choice', array(
        'label'         => 'Select a page',
        'choices'       => $newOptions,
        'required'      => true,
        'placeholder'   => 'Select a page',
        'attr'          => array('class' => 'form-control')
    ));

    $form->getData()->setPageId($pageId);
});