2012-06-05 4 views
2

hey guys Я новичок в symfony2, и я пытаюсь сделать простое приложение!Код для вставки в Symfony2

У меня есть 3 объекта, называемые «CarInquerito», «CarPergunta» и «CarResposta», и они связаны, как вы можете видеть на «интересном» кодексе ниже. Все эти свойства имеют соответствующие get/sets.

Что я делаю вид, когда я создаю форму из 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 ИОС, где я добавлять и удалять ссылки, чтобы добавить «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); 

Если вы не в погруженной форме не создавать.

Смежные вопросы