Symfony2 1:M / 1:1关系和奏鸣曲管理表格

时间:2013-03-26 04:08:01

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

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

我有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;

当尝试生成表单以允许该关系成形时,会发生更难的部分:

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

问题:

所有这些作品,这是一个截图: enter image description here

有一个零售商及其分店。耶。

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

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

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

2 个答案:

答案 0 :(得分:4)

对于遇到同样问题的人,我在GitHub

上发布了解决方案

答案 1 :(得分:1)

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

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

请参阅Sonata Doc http://sonata-project.org/bundles/admin/master/doc/reference/form_types.html