微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 Silverstripe 中,如何像在 DataObjects 中一样自动为 Pages 创建 CMS 字段?

如何解决在 Silverstripe 中,如何像在 DataObjects 中一样自动为 Pages 创建 CMS 字段?

DataObjects 中,getCMSFields 方法自动创建所有适当的 CMS 字段(称为脚手架)。但是,在扩展 SiteTree(即 Pages)的类中,这不会发生。

如何在 Pages 中使用此表单字段脚手架?

解决方法

除了像您在自己的答案中建议的那样调用 DataObject::getCMSFields() 之外,还可以直接实例化一个脚架:

public function getCMSFields() {
        // with tabs
        $scaffolder = new FormScaffolder($this);
        $scaffolder->restrictFields = ['Title','Content'];
        $scaffolder->tabbed = true;
        $fields = $scaffolder->getFieldList();
        $fields->addFieldToTab('Root.Main',[
            new MySpecialFieldWithCustomOptions('Links','My Links',$foobar),]);
        return $fields;
}
public function getCMSFields() {
        // without tabs
        $scaffolder = new FormScaffolder($this);
        $scaffolder->restrictFields = ['Title','Content'];
        $fields = $scaffolder->getFieldList();
        $fields->push(
            new MySpecialFieldWithCustomOptions('Links',$foobar)
        );
        return $fields;
}

这将适用于任何 DataObject($this 必须是 DataObject 的一个实例)。 Pages 是 DataObjects 的一个子类。
restrictFields 是可选的,如果没有提供,它会做所有能找到的字段。

,

我们回到 DataObject 并获取脚手架字段:

use SilverStripe\ORM\DataObject;
use Page;

class MyPage extends Page 
{
    private static $db = [
        'MyField' => 'Varchar',];

    private static $has_one = [
        'MyRelation' => 'MyClass',];

    public function getCMSFields()
    {
        // fields from Page class
        $fields = parent::getCMSFields();
        // fields from DataObject class.
        $fieldRepository = DataObject::getCMSFields();

        $fields->addFieldsToTab(
            'Root.MyExtraFields',[
                $fieldRepository->dataFieldByName('MyField'),$fieldRepository->dataFieldByName('MyRelationID'),]
        );

        return $fields;

    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。