2017-02-14 2 views
0

У меня есть форма для OutboundInvoice лица, в форме у меня есть customer поле выбора, с query_builder и когда выбор клиента мне нужно изменить выбор данных в радио-кнопки в поле invoicingType. Как это сделать?Symfony форма события, изменить значение на радио кнопке

Теперь я с помощью Symfony формы события для этикетки изменения для поля invoicing_address'mapped' => false, в форме и работать нормально, то же самое решение для радио-кнопки не работает

enter image description here

enter image description here

адрес изменен, переключатель все еще нет, почему?

class OutboundInvoiceForm extends AbstractType 
{ 
/** 
* @param FormBuilderInterface $builder 
* @param array $options 
*/ 
public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('customer', 'entity', array(
      'class' => Customer::class, 
      'property' => 'name', 
      'empty_value' => 'Choice Customer', 
      'query_builder' => function ($repository) { 
       /** @var CustomerRepository $repository */ 
       return $repository->getAllQuery(); 
      }, 
      'required' => true 
     )); 

     $formModifier = function (FormInterface $form, Customer $customer = null) { 
     if (null === $customer) { 
      $positions = '-'; 
      $label = $positions; 
      $invoicingType = null; 
     } else { 
      $positions = $customer->getInvoicingAddress() 
       ? $customer->getInvoicingAddress()->getFormattedAddress() 
       : '-'; 
      $label = $positions; 
      $invoicingType = $customer->getInvoicingType() 
       ? $customer->getInvoicingType() 
       : null; 
     } 

     $form 
      ->add('invoicingType', 'entity', array(
       'class' => InvoicingType::class, 
       'property' => 'name', 
       'data' => $invoicingType, 
       'query_builder' => function ($repository) { 
        /** @var InvoicingTypeRepository $repository */ 
        return $repository->getAllQuery(); 
       }, 
       'required' => false, 
       'expanded' => true, 
      )) 
      ->add('invoicing_address', TextType::class, [ 
       'mapped' => false, 
       'empty_data' => $positions, 
       'label' => $label 
      ]); 

    }; 

    $builder->addEventListener(
     FormEvents::PRE_SET_DATA, 
     function (FormEvent $event) use ($formModifier) { 
      $data = $event->getData(); 
      $formModifier($event->getForm(), $data->getCustomer()); 
     } 
    ); 

    $builder->get('customer')->addEventListener(
     FormEvents::POST_SUBMIT, 
     function (FormEvent $event) use ($formModifier) { 
      $customer = $event->getForm()->getData(); 
      $formModifier($event->getForm()->getParent(), $customer); 
     } 
    ); 
    $builder 
     ->add('message') 
     ->add('notes'); 
} 

/** 
* @param OptionsResolverInterface $resolver 
*/ 
public function setDefaultOptions(OptionsResolverInterface $resolver) 
{ 
    $resolver->setDefaults(array(
     'data_class' => OutboundInvoice::class, 
     'csrf_protection' => false, 
     'edit' => false, 
     'terms_edit_data' => 0 
    )); 
} 

/** 
* @return string 
*/ 
public function getName() 
{ 
    return 'economy_bundle_outbound_invoice'; 
} 

шаблон, и блок, который заменит в JS

 <div id="invoicing-address-container" class="form-group"> 
     invoicing_address <br> 
     <label for="customer-address-id"> 
      {{ form_label(form.invoicing_address)}} 
     </label> 
     <div id="customer-address-container" style="display: none;"> 
      {{ form_widget(form.invoicing_address) }} 
     </div> 
     <br> 
     <label for="reversed-vat"> 
      {{ form_label(form.invoicingType, 'invoicing_type*')}} 
     </label> 
     {{ form_widget(form.invoicingType) }} 
    </div> 

это мои Js где замененные HTML с помощью элемента

var $customer = $('#economy_bundle_outbound_invoice_customer'); 

$customer.change(function() { 
var $form = $(this).closest('form'); 
var data = {}; 
data[$sport.attr('name')] = $sport.val(); 
$.ajax({ 
    url : $form.attr('action'), 
    type: $form.attr('method'), 
    data : data, 
    success: function(html) { 
     $('#invoicing-address-container').replaceWith(
      $(html).find('#invoicing-address-container') 
     ); 
    } 
}); 
}); 

ответ

0

Try выбрать с именем, и надеюсь, что он работает (но у вас длинное название формы:)):

$('input[type=radio][name="economy_bundle_outbound_invoice[invoicing_address]"]').change(function() { 
    // var selectedValue = this.value; 
} 

Тогда вы можете switch или просто if elseif elseif else ваши условия.

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

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