gpt4 book ai didi

forms - Symfony:为 ManyToOne-OneToMany 关系嵌入表单集合

转载 作者:行者123 更新时间:2023-12-01 11:09:05 24 4
gpt4 key购买 nike

我正在运行带有 Doctrine 和这三个(相关)实体的 Symfony 2.3:PublicationAuthorAuthorPublicationAuthorPublication 都与 AuthorPublication 具有多对一关系(因此它基本上是 之间的多对多关系strong>AuthorPublication 但我需要 AuthorPublication 实体来订购出版物的作者)

我想要一个表单,用户可以在其中创建新出版物并根据需要为该出版物选择任意数量的作者。

我研究了这篇文章:How to Embed a Collection of Forms但我不明白如何将其应用于我的问题,因为 AuthorPublication 实体位于两者之间。

相关代码:

出版物

<?php

namespace ind\PubBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity(repositoryClass="ind\PubBundle\Repository\PublicationRepository")
* @ORM\Table("publications")
*/
class Publication {

/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $pid;

/**
* @ORM\OneToMany(targetEntity="AuthorPublication", mappedBy="publication")
* @ORM\OrderBy({"order_id" = "ASC"})
*/
protected $publicationAuthors;


//some more attributes + getters/seters
?>

作者

<?php

namespace ind\PubBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table("aid_author")
*/
class Author {

/**
* @ORM\Column(type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $aid;

/**
* @ORM\Column(type="string", length=255)
*/
protected $author_surname;

/**
* @ORM\Column(type="string", length=255)
*/
protected $author_forename;

/**
* @ORM\OneToMany(targetEntity="AuthorPublication", mappedBy="author")
*/
protected $authorPublication;
?>

作者发布

<?php

namespace ind\PubBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
* @ORM\Entity
* @ORM\Table("aid_pid")
*/
class AuthorPublication {

/**
* @ORM\Id
* @ORM\Column(type="integer")
*/
protected $aid;

/**
* @ORM\Id
* @ORM\Column(type="integer")
*/
protected $pid;

/**
* @ORM\Column(type="integer")
*/
protected $order_id;

/**
* @ORM\ManyToOne(targetEntity="Publication", inversedBy="publicationAuthors")
* @ORM\JoinColumn(name="pid", referencedColumnName="pid")
*/
protected $publication;

/**
* @ORM\ManyToOne(targetEntity="Author", inversedBy="authorPublication")
* @ORM\JoinColumn(name="aid", referencedColumnName="aid")
*/
protected $author;
?>

最佳答案

  1. 您必须创建一个 AuthorPublicationType 表单。您将字段作者作为 'entity'和你的其他领域......

  2. 您制作的 PublicationType 包括 AuthorPublication ( Embedded Forms )。

  3. 然后您可以使用 prototype 添加新的 AuthorPublication和非常简单的 javascript。

  4. 请注意,当您必须首先使用 authorPublication 属性 null 保存您的实体 Publication 时。在更新 Publication 之后,使用 Publication 和 LifecycleCallbacks 中的临时 ArrayCollection 定义的 authorPublication 进行更新。

编辑:示例。

我的实体是 Sport OneToMany SportParam ManyToOne ConfigParam。 SportParam 由 Sport、ConfigParam 和值组成。

我想创建一个具有多个 ConfigParam 的新运动:

  1. 运动参数类型:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
    ->add('ConfigParam', 'entity', array(
    'class' => 'PPHBSportScoringBundle:ConfigParam',
    'property' => 'nom',
    'multiple' => false,
    'label'=>'Paramètre'
    ))
    ->add('valeur','number',array('precision'=>2))
    ;
    }
  2. 运动类型

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
    $builder
    ->add('nom')
    ->add('SportParams', 'collection', array(
    'type'=> new SportParamType(),
    'allow_add' => true,
    'allow_delete' => true,
    'by_reference'=> false
    ))
    ;

    }
  3. 我的 form.html.twig :

