【发布时间】:2012-06-05 16:55:58
【问题描述】:
大家好,我是 symfony2 的新手,我正在尝试做一个简单的应用程序!
我有 3 个实体,分别称为“CarInquerito”、“CarPergunta”和“CarResposta”,它们是相关的,您可以在下面的“有趣”代码中看到。所有这些属性都有适当的获取/设置。
我假设当我从 CarInquerito 创建一个表单时,我将一个来自 CarPergunta 的表单和一个来自 CarResposta 的表单嵌入到该 CarPergunta 表单中。我已经完成了将 CarResposta 集合嵌入到 CarPergunta 表单中,但是当我尝试将此结果嵌入到 CarInquerito 时,它似乎不起作用。
class CarInquerito
{
/**
* @ORM\OneToMany(targetEntity="CarPergunta", mappedBy="idInquerito", cascade={"persist"})
*/
private $perguntas;
}
class CarInqueritoType{
$builder->add('perguntas', 'collection', array(
'type' => new CarPerguntaType(),
'allow_add' => true,
'by_reference' => false,
'prototype' => true,
'allow_delete' => true,
));
}
class CarInquerito
{
/**
* @var CarInquerito
*
* @ORM\ManyToOne(targetEntity="CarInquerito", inversedBy="perguntas")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_inquerito", referencedColumnName="id", onUpdate="cascade", onDelete="cascade", nullable = false)
* })
*/
private $idInquerito;
/**
* @ORM\OneToMany(targetEntity="CarResposta", mappedBy="idPergunta", cascade={"persist"})
*/
private $respostas;
}
class CarPerguntaType{
$builder->add('respostas', 'collection', array(
'type' => new CarRespostaType(),
'allow_add' => true,
'by_reference' => false,
'prototype' => true,
'allow_delete' => true,
));
}
class CarResposta{
/**
* @var CarPergunta
*
* @ORM\ManyToOne(targetEntity="CarPergunta", inversedBy="respostas")
* @ORM\JoinColumns({
* @ORM\JoinColumn(name="id_pergunta", referencedColumnName="id", onUpdate="cascade", onDelete="cascade", nullable = false)
* })
*/
private $idPergunta;
}
class CarRespostaType{
$builder->add('resposta', 'text');
}
现在是控制器:
public function newAction() {
$CarInquerito = new CarInquerito();
$form = $this->createForm(new CarInqueritoType(), $CarInquerito);
return $this->render('CareAdminBundle:CarInquerito:new.html.twig', array(
'form' => $form->createView(),
));
}
现在的观点: 新的.html.twig:
<div class="inqueritos">
<div class="perguntas-list">
<ul class="perguntas" data-prototype="{% filter escape %}{% include 'CareAdminBundle:CarInquerito:prototypePergunta.html.twig' with {'form': form.perguntas.get('prototype')} %}{% endfilter %}">
{% for pergunta in form.perguntas %}
<li>
{{ form_widget(pergunta.pergunta) }}
</li>
{% endfor %}
</ul>
</div>
</div>
---protoypePergunta.html.twig----------
<div class="respostas-list" style="background-color: red; padding: 10px;">
<ul class="respostas" data-prototype="{{ form_widget(form.respostas.get('prototype')) | e }}">
{% for resposta in form.respostas %}
<li>{{ form_widget(resposta.resposta) }}</li>
{% endfor %}
</ul>
</div>
我有一个 javascript 文件,我在其中添加和删除链接以添加“Pergunta”和“Respostas”,如下所示:
$(document).ready(function(){
var collectionHolderPerguntas = $('ul.perguntas');
collectionHolderPerguntas.find('li').each(function() {
addPerguntaFormDeleteLink($(this));
});
// setup an "add a tag" link
var $addPerguntaLink = $('<a href="#" class="add_pergunta_link">Adicionar pergunta</a>');
var $newLinkLi = $('<li></li>').append($addPerguntaLink);
// add the "add a tag" anchor and li to the tags ul
collectionHolderPerguntas.append($newLinkLi);
$addPerguntaLink.on('click', function(e) {
// prevent the link from creating a "#" on the URL
e.preventDefault();
// add a new tag form (see next code block)
addPerguntaForm(collectionHolderPerguntas, $newLinkLi);
});
var collectionHolderRespostas = $('ul.respostas');
collectionHolderRespostas.find('li').each(function() {
alert("OL");
addRespostaFormDeleteLink($(this));
});
// setup an "add a tag" link
var $addRespostaLink = $('<a href="#" class="add_resposta_link">Adicionar resposta</a>');
var $newLinkLiResposta = $('<li></li>').append($addRespostaLink);
// add the "add a tag" anchor and li to the tags ul
collectionHolderRespostas.append($newLinkLiResposta);
$addRespostaLink.on('click', function(e) {
// prevent the link from creating a "#" on the URL
e.preventDefault();
// add a new tag form (see next code block)
addRespostaForm(collectionHolderRespostas, $newLinkLiResposta);
});
});
function addPerguntaForm(collectionHolderPerguntas, $newLinkLi) {
// Get the data-prototype we explained earlier
var prototype = collectionHolderPerguntas.attr('data-prototype');
// Replace '$$name$$' in the prototype's HTML to
// instead be a number based on the current collection's length.
var newForm = prototype.replace(/\$\$name\$\$/g, collectionHolderPerguntas.children().length);
// Display the form in the page in an li, before the "Add a tag" link li
var $newFormLi = $('<li></li>').append(newForm);
$newLinkLi.before($newFormLi);
// add a delete link to the new form
addPerguntaFormDeleteLink($newFormLi);
}
function addPerguntaFormDeleteLink($perguntaFormLi) {
var $removeFormA = $('<a href="#">apagar</a>');
$perguntaFormLi.append($removeFormA);
$removeFormA.on('click', function(e) {
// prevent the link from creating a "#" on the URL
e.preventDefault();
// remove the li for the tag form
$perguntaFormLi.remove();
});
}
function addRespostaForm(collectionHolderRespostas, $newLinkLiResposta) {
// Get the data-prototype we explained earlier
var prototype = collectionHolderRespostas.attr('data-prototype');
//
// Replace '$$name$$' in the prototype's HTML to
// instead be a number based on the current collection's length.
var newFormResposta = prototype.replace(/\$\$name\$\$/g, collectionHolderRespostas.children().length);
// Display the form in the page in an li, before the "Add a tag" link li
var $newFormLiResposta = $('<li></li>').append(newFormResposta);
$newLinkLiResposta.before($newFormLiResposta);
// add a delete link to the new form
addRespostaFormDeleteLink($newFormLiResposta);
}
function addRespostaFormDeleteLink($respostaFormLi) {
var $removeFormA = $('<a href="#">apagar</a>');
$respostaFormLi.append($removeFormA);
$removeFormA.on('click', function(e) {
// prevent the link from creating a "#" on the URL
e.preventDefault();
// remove the li for the tag form
$respostaFormLi.remove();
});
}
大家有什么建议吗?我整天搜索,我尝试了很多东西,但我没有设法找到解决方案。
感谢任何帮助!
谢谢
【问题讨论】:
标签: forms symfony doctrine-orm