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

2024-05-26

我正在使用 Doctrine 和这三个(相关)实体运行 Symfony 2.3:出版物, Author and 作者发表. Both, Author and 出版物具有多对一关系作者发表(所以它基本上是一个多对多关系Author and 出版物但我需要作者发表订购出版物作者的实体)

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

我研究了这篇文章:如何嵌入表单集合 http://symfony.com/doc/current/cookbook/form/form_collections.html但我不明白如何将其应用于我的问题,因为作者发表介于两者之间的实体。

相关代码:

出版物

<?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
?>

Author

<?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' http://symfony.com/doc/current/reference/forms/types/entity.html和你的其他领域...

  2. 您使您的 PublicationType 包括 AuthorPublication (嵌入式表格 http://symfony.com/doc/current/book/forms.html#embedding-a-single-object).

  3. 然后您可以添加新的 AuthorPublication原型 http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-new-tags-with-the-prototype和非常简单的javascript。

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

编辑:示例。

我的实体是运动一对多运动参数多对一配置参数。 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 调用)。它可能包含一些错误。如果不清楚,请查看文档 http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-new-tags-with-the-prototype :

    <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;
        }
    
    }   
    

    最后给控制器添加一个新的Sport功能:

    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(),
      ));
    }
    

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony:为 ManyToOne-OneToMany 关系嵌入表单集合 的相关文章

  • 提交表单后关闭featherlight

    我有一个 demo employee php 页面 它检索系统的所有用户以及可以执行的特定操作 td table tr td a href i class fa fa pencil square o i a td td a href i c
  • 如何自定义 FOS UserBundle URL

    我已经安装了FOS用户包 https github com FriendsOfSymfony FOSUserBundle我想将网址自定义为 account login account register account logout代替 lo
  • twig json_encode 空 json

    我正在从 API 接收元素列表 所有元素的格式都很好 当我使用树枝转储其中一个时 我得到以下信息 Leg 2695 id null reservation null airportStart AIX LES MILLES airplaneT
  • 如何配置 FOSRestBundle 以不干扰自定义异常控制器

    我刚刚将我的 Symfony 2 7 页面更新到 2 8 除了 Symfony 本身之外 许多其他软件包也已更新 FOSRestBundle已从1 4版本更新至2 1版本 更新后CustomExceptionController我配置为Tw
  • JQuery 在提交之前需要复选框和单选按钮

    我很难弄清楚这一点 现在我们已经花了 3 个多小时来研究 JQuery 验证的示例和工具 我想做的只是要求选中一个复选框和一个单选按钮 但我不在乎需要哪一个
  • JSON 数据的动态表单(不同类型)

    我尝试使用 JSON 中的数据在 AngularJS 中创建动态表单 我有这个工作 HTML p p
  • 哪些 ORM 与 Scala 配合得很好? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 从提交的表单中获取值

    我有一个非常简单的表格
  • 从父对象的表单创建一定数量的子对象

    谢谢Ruby on Rails 如何从表单收集子表的值 https stackoverflow com questions 2020673和 Agile Web Dev 我知道如何在一个表单中使用多个模型fields for 但我正在为这件
  • Doctrine2 findBy() 按连接表字段排序

    我将 Symfony2 与 Doctrine2 一起使用 有以下实体 Person ORM Entity repositoryClass Acme Bundle ConsysBundle Entity PersonRepository OR
  • 在浏览器中刷新页面而不重新提交表单

    我是一名 ASP NET 开发人员 我通常会发现自己正在浏览器中打开正在处理的网页 Chrome 是我选择的浏览器 但这个问题与任何浏览器都相关 我的工作流程通常是这样的 编写代码 在 Visual Studio 中重建项目 然后使用 Al
  • IBM Websphere JPA 配置 - 如何更新 persistence.xml

    我是 EJB 3 和 JPA 的新手 我在应用程序服务器中创建了一个数据源 它是jdbc AppDataSource 默认持久性提供程序保留为com ibm websphere persistence PersistenceProvider
  • Hibernate 可以使用 MySQL 的“ON DUPLICATE KEY UPDATE”语法吗?

    MySQL 支持 INSERT ON DUPLICATE KEY UPDATE 语法允许您 盲目 插入数据库 并回退到更新现有记录 如果存在 当您想要快速事务隔离并且想要更新的值取决于数据库中已有的值时 这非常有用 作为一个人为的示例 假设
  • JavaScript 表单提交 - 确认或取消提交对话框

    对于带有询问字段是否填写正确的警报的简单表单 我需要一个执行此操作的函数 单击按钮时显示警告框 有两个选项 如果单击 确定 则提交表单 如果单击 取消 警报框将关闭 并且可以调整并重新提交表单 我认为 JavaScript 确认可以工作 但
  • Symfony2 功能测试会话持久性

    我正在尝试在 Symfony 中进行一些功能测试 但目前我的会话遇到了问题 我执行了一段代码 它似乎有效 但容器的会话中没有存储任何内容 我有一个表格 您可以在其中设置数据 当您提交它时 它会检查值并将其存储在会话中 然后它重定向到另一个页
  • 如何在 QueryDSL 中选择文字

    我目前正在开发一个使用 queryDSL 和 hibernate 的项目 其中它需要一个选择文字 按照发布的示例here https stackoverflow com questions 18691317 querydsl how to
  • 自定义 Facebook FOSFacebookBundle 登录按钮

    有人知道如何自定义 更改 FosFacebook 登录按钮的图像吗 facebook login button autologoutlink true 并在整页 Facebook 登录上重定向 而不是在弹出窗口上重定向 这使用了 twig
  • 如何正确清理来自 AngularJS 控制器的无效输入的表单?

    我有一个 AngularJS 表单 其中包含 除其他字段之外 类型之一url 后者很重要 因为这会强制相应的输入成为有效的 URL 在某些条件下 例如 要关闭具有此类表单的模式对话框 我想以编程方式清除该表单 为此 我实现了方法reset基
  • 如何为名称为数组的 jquery 表单验证插件创建规则?

    有谁知道当您有一个数组的名称属性时如何为 jquery 表单验证插件创建规则 eg
  • PHP 表单 - 带验证蜜罐

    我有以下内容 效果很好 但对垃圾邮件机器人开放 我想放入蜜罐 而不是验证码 下面的代码适用于验证姓名 电子邮件 消息 但我无法让它与蜜罐一起工作 任何人都可以查看 蜜罐 代码并告诉我如何修复它吗 我希望表单给出 success2 不允许垃圾

随机推荐

  • 如何使用哈希数组填充 select_tag?

    在 Rails 3 2 应用程序中 我尝试添加一个选择字段 该字段从外部 API 调用获取数据 该数据作为哈希数组返回 name gt NameA id gt 001 name gt NameB id gt 002 我如何使用这些数据来构造
  • git:检查标签,修改某些内容,然后再次标记它

    我觉得我应该知道这一点 但我很困惑 我在 github 上分叉了一个存储库 我需要的是签出一个标签 称为 v1 0 5 修改文件上的语句 使用名为 1 0 5 的新标签 不带 v 重新标记该状态 然后执行对 master 进行同样的更改 让
  • 使用 Apache CXF 更改 WSDL xsd:complexType 名称

    我使用 Apache CXF 发布 Web 服务 即时 生成 WSDL 这很好用 但我想更改生成类型的命名约定 由于服务客户端 C 基于 WSDL 生成代码 因此默认的 xsd complexType 命名会导致类型名称以小写字母开头 以下
  • 如何在产品listing页面显示产品详细描述?

    我想在产品列表页面上的简短描述后显示详细的产品描述 我正在做这个 但什么也没有出现 我也尝试过这个 Mage getModel catalog product gt load product gt getProductId gt getDe
  • Blade 如何处理脚本调用?

    大家好 我在脚本调用方面遇到问题 我在 Laravel 中使用 Blade 除了支持搜索和排序功能的脚本调用之外 一切都正常工作 这是我的层次结构和相应的相关代码 main blade php div class page containe
  • 即使 startService 不返回,peekService 也会返回 null

    我正在尝试使用 AndroidService from a BroadcastReceiver The Service生活在不同的应用程序中BroadcastReceiver 我的理解是 正确的方法是首先调用Context startSer
  • 如何使超类方法返回子类的实例

    我有一堂课叫Test和一个名为SubTest谁延伸Text 我想有一个方法Test将返回实例的类SubTest当接到电话时 我想做 SubTest test new SubTest setTest Hello setOtherTest Hi
  • Rspec : PG::ConnectionBad: PQsocket() 无法获取套接字描述符

    我运行了 rspec 大部分测试都失败了 我对他们遇到了同样的错误 即 Failure Error Unable to find matching line from backtrace ActiveRecord StatementInva
  • Apache Flink 动态设置 JVM_OPT env.java.opts

    是否可以设置自定义 JVM 选项env java opts提交作业时未在作业中指定conf flink conf yaml file 我问的原因是我想在 log4j 中使用一些自定义变量 我也在 YARN 上运行我的工作 我已经使用 CLI
  • 将 2 个不同表中的 2 个值相乘

    我正在尝试使用 SQL 将值 X 乘以值 Y 值 X 位于表 A 中 B 位于表 B 中 我找不到这个问题的答案 表交易 ID Transaction ID Total Amount 1 001 1200 2 002 1500 3 003
  • SHA-256 BigQuery 函数或 UDF

    有人有 UDF 或知道在 BigQuery 中支持 SHA 256 的计划吗 https cloud google com bigquery query reference syntax 16 https cloud google com
  • 在 firebase 函数中设置 dotenv

    我正在尝试将我制作的小型节点表达应用程序移动到 firebase 函数中 该文件有dotenv变量 早些时候我想如果我只是部署并依赖 dotenv 它会起作用 但那并没有发生 于是 我去了firebase的环境配置文章了解如何设置 env
  • 使用express/connect-redis在页面重新加载时抓取现有会话

    使用 connect express 和 socket io 我试图让我的应用程序在重新连接时获取会话详细信息 我的会话显然在客户端连接时工作 但如果我刷新浏览器上的页面 它会忘记所有内容 我的会话cookie肯定是一样的 所以不是那样的
  • 在更新面板中提交表单后运行javascript?

    这真让我抓狂 我在这里阅读了至少 5 个与我的问题密切相关的问题 可能还通过谷歌搜索阅读了 5 页左右的内 容 我就是不明白 我试图在用户填写 已提交注册 的表单后出现一个 jqueryui 对话框 然后重定向到另一个页面 但我一生都无法让
  • 如何处理 BrainTree 中的 Webhook

    我正在尝试使用 BrainTree webhooks 进行订阅交易 但无法让我的页面进行验证 来自脑树 https www braintree payments com docs php webhooks destination verif
  • 将屏幕从 Windows Phone 7 发送到 PC 的工具

    手机屏幕投射到电脑上用什么工具 我在演示文稿中看到过它 但在任何地方都找不到它 Thanks 这是目前仅由微软员工使用的内部工具 相机 投影仪是另一种选择
  • PHP 类扩展字符串变量

    是否可以声明一个类并让它扩展一个变量 class Child extends parentClass 是的 它是通过 eval 实现的 但不建议这样做
  • Java 正则表达式 电子邮件

    首先 我知道不建议使用正则表达式发送电子邮件 但我必须对此进行测试 我有这个正则表达式 b A Z0 9 A Z0 9 A Z 2 4 b 在Java中 我是这样做的 Pattern p Pattern compile b A Z0 9 A
  • 在plotly python中使用按钮过滤不同的数据

    我遵循 PythononToast的答案如何在使用 Python 中的 Plotly 创建的图中添加按钮或下拉菜单 https stackoverflow com questions 65710352 how can i add a but
  • Symfony:为 ManyToOne-OneToMany 关系嵌入表单集合

    我正在使用 Doctrine 和这三个 相关 实体运行 Symfony 2 3 出版物 Author and 作者发表 Both Author and 出版物具有多对一关系作者发表 所以它基本上是一个多对多关系Author and 出版物但