首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Symfony窗体事件,更改单选按钮上的值

Symfony窗体事件,更改单选按钮上的值
EN

Stack Overflow用户
提问于 2017-02-15 06:09:41
回答 1查看 1.3K关注 0票数 0

我有OutboundInvoice实体的表单,在表单中我有customer选择字段,带有query_builder,当选择客户时,我需要在字段invoicingType中的单选按钮中更改选择数据。怎么能做到这一点呢?

现在我使用symfony form event来更改form invoicing_address 'mapped' => false,中字段的标签,并且工作得很好,对于单选按钮不起作用也是如此

地址已更改,单选按钮仍然没有,为什么?

代码语言:javascript
复制
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中替换的块

代码语言:javascript
复制
        <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

代码语言:javascript
复制
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')
        );
    }
});
});
EN

回答 1

Stack Overflow用户

发布于 2017-09-13 17:01:40

尝试选择with name,并希望它可以工作(但您得到的是一个很长的表单name:):

代码语言:javascript
复制
$('input[type=radio][name="economy_bundle_outbound_invoice[invoicing_address]"]').change(function() {
    // var selectedValue = this.value;
}

然后,您可以switch或简单地if elseif elseif else您的条件。

你可以尝试从Chrome控制台输入选择,然后调用触发器,看看会发生什么。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42237179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档