我正在创建一个动态的问题/答案表格。我需要为仅与登录用户相关的给定部分显示一组答案字段。数据模型为:
Section有很多SectionQuestion(一个section代表表单的一个页面)SectionQuestion有一个问题和很多答案答案有一个用户和一个SectionQuestion
我的表单代码是:
//SectionFormType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('sectionQuestions', 'collection', array(
'type' => new SectionQuestionFormType($this->answerListener),
'label' => false
))
->add('save', 'submit');
}
//SectionQuestionFormType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->addEventSubscriber($this->answerListener);
}
//AnswerListener.php
public function preSetData($event)
{
$data = $event->getData();
$form = $event->getForm();
if (null === $data) {
return;
}
$form->add(
'answers',
'collection',
array(
'type' => new AnswerFormType($data->getQuestion()),
'auto_initialize' => false,
'label' => false,
'required' => false,
)
);
}
//AnswerFormType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$fieldType = $this->question->getAnswerType();
$config = array(
'required' => true,
'label' => $this->question->getText(),
'auto_initialize' => false
);
if ($fieldType == 'choice') {
$valueList = $this->question->getValueList();
$values = $valueList->loadChoiceList();
$config['choice_list'] = $values;
$config['empty_value'] = 'Please select one';
}
$builder->add('answer', $fieldType, $config);
}
这段代码是功能性的,但不是我真正需要的。我需要在 AnswerListener 中添加的集合来提供与当前登录用户相关的现有答案和尚未输入答案的空白答案的混合。
我知道,与其在 AnswerListener 'answers' 中命名集合字段(与 SectionQuestions 中的关系属性匹配),我可以将其命名为 'filteredAnswers' 并在 SectionQuestions 实体类中编写一个 getter/setter 来返回答案的子集. 但!我无法访问 Entity 类的 getter 中的登录用户。
我也无法将字段类型更改为实体,因为据我所知,我将无法规定使用 AnswerFormType 表单,这至关重要,因为它使用我的问题中的值设置答案字段标签实体(实际问题文本)。
在 AnswerListener 中,我可以使用 $form->add($this->factory->createNamed(....)) 并以这种方式提供数据子集(因为我可以访问 AnswerListener 中的实体管理器登录用户类并执行查询)。但!我不知道如何使它成为一个集合字段类型。我可以像这样使用 createNamed 使表单正确显示:
$form->add( $this->factory->createNamed( 'answer', new AnswerFormType( $data->getQuestion()), $answer, array( 'auto_initialize' => false, 'mapped' => false, 'label' => false ) ) ) )
...但!这只会将单个答案字段添加到表单中,因此发布的值永远不会保存到数据库中(可能是因为 SectionQuestions 希望通过未达到的“答案”属性添加它们)。
似乎我每一次都被难住了。关于如何让这个工作的任何想法?