У меня есть документ
/**
* @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;
}
Я хочу создать форму, которая позволит мне добавлять новые комментарии пользователей. Но он будет иметь $comment
как TextAreaType
. Остальные 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')
]);
}
После получения куча исключений / ошибок и т. д. c Я подумал, что должен быть более простой способ сделать это. Это не работает, так как UserCommentType по какой-то причине не имеет доступа к исходным данным, хотя я использую это для инициализации ResultForm:
$form = $this->createForm(ResultForm::class, $result);