首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >以EmbedMany作为表单的文档(Symfony 3)

以EmbedMany作为表单的文档(Symfony 3)
EN

Stack Overflow用户
提问于 2020-03-15 20:48:46
回答 1查看 36关注 0票数 0

我有一份文件

代码语言:javascript
复制
/**
 * @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个字段应自动添加。

我使用的集合类型是这样的:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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:

代码语言:javascript
复制
$form = $this->createForm(ResultForm::class, $result);
EN

回答 1

Stack Overflow用户

发布于 2020-03-17 18:30:10

要访问集合表单中的值,必须使用侦听器。通过向表单添加PRE_SET_DATA侦听器,您可以更改这些值。

Documentation

代码语言:javascript
复制
$builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData'));

现在,侦听器调用的函数。这将遍历集合中的每个元素,因此您可以在其中添加代码。

代码语言:javascript
复制
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子句,因为第一次迭代将创建集合表单原型,而您可能不希望它具有预设值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60693041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档