2017-02-14 2 views
0

Ich habe Formular für OutboundInvoice Einheit, in Form I customer Auswahlfeld haben, mit query_builder und wenn wählen Kunde Ich brauche invoicingType in Feldauswahldaten in Schaltfläche Radio ändern. Wie kann man es machen?Symfony Formularereignis, Änderungswert auf Optionsfeld

Jetzt symfony Formularereignis für Änderungskennzeichen für Feld invoicing_address'mapped' => false, in Form und funktionieren, die gleiche Entscheidung für Radioknopf nicht funktionieren

enter image description here

enter image description here

Adresse geändert ich verwenden, Optionsfeld noch keiner, warum?

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'; 
} 

Vorlage und Block, die

in js ersetzen
 <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> 

diese meine js wo html ersetzt mit durch das Element

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') 
     ); 
    } 
}); 
}); 

Antwort

0

Versuchen mit Namen auszuwählen, und hoffen, dass es funktioniert (aber du hast einen langen langen Formularnamen :)):

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

Dann können Sie switch oder einfach if elseif elseif else Ihre Bedingungen.

Sie können Auswahleingaben über die Chrome-Konsole und Anrufauslöser ausprobieren und sehen, was passiert.

Verwandte Themen