Silverstripe 两个连接表。如何管理?

Silverstripe 两个连接表。如何管理?,silverstripe,Silverstripe,我在SS3项目中有这种关系: 餐馆有很多菜 烹饪很多次 看起来很简单,但我似乎找不到任何方法来管理它。尝试了GridField和Listbox。这可能是SilverStripe的限制吗 谢谢你的任何线索! WilsonGridField是管理这种数据结构的完美工具,我每天都这样做 由于您的主题,我觉得有必要也提到这一点:它在这里不加入(好的,是的,ORM加入,但不包括餐厅和烹饪以及SubCuisine)。 下面的示例将做什么: 在单个餐厅上,它将显示美食的列表(网格字段),您可以在其中创建

我在SS3项目中有这种关系:

  • 餐馆有很多菜
  • 烹饪很多次
看起来很简单,但我似乎找不到任何方法来管理它。尝试了GridField和Listbox。这可能是SilverStripe的限制吗

谢谢你的任何线索!
Wilson

GridField是管理这种数据结构的完美工具,我每天都这样做

由于您的主题,我觉得有必要也提到这一点:它在这里不加入(好的,是的,ORM加入,但不包括餐厅和烹饪以及SubCuisine)。
下面的示例将做什么:

  • 在单个
    餐厅
    上,它将显示
    美食
    的列表(网格字段),您可以在其中创建新的或附加现有的
  • 在单个
    菜单上
    将显示
    子菜单
    的列表(网格字段),您可以在其中创建新菜单或附加现有菜单
(我假设
餐厅
是一个
页面
,但如果它是一个正常的
数据对象
,它也能正常工作。)


文件
Restaurant.php

/**
 * @method ManyManyList Cuisines
 */
class Restaurant extends Page {
    private static $many_many = array(
        'Cuisines' => 'Cuisine',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        $return = parent::getCMSFields();
        $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
        $return->addFieldToTab(
            'Root.Cuisines',
            GridField::create(
                'Cuisines',
                'The Cuisines this Restaurant offers',
                $this->Cuisines(),
                GridFieldConfig_RelationEditor::create()
            )
        );
        return $return;
    }
}

class Restaurant_Controller extends Page_Controller {
}
/**
 * @property string Title
 * @method ManyManyList SubCuisines
 */
class Cuisine extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(255)',
    );
    private static $many_many = array(
        'SubCuisines' => 'SubCuisine',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        if ($this->isInDB()) {
            $grid = GridField::create(
                'SubCuisines',
                'The Sub Cuisines of this Cuisines',
                $this->SubCuisines(),
                GridFieldConfig_RelationEditor::create()
            );
        } else {
            // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
            $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
        }
        return FieldList::create(array(
            TextField::create('Title', 'Name of Cuisine'),
            $grid,
        ));
    }
}
/**
 * @property string Title
 */
class SubCuisine extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(255)',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        return FieldList::create(array(
            TextField::create('Title', 'Name of Cuisine'),
        ));
    }
}
文件
courine.php

/**
 * @method ManyManyList Cuisines
 */
class Restaurant extends Page {
    private static $many_many = array(
        'Cuisines' => 'Cuisine',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        $return = parent::getCMSFields();
        $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
        $return->addFieldToTab(
            'Root.Cuisines',
            GridField::create(
                'Cuisines',
                'The Cuisines this Restaurant offers',
                $this->Cuisines(),
                GridFieldConfig_RelationEditor::create()
            )
        );
        return $return;
    }
}

class Restaurant_Controller extends Page_Controller {
}
/**
 * @property string Title
 * @method ManyManyList SubCuisines
 */
class Cuisine extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(255)',
    );
    private static $many_many = array(
        'SubCuisines' => 'SubCuisine',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        if ($this->isInDB()) {
            $grid = GridField::create(
                'SubCuisines',
                'The Sub Cuisines of this Cuisines',
                $this->SubCuisines(),
                GridFieldConfig_RelationEditor::create()
            );
        } else {
            // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
            $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
        }
        return FieldList::create(array(
            TextField::create('Title', 'Name of Cuisine'),
            $grid,
        ));
    }
}
/**
 * @property string Title
 */
class SubCuisine extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(255)',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        return FieldList::create(array(
            TextField::create('Title', 'Name of Cuisine'),
        ));
    }
}
文件
subguisine.php

/**
 * @method ManyManyList Cuisines
 */
class Restaurant extends Page {
    private static $many_many = array(
        'Cuisines' => 'Cuisine',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        $return = parent::getCMSFields();
        $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
        $return->addFieldToTab(
            'Root.Cuisines',
            GridField::create(
                'Cuisines',
                'The Cuisines this Restaurant offers',
                $this->Cuisines(),
                GridFieldConfig_RelationEditor::create()
            )
        );
        return $return;
    }
}

class Restaurant_Controller extends Page_Controller {
}
/**
 * @property string Title
 * @method ManyManyList SubCuisines
 */
class Cuisine extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(255)',
    );
    private static $many_many = array(
        'SubCuisines' => 'SubCuisine',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        if ($this->isInDB()) {
            $grid = GridField::create(
                'SubCuisines',
                'The Sub Cuisines of this Cuisines',
                $this->SubCuisines(),
                GridFieldConfig_RelationEditor::create()
            );
        } else {
            // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
            $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
        }
        return FieldList::create(array(
            TextField::create('Title', 'Name of Cuisine'),
            $grid,
        ));
    }
}
/**
 * @property string Title
 */
class SubCuisine extends DataObject {
    private static $db = array(
        'Title' => 'Varchar(255)',
    );

    /**
     * @return FieldList
     */
    public function getCMSFields() {
        return FieldList::create(array(
            TextField::create('Title', 'Name of Cuisine'),
        ));
    }
}
文件
Restaurant.ss
(模板):

餐厅:$Title 菜系
  • $Title 亚菜系:
    • $Title

  • GridField是管理此类数据结构的完美工具,我每天都会这样做

    由于您的主题,我觉得有必要也提到这一点:它在这里不加入(好的,是的,ORM加入,但不包括餐厅和烹饪以及SubCuisine)。
    下面的示例将做什么:

    • 在单个
      餐厅
      上,它将显示
      美食
      的列表(网格字段),您可以在其中创建新的或附加现有的
    • 在单个
      菜单上
      将显示
      子菜单
      的列表(网格字段),您可以在其中创建新菜单或附加现有菜单
    (我假设
    餐厅
    是一个
    页面
    ,但如果它是一个正常的
    数据对象
    ,它也能正常工作。)


    文件
    Restaurant.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    courine.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    subguisine.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    Restaurant.ss
    (模板):

    餐厅:$Title 菜系
  • $Title 亚菜系:
    • $Title

  • GridField是管理此类数据结构的完美工具,我每天都会这样做

    由于您的主题,我觉得有必要也提到这一点:它在这里不加入(好的,是的,ORM加入,但不包括餐厅和烹饪以及SubCuisine)。
    下面的示例将做什么:

    • 在单个
      餐厅
      上,它将显示
      美食
      的列表(网格字段),您可以在其中创建新的或附加现有的
    • 在单个
      菜单上
      将显示
      子菜单
      的列表(网格字段),您可以在其中创建新菜单或附加现有菜单
    (我假设
    餐厅
    是一个
    页面
    ,但如果它是一个正常的
    数据对象
    ,它也能正常工作。)


    文件
    Restaurant.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    courine.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    subguisine.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    Restaurant.ss
    (模板):

    餐厅:$Title 菜系
  • $Title 亚菜系:
    • $Title

  • GridField是管理此类数据结构的完美工具,我每天都会这样做

    由于您的主题,我觉得有必要也提到这一点:它在这里不加入(好的,是的,ORM加入,但不包括餐厅和烹饪以及SubCuisine)。
    下面的示例将做什么:

    • 在单个
      餐厅
      上,它将显示
      美食
      的列表(网格字段),您可以在其中创建新的或附加现有的
    • 在单个
      菜单上
      将显示
      子菜单
      的列表(网格字段),您可以在其中创建新菜单或附加现有菜单
    (我假设
    餐厅
    是一个
    页面
    ,但如果它是一个正常的
    数据对象
    ,它也能正常工作。)


    文件
    Restaurant.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    courine.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    subguisine.php

    /**
     * @method ManyManyList Cuisines
     */
    class Restaurant extends Page {
        private static $many_many = array(
            'Cuisines' => 'Cuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            $return = parent::getCMSFields();
            $return->addFieldToTab('Root', Tab::create('Cuisines', 'The Cuisines'));
            $return->addFieldToTab(
                'Root.Cuisines',
                GridField::create(
                    'Cuisines',
                    'The Cuisines this Restaurant offers',
                    $this->Cuisines(),
                    GridFieldConfig_RelationEditor::create()
                )
            );
            return $return;
        }
    }
    
    class Restaurant_Controller extends Page_Controller {
    }
    
    /**
     * @property string Title
     * @method ManyManyList SubCuisines
     */
    class Cuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
        private static $many_many = array(
            'SubCuisines' => 'SubCuisine',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            if ($this->isInDB()) {
                $grid = GridField::create(
                    'SubCuisines',
                    'The Sub Cuisines of this Cuisines',
                    $this->SubCuisines(),
                    GridFieldConfig_RelationEditor::create()
                );
            } else {
                // because this record is not saved to the DB yet, we have no ID, without ID there can be no many_many relation
                $grid = ReadonlyField::create('SubCuisines', '', 'Sub Cuisines can be added after creating');
            }
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
                $grid,
            ));
        }
    }
    
    /**
     * @property string Title
     */
    class SubCuisine extends DataObject {
        private static $db = array(
            'Title' => 'Varchar(255)',
        );
    
        /**
         * @return FieldList
         */
        public function getCMSFields() {
            return FieldList::create(array(
                TextField::create('Title', 'Name of Cuisine'),
            ));
        }
    }
    
    文件
    Restaurant.ss
    (模板):

    餐厅:$Title 菜系
  • $Title 亚菜系:
    • $Title

  • 在我们关于IRC的对话之后,我们提出了以下替代解决方案,我将在这里发布以供记录

    此解决方案与原始答案类似,但有不同之处