【问题标题】:Symfony2 1:M / 1:1 Relationship and Sonata Admin FormSymfony2 1:M / 1:1 关系和奏鸣曲管理表格
【发布时间】:2013-03-26 04:08:00
【问题描述】:

我已经无数小时撞到墙上了,我希望 SO 能有所帮助!

我有 Retailer、Branch 和 RetailerBranches 实体,它们工作得很好,零售商可以有很多分店,而一个分店只能有一个零售商。当试图让 Sonata Admin (SonataAdminBundle) 很好地处理这种关系时,困难的部分就发生了。它们最简单的形式如下所示:

零售商实体

    /**
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * Relation
     * 
     * @ORM\OneToMany(targetEntity="RetailerBranches", mappedBy="Retailer", cascade={"persist"})
     */
    protected $branches;

    public function __construct() {
        $this->branches = new ArrayCollection();
    }

RetailerBranches 联接表

    /**
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * @ORM\JoinColumn(name="Retailer_ID", referencedColumnName="ID", nullable=false)
     * @ORM\ManyToOne(targetEntity="Retailer", inversedBy="branches")
     */
    private $retailer;

    /**
     * @ORM\JoinColumn(name="Branch_ID", referencedColumnName="ID", nullable=false, unique=true)
     * @ORM\OneToOne(targetEntity="Branch", inversedBy="retailer")
     */
    private $branch;

分支实体

    /**
     * @ORM\Column(name="ID", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;

    /**
     * Relation
     * 
     * @ORM\OneToOne(targetEntity="RetailerBranches", mappedBy="branch", cascade={"persist"})
     */
    private $retailer;

当尝试生成表单以使这种关系形成时,困难的部分发生了:

零售商管理

protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('Branches')
                ->add('branches', 'sonata_type_collection', array(
                    'required' => false,
                    'by_reference' => false
                ), array(
                    'edit' => 'inline',
                    'inline' => 'table',
                ))
                ->end()
        ;
    }

RetailerBranchesAdmin

protected function configureFormFields(FormMapper $formMapper)
    {
        if ($this->hasRequest()) {
            $link_parameters = array('context' => $this->getRequest()->get('context'));
        } else {
            $link_parameters = array();
        }

        $formMapper
            ->add('succursale', 'sonata_type_model_list', array(
                'class' => 'VeloRetailerBundle:Branch',
                'required' => false,
            ), array(
                'edit' => 'inline',
                'inline' => 'table',
            ))
        ;
    }

问题:

所有这些工作,这是一个截图:

有一家零售商及其分支机构。耶。

问题 1:底部的“添加新”按钮尝试添加一个 RetailerBranches 对象,而不是一个简单的 Branch 对象,这显然不起作用。

问题 2:此方法也不允许用户修改内联分支。

我觉得我已经接近解决方案了,但我就是不能完全做到。任何帮助将不胜感激!

【问题讨论】:

  • 又是这首奏鸣曲……我看到很多人为它奋斗的时间比自己写这些东西的时间还要长。为什么你需要它?如果你需要像 Sonata 这样的东西,你可能需要一个 CMS,而不是一个框架。
  • 这就是我要做的。这是一段简洁的代码,但是文档太差了。
  • 我找到了另一种方法来完成这项工作,明天将继续工作并发布我的发现。
  • 我使用 Sonata Admin 已有半年了,遇到了许多未记录的用例。但它是在开源项目中,很多人在改进和添加新功能方面做得很棒。这就是为什么我采用用例,与贡献者讨论最佳实践并将它们添加到文档中。这是一个简单的 GitHub fork 并添加了一些行。欢迎加入@Pier-Luc Gendreau 和 Elnur Abdurrakhimov。 :)

标签: symfony doctrine-orm symfony-sonata sonata-admin


【解决方案1】:

对于遇到同样问题的人,我将解决方案发布在GitHub

.

【讨论】:

    【解决方案2】:

    当需要在 Sonata Admin 的同一页面上编辑 OneToOne 或其他关系时,您还可以为每个实体创建 Admin 类(并添加到 config.yml)并简单地将整个实体添加到您的主 Admin 类中的表单中,例如所以:

    protected function configureFormFields(FormMapper $formMapper)
        $formMapper
        ->add('yourLinkedProperty', 'sonata_type_admin')
        //other form fields
        ->end()
    

    参见奏鸣曲文档http://sonata-project.org/bundles/admin/master/doc/reference/form_types.html

    【讨论】:

      猜你喜欢
      • 2017-06-03
      • 2012-01-07
      • 1970-01-01
      • 2016-04-17
      • 2020-08-17
      • 1970-01-01
      • 1970-01-01
      • 2018-03-22
      • 2018-08-02
      相关资源
      最近更新 更多