Symfony3 添加集合表单上的索引错误



我在FOSUser中添加了一些自定义字段。我向用户添加了一个名为"客户"的实体,其中包含电话号码地址的集合。

我有允许添加电话号码和地址字段的javascript代码。添加的新索引是错误的,并且遵循我收藏的字段编号。

我的电话号码有 2 个字段,因此新索引从 2 开始。我的地址集合中有 7 个字段,新索引从 7 开始。

最后,我的新集合不在请求中。为什么我的索引遵循集合表单中的字段数?

这是我的表单类型:

class ProfileType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('customer', CustomerType::class,array(
        'label'=>'sitebundle.customer',
        'by_reference'=>false,
    ));
    $builder->remove('plainPassword');
}
public function getParent()
{
    return 'FOSUserBundleFormTypeRegistrationFormType';
}
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'AppBundleEntityUser'
    ));
}
}

客户类型:

class CustomerType extends AbstractType
{
 public function buildForm(FormBuilderInterface $builder, array                         $options)
{
    $builder
        ->add('lastName',null,array(
            'required' => true,
            'label'=>'sitebundle.lastname'
        ))
        ->add('firstName',null,array(
            'label'=>'sitebundle.firstname',
            'required' => true
        ))
        ->add('companyName',null,array(
            'required' => false,
            'label'=>'sitebundle.companyname'
        ))
        ->add('phonenumbers', CollectionType::class, array(
            'label'=>'sitebundle.phonenumbers',
            'mapped'=>true,
            'allow_add'=>true,
            'required' => true,
            'allow_delete' => true,
            'delete_empty' => true,
            'by_reference' => false,
            'entry_type'   => PhoneNumberType::class
        ))

        ->add('addresses', CollectionType::class, array(
            'label'=>'sitebundle.addresses',
            'mapped'=>true,
            'allow_add'=>true,
            'required' => true,
            'allow_delete' => true,
            'delete_empty' => true,
            'by_reference' => false,
            'entry_type'   => AddressType::class
        ))
    ;
}
/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
       # 'validation_groups' => array('registration'),
        'data_class' => 'LilWorksStoreBundleEntityCustomer'
    ));
}

}

电话号码类型和地址类型:

class PhoneNumberType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('phonenumber',null,array(
                'label'=>'sitebundle.phonenumber',
                'required' => true
            ))
            ->add('description',null,array(
                'label'=>'sitebundle.description',
            ))
        ;
    }
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'LilWorksStoreBundleEntityPhoneNumber'
        ));
    }
    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'lilworks_storebundle_phonenumber';
    }

}

class AddressType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name',null,array(
                'label'=>'sitebundle.address.name',
            ))
            ->add('street',null,array(
                'label'=>'sitebundle.address.street',
            ))
            ->add('complement',null,array(
                'label'=>'sitebundle.address.complement',
            ))
            ->add('zipCode',null,array(
                'label'=>'sitebundle.address.zipcode',
            ))
            ->add('city',null,array(
                'label'=>'sitebundle.address.city',
            ))
            ->add('country', EntityType::class, array(
                'label'=>'sitebundle.address.country',
                'class'    => 'LilWorksStoreBundle:Country' ,
                'choice_label' => function ($obj) { return   $obj->getName() ; },
                'required' => true ,
                'mapped'=> true,
                'expanded' => false ,
                'multiple' => false
            ))
            ;
    }
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'LilWorksStoreBundleEntityAddress'
        ));
    }
    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'lilworks_storebundle_address';
    }

}

您可能正在使用此文档。我和你有同样的问题。我的解决方案是通过其他方式计算指数。

在我的 javascript 函数中,我有一个控制原型数量的"索引"变量,然后我将该变量传递给所有原型,以便下次在添加或 del 时重新计算。

$addTelefono.on('click', function (e) {
                e.preventDefault();
                var prototype = $('#render-telefonos').attr('data-prototype');
                var index = parseInt($render_tel.attr('index'));
                var newForm = prototype.replace(/__name__/g, index).replace(/label__/g, '');
                $render_tel.attr('index', index + 1);
                $toRenderTel.append('<div class="row"></div>');
                $toRenderTel.append($('<h3 class="form-section">Nuevo teléfono <button class="btn red btn-xs delete-tel" type="button">Eliminar</button></h3>'))
                $toRenderTel.append(newForm);
                SGIPI.manageFormControl();
            });

在此之前,您需要为集合渲染分配一个索引属性,如下所示:

$render_dir.attr('index', $render_dir.find(':input').length);

你可以使用你自己的逻辑,比如放一个特定的attr来找()。

希望对你有帮助...

最新更新