    {{ form_start(form) }}
    {{ form_errors(form) }}
    {{ form_row(form.nom) }}
    <ul class=SportParams data-prototype="{{ form_widget(form.SportParams.vars.prototype)|e }}">
    {% for param in form.SportParams %}
    <li>
    {{ form_errors(param.ConfigParam) }}
    {{ form_widget(param.ConfigParam) }}
    {{ form_errors(param.valeur) }}
    {{ form_widget(param.valeur) }}
    </li>
    {% endfor %}
    </ul>
    <input type="submit" class="btn btn-primary" />
    {{ form_end(form) }}

    我的 Javascript 精简是因为它包含更多代码(AJAX 调用)。它可能包含一些错误。如果不清楚,请查看 documentation :

    <script type="text/javascript">

    var $container = $('ul.SportParams');
    // button to add a new SportParam
    var $addSportParamLink = $('<a href="#" id="ajout_param" class="btn btn-primary btn-xs">Ajouter un paramètre</a>');
    var $newLinkLi = $('<li></li>').append($addSportParamLink);

    $(document).ready(function() {
    //delete button on each existing SportParam
    $container.find('li').each(function() {
    addParamFormDeleteLink($(this));
    });

    //add button
    $container.append($newLinkLi);

    // adding a new form when cliking Add button
    $addSportParamLink.on('click',function(e) {
    e.preventDefault(); // évite qu'un #apparaisse dans l'URL
    var index = $container.children().length-1;

    addParamForm($container,$newLinkLi);

    var bAffiche;

    return false;
    });

    // adding a new form SportParam
    function addParamForm($container, $newLinkLi) {

    var $prototype = $container.attr('data-prototype');

    var newForm = $prototype.replace(/__name__/g, $container.children().length-1);

    var $newFormLi = $('<li></li>').append(newForm);
    $newLinkLi.before($newFormLi);

    addParamFormDeleteLink($newFormLi);
    }

    function addParamFormDeleteLink($paramFormLi){
    var $removeFormA = $('<a href="#" class="btn btn-danger btn-xs">Supprimer</a>');
    $paramFormLi.append($removeFormA);
    $removeFormA.on('click', function(e) {
    e.preventDefault();
    $paramFormLi.remove();
    });
    }

    });
    </script>
  4. 体育实体回电:

    /**
    * sport
    *
    * @ORM\Table()
    * @ORM\Entity
    * @ORM\HasLifecycleCallbacks
    * @ORM\Entity(repositoryClass="SportRepository")
    */
    class Sport
    {

    ...Entity attribut...

    /**
    * @var ArrayCollection
    *
    * To save Sport without SportParams
    */
    private $SportParamsTMP;

    ...getter and setter ...

    /**
    * @ORM\PrePersist
    */
    public function saveSportParams()
    {
    $this->SportParamsTMP = $this->SportParams;
    $this->SportParams = null;
    }
    /**
    * @ORM\PostPersist
    */
    public function restoreSportParams()
    {
    if ($this->SportParamsTMP == !null) {
    $this->SportParams = $this->SportParamsTMP;
    }
    $this->SportParamsTMP = null;
    }

    }

    最后是 Controller 添加新运动的功能:

    public function addAction()
    {
    $sport = new Sport();
    $form = $this->createForm(new SportType(), $sport);

    $request = $this->getRequest();

    if ($request->getMethod() == "POST") {
    $form->bind($request);
    if($form->isValid()) {
    $em = $this->getDoctrine()->getManager();

    $em->persist($sport);
    //saving sport without parameter
    $em->flush();

    //updating sport with parameter
    $em->flush();

    return $this->redirect($this->generateUrl('pphb_sport_liste'));
    }
    }

    return $this->render('PPHBSportScoringBundle:Championnat/Sport:add.html.twig', array(
    'form' => $form->createView(),
    ));
    }

希望对你有所帮助。
不知道这是否是最好的方法,但它对我有用。如果有什么需要改进的,请告诉我。

关于forms - Symfony:为 ManyToOne-OneToMany 关系嵌入表单集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23240500/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com