我有一份文件
/**
* @ODM\Document
*/
class Result
{
/**
* @var int $id
* @ODM\Id
*/
protected $id;
/**
* @var string $name
* @ODM\Field(type="string")
*/
protected $name;
/**
* @var UserComment[] $userComments
* @ODM\EmbedMany(targetDocument="UserComment")
*/
protected $userComments;
}
/** @ODM\EmbeddedDocument() */
class UserComment {
public $addedBy;
public $createdAt;
public $comment;
}我想创建一个表单,允许我添加新的用户评论。但它只有作为TextAreaType的$comment。其他2个字段应自动添加。
我使用的集合类型是这样的:
class ResultForm extends AbstractType
{
/**
* buildForm
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('userComments', CollectionType::class, [
'entry_type' => UserCommentType::class,
'required' => false,
'allow_add' => true,
'label' => false,
'delete_empty' => true,
'prototype' => true,
'entry_options' => [
'attr' => [
'class' => 'user-comment-widget'
],
'label' => false,
]
]);
$builder->add('submit', SubmitType::class);
}还添加了一个UserCommentType:
class UserCommentType extends AbstractType
{
/**
* @var TokenStorage
*/
private $tokenStorage;
public function __construct(TokenStorage $tokenStorage)
{
$this->tokenStorage = $tokenStorage;
}
/**
* buildForm
* @param FormBuilderInterface $builder
* @param array $options
* @throws \Exception
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$now = new \DateTime('now');
$builder->add('comment', TextareaType::class, [
'label' => false,
])
->add('addedBy', HiddenType::class, [
'data' => $this->tokenStorage->getToken()->getUser()->getUsername(),
])
->add('createdAt', HiddenType::class, [
'data' => $now->format('Y-m-d H:i:s')
]);
}在遇到一堆异常/错误之后,我想一定有一种更简单的方法来做到这一点。这不起作用,因为由于某些原因,UserCommentType无法访问原始数据,即使我使用它来初始化ResultForm:
$form = $this->createForm(ResultForm::class, $result);发布于 2020-03-17 18:30:10
要访问集合表单中的值,必须使用侦听器。通过向表单添加PRE_SET_DATA侦听器,您可以更改这些值。
$builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));现在,侦听器调用的函数。这将遍历集合中的每个元素,因此您可以在其中添加代码。
public function onPreSetData(FormEvent $event) {
$entity = $event->getData();
$form = $event->getForm();
if ($entity) {
$form->add('comment', TextareaType::class, [
'label' => false,
])
->add('addedBy', HiddenType::class, [
'data' => $this->tokenStorage->getToken()->getUser()->getUsername(),
])
->add('createdAt', HiddenType::class, [
'data' => $now->format('Y-m-d H:i:s')
]);
}
}如果需要,请确保添加if子句,因为第一次迭代将创建集合表单原型,而您可能不希望它具有预设值。
https://stackoverflow.com/questions/60693041
复制相似问题