gpt4 book ai didi

php - symfony2 表单,对象集合,更新现有对象属性的问题

转载 作者:行者123 更新时间:2023-12-04 14:40:21 24 4
gpt4 key购买 nike

该表格由一个问题组成,该问题具有多个答案,因此可以为每个问题动态创建答案。这些东西都很好用:

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('question','textarea')
->add('answers', 'collection', array(
'type'=>new AnswerType(),
'allow_add'=>true,
'allow_delete'=>true,
'label' => false
))
;
}

这是 AnswerType 的表单代码:
    $builder
->add('answer','text', array(
'attr'=>array(
'class'=>'form-control'
),
'label'=>false
))
->add('isGoodAnswer', 'checkbox', array(
'label'=>'Good?',
'required'=>false
))
;

我正在使用原型(prototype)模板通过 jquery 填充容器。

向问题对象添加新的答案对象可以正常工作。删除答案也不是问题。

但是,如果我去更新集合表单输入之一的现有属性,它不会更新现有对象。它会保留问题对象,因为它会更新问题本身的文本。我目前只能删除并创建新内容来替换某些内容,我很难弄清楚原因。

这是提交的模板表单中的代码片段:
    <ul id="answer-fields-list" data-prototype="{{ form_widget(form.answers.vars.prototype)|e }}">
{% for answer in form.answers %}
<li>
<div class='col-md-12'>
{{ form_widget(answer) }}
<div>
<a href='#' class='btn btn-sm btn-danger delete-this'><span class='glyphicon glyphicon-trash'></span></a>
</div>
</div>
</li>
{% endfor %}
</ul>
<a href="#" id="add-answer" class='btn btn-sm btn-success'><span class='glyphicon glyphicon-plus-sign'></span> Add Answer</a>

编辑,这里是此更新方法的完整 Controller 代码:
    $question = $em->getRepository('ChecklistMainBundle:ChecklistQuestion')->findOneById($questionId);
if(!$question) throw new NotFoundHttpException('Question not found');

$form = $this->createForm(new QuestionAnswerType(), $question);

$form->handleRequest($request);

if($request->getMethod()=='POST' && $form->isValid())
{
if($form->get('attachment')->getData() != null) {
$question->uploadAttachment();
}
$em->persist($question);
$em->flush();

$this->get('session')->getFlashBag()->add('success', 'Question was modified successfully!');

return $this->redirect($this->generateUrl('admin_checklists_view', array('id'=>$id)));
}

最佳答案

在谷歌搜索了几个小时后,我遇到了一个与我相似的重复问题。

How to force Doctrine to update array type fields?

我通过 setAnswers 方法调整如下以反射(reflect)这个答案:

 public function setAnswers($answers)
{
if(!empty($answers) && $answers === $this->answers) {
reset($answers);
$answers[key($answers)] = clone current($answers);
}
$this->answers = $answers;
return $this;
}

它现在可以很好地保存现有答案,不再有问题:)

关于php - symfony2 表单,对象集合,更新现有对象属性的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27238717/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com