[英]Symfony2 collection Form uniquenes
我有一个symfony2主窗体,其中的字段是其他字段的集合类型,例如具有多个Tag的Product实体,但是这些标签具有唯一的哈希。 在主窗体上附加了一个eventListener。 如果我将数据发送到表单,并且将Tag和这个唯一的has一起发送,则该类的唯一约束将说该字段必须是唯一的。 这项工作很好,但是在此EventListener中,我正在数据库中搜索该唯一字段,如果正确,则进行分配,然后用数据库中的实体替换帖子内容。
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('eventDate', 'datetime',array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
'invalid_message' => 'Wrong datetime format. Please use like this: 2015-09-20 14:45:12',
))
->add('eventEnds', 'datetime', array(
'widget' => 'single_text',
'format' => 'yyyy-MM-dd HH:mm',
'invalid_message' => 'Wrong datetime format. Please use like this: 2015-09-20 14:45:12',
))
->add('tag','collection', array(
'type' => new TagType(),
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'prototype' => true,
'property_path' => 'professional',
'label' => false,
'options' => array(
'professional' => true,
),
))
->addEventListener(FormEvents::SUBMIT, [$this, 'submit'])
;
}
public function preSubmit(FormEvent $event)
{
/** @var MainForm $data */
$data = $event->getData();
foreach ($data->getTags() as $tag) {
if ($tag->getId() == null && $tag->getHash()){
$tagDB = $this->entityManager
->getRepository('ApplicationBundle:Tag')
->findOneBy([
'hash' => $professional->getHash(),
]);
if ($tagDB) {
$data->removeTag($tag);
$data->addTag($tagDB);
}
}
}
$event->setData($data);
}
如果我将$ data值转储到setData之后,则可以看到数据库中的实体,但是仍然出现“唯一”验证错误,并且我检入了验证器,symfony传递了原始POST内容。
为什么会这样,我该如何解决呢?
应该
->addEventListener(FormEvents::PRE_SUBMIT, [$this, 'submit'])
( PRE_SUBMIT
而不是SUBMIT
)
您的代码应类似于:
public function preSubmit(FormEvent $event)
{
/** @var MainForm $data */
$data = $event->getData();
$num = count($data['tag']);
for ($i=0;$i<$num;$i++) {
$tag = $data['tag'][$i];
if (!isset($tag['id']) && isset($tag['hash'])){
$tagDB = $this->entityManager
->getRepository('ApplicationBundle:Tag')
->findOneBy([
'hash' => $tag['hash'],
]);
if ($tagDB) {
unset($data['tag'][$i]);
$data['tag'][$i] = array (
'id' => $tagDB->getId();
'hash' => $tagDB->getHash();
);
}
}
}
$event->setData($data);
}
不确定代码是否100%正确,因为我无法对其进行测试,但是您明白了。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.