2015-01-16 2 views
0

Есть ли способ добавить элемент в поле коллекции в форме в eventListner PRE_SUBMIT?Элемент добавления Symfony для формирования коллекции в событии PRE_SUBMIT

У меня это (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 определяется Читающий мысли:

$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 %} 
+0

Да, и, как вы уже, кажется, знают, что вам нужно событие PRE_SUBMIT, я полагаю, что вы на самом деле зациклились на чем-то более конкретном? Прочитано http://symfony.com/doc/current/components/form/form_events.html#submitting-a-form-formevents-pre-submit-formevents-submit-and-formevents-post-submit И для более практичный aproach, посмотрите на это: http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html И если у вас все еще есть проблемы, пожалуйста, будьте более конкретными в своем вопросе. –

+0

точно, Форма имеет коллекцию полей, состоящую из объекта и значения. Событие Pre_submit добавит элемент в эту коллекцию. Как вы можете видеть в приведенном ниже примере, если вы вручную добавите элемент в массив: Событие PRE_SUBMIT правильно добавлено третьим элементом Событие SUBMIT не отображается на третий элемент, поэтому я не вижу его в форма. Я не знаю, был ли я чист. Спросите меня, у вас ли ультерирори сомнения. Спасибо за доступность. –

+0

Наконец-то я решаю это !!!!! Чтобы установить fileld коллекцию в eventLister, данные должны быть установлены в PRE_SUBMIT, но не в сущности, непосредственно в связи с: $ builder-> addEventListener ( \t \t FormEvents :: PRE_SUBMIT, \t \t функция (FormEvent $ событие) { \t \t \t $ d = $ событийно> GetData(); \t \t \t $ d [ 'attributes_rel'] = массив ( \t \t \t \t \t массив ('dynamic_attribute' => 2), \t\t \t \t массив ('dynamic_attribute' => 3), \t \t \t \t \t массив ('dynamic_attribute' => 1), \t \t \t); \t \t \t $ event-> setData ($ d); }); –

ответ

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); 
}); 
+0

спасибо, но в моем случае у меня есть поле коллекции, уже установленное в форме.Должен ли я добавить элемент в эту коллекцию динамически без использования какой-либо кнопки в клиенте. Спасибо I –

+0

Используйте POST_SET_DATA событие для добавления нового элемента после того, как по умолчанию уже установлены –

+0

Прошу прощения, но мне нужно добавить этот новый элемент в один из PRE_SUBMIT, SUBMIT или POST_SUBMIT, потому что это зависит от поля document_category. На мой взгляд, я уже сделал вызов ajax, когда значение категории изменилось, но если я изменю любое значение для объекта в POST_SUBMIT, это измененное значение не появится в представлении. –

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