2012-06-05 90 views
2

嘿傢伙我是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(); 
    }); 
} 

任何建議傢伙?我整天搜索,我嘗試了很多東西,但我沒有找到解決辦法。

任何幫助表示讚賞!

感謝

回答

0

你需要把一些數據,你的對象 'CarInquerito' 在newAction()。像這樣的例子在form collection cookbook

$tag1 = new Tag(); 
     $tag1->name = 'tag1'; 
     $task->getTags()->add($tag1); 
     $tag2 = new Tag(); 
     $tag2->name = 'tag2'; 
     $task->getTags()->add($tag2); 
     // end dummy code 

     $form = $this->createForm(new TaskType(), $task); 

如果不將嵌入式形式不會產生。