我尝试以嵌入形式保存新数据(当我修改时,它可以正常工作),但allow_add不起作用。
当我发送数据抛出原型输入时,请求->请求是:
ads[adsCapPublisher][new_created_0][publisher]:2302
ads[adsCapPublisher][new_created_0][dailyLimit]:2
ads[adsCapPublisher][edit_0][publisher]: 5201
ads[adsCapPublisher][edit_0][dailyLimit]: 5
edit_0 处理得很好,并使用 AdsCapPublisherType 创建了 AdsType,但是当我添加新输入时会抛出 javascript,处理数据时会在 $request->handleRequest() 中失败:
Catchable fatal error: Argument 1 passed to addAdsCapPublisher() must be an instance of AdsCapPublisher, null given in Ads.php on line 721
数据为空。当我将allow_add 设置为 false 时,编辑实体处理良好,但新闻返回表单错误:
this form should not contain extra fields
这是我的课程:
Ads.php
class Ads{
/**
* @ORM\OneToMany(targetEntity="AdsCapPublisher", mappedBy="ad", cascade={"persist", "remove"})
**/
protected $adsCapPublisher;
public function addAdsCapPublisher(AdsCapPublisher $adCapPublisher)
{
$this->adsCapPublisher[] = $adCapPublisher;
return $this;
}
public function removeAdsCapPublisher(AdsCapPublisher $adCapPublisher)
{
$this->adsCapPublisher->removeElement($adCapPublisher);
}
public function getAdsCapPublisher()
{
return $this->adsCapPublisher;
}
public function setAdsCapPublisher($adsCapPublisher)
{
$this->adsCapPublisher = $adsCapPublisher;
return $this;
}
[...]
}
AdsCapPublisher.php
class AdsCapPublisher{
/**
* @var Users
*
* @ORM\ManyToOne(targetEntity="Users", fetch="LAZY")
* @ORM\JoinColumn(name="id_publisher", referencedColumnName="id_user")
*/
protected $publisher;
/**
* @var decimal $dailyLimit
*
* @ORM\Column(name="daily_limit", type="decimal", nullable=false)
*/
protected $dailyLimit;
[...]
}
广告类型.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$entityId= $builder->getData();
$builder->add('adsCapPublisher', 'collection', array(
'type' => new AdsCapPublisherType(),
'required' => false,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false
))
AdsCapPublisherType.php
class AdsCapPublisherType extends AbstractType{
public function buildForm(FormBuilderInterface $builder, array $options)
{
// -- SECTION: General
$builder
->add('publisher', 'hidden', array(
'attr' => array(
'class' => 'js-field-popup-publisher-added'
)))
->add('dailyLimit', 'text', array(
'required' => false,
'attr' => array(
'class' => 'js-field-popup-budget-added form-control k-input-field k-is-input-text k-ellipsis k-has-currency-inside-input',
'min' => 0,
)
));
}
public function getName()
{
return 'adsCapPublisher';
}
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'csrf_protection' => false,
'data_class' => 'Entity\AdsCapPublisher',
'csrf_field_name' => '_token',
'intention' => 'ads',
'translation_domain' => 'ads',
'empty_data' => null
));
}
}
有什么帮助吗? :S