symfony3 在添加 collection 表单时索引错误
symfony3 wrong index on add collection form
我在 FOSUser 中添加了一些自定义字段。
我向我的用户添加了一个名为 Customer 的实体,其中包含 collection 个 Phonenumbers 和 Addresses.
我有允许添加电话号码和地址字段的 javascript 代码。新加的索引是错误的,按照我的collection.
的字段数
我的电话号码有 2 个字段,所以新索引从 2 开始。我的地址有 7 个字段 collection,新索引从 7 开始。
最后,我的新 collection 没有出现在请求中。为什么我的索引遵循 collection 表单中的字段数?
这是我的表单类型:
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 'FOS\UserBundle\Form\Type\RegistrationFormType';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User'
));
}
}
客户类型:
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' => 'LilWorks\StoreBundle\Entity\Customer'
));
}
}
电话号码类型和地址类型:
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' => 'LilWorks\StoreBundle\Entity\PhoneNumber'
));
}
/**
* {@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' => 'LilWorks\StoreBundle\Entity\Address'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'lilworks_storebundle_address';
}
}
您可能正在使用这个 doc。我和你有同样的问题。我的解决方案是通过其他方式计算索引。
在我的 javascript 函数中,我有一个 "index" 变量来控制原型的数量,然后我将该变量传递给所有原型,以便下次在添加或删除时重新计算。看看...
$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);
您可以使用自己的逻辑,例如稍后将特定属性添加到 find()。
希望对您有所帮助...
我在 FOSUser 中添加了一些自定义字段。 我向我的用户添加了一个名为 Customer 的实体,其中包含 collection 个 Phonenumbers 和 Addresses.
我有允许添加电话号码和地址字段的 javascript 代码。新加的索引是错误的,按照我的collection.
的字段数我的电话号码有 2 个字段,所以新索引从 2 开始。我的地址有 7 个字段 collection,新索引从 7 开始。
最后,我的新 collection 没有出现在请求中。为什么我的索引遵循 collection 表单中的字段数?
这是我的表单类型:
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 'FOS\UserBundle\Form\Type\RegistrationFormType';
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'AppBundle\Entity\User'
));
}
}
客户类型:
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' => 'LilWorks\StoreBundle\Entity\Customer'
));
}
}
电话号码类型和地址类型:
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' => 'LilWorks\StoreBundle\Entity\PhoneNumber'
));
}
/**
* {@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' => 'LilWorks\StoreBundle\Entity\Address'
));
}
/**
* {@inheritdoc}
*/
public function getBlockPrefix()
{
return 'lilworks_storebundle_address';
}
}
您可能正在使用这个 doc。我和你有同样的问题。我的解决方案是通过其他方式计算索引。
在我的 javascript 函数中,我有一个 "index" 变量来控制原型的数量,然后我将该变量传递给所有原型,以便下次在添加或删除时重新计算。看看...
$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);
您可以使用自己的逻辑,例如稍后将特定属性添加到 find()。
希望对您有所帮助...