-->

Symfony2的1:M / 1:1间的关系和索纳塔管理表单(Symfony2 1:M / 1:1

2019-07-23 10:14发布

我现在已经打我的头撞在墙上了无数个小时,我希望这样能有所帮助!

我有工作得很好,零售商可以有很多分支,一个分支只能有一个零售商零售商,分公司和RetailerBranches实体。 试图让索纳塔管理员(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;

试图生成表单,让这种关系初具规模的时候比较困难的部分情况:

RetailerAdmin

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对象,而不是一个简单的分公司对象,显然是行不通的。

问题2:该方法还不允许用户修改一个分支内联。

我觉得我接近的解决方案,但我不能完全到达那里。 任何帮助将不胜感激!

Answer 1:

对于运行了同样的问题,我贴在解决方案的GitHub



Answer 2:

当需要编辑OneToOne或其他关系,在同一页中索纳塔联系,你也可以为每个实体创建管理类(和增加config.yml),只是整个实体添加到您的表格中,你主要的管理类,像这样的:

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



文章来源: Symfony2 1:M / 1:1 Relationship and Sonata Admin Form