【问题标题】:Embed a Collection of Forms in symfony2在 symfony2 中嵌入表单集合
【发布时间】: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


    【解决方案1】:

    您需要在 newAction() 中的对象“CarInquerito”中放入一些数据。就像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);
    

    如果您不这样做,嵌入表单将不会创建。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多