嘿傢伙我是symfony2的新手,我試圖做一個簡單的應用程序!在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(),
));
}
現在的觀點: new.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 f ILE,我添加和刪除鏈接添加「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();
});
}
任何建議傢伙?我整天搜索,我嘗試了很多東西,但我沒有找到解決辦法。
任何幫助表示讚賞!
感謝