В Silverstripe, как я могу автоматизировать создание полей CMS для страниц, как это работает в DataObjects?

#silverstripe #scaffolding #silverstripe-4

Вопрос:

В DataObjects getCMSFields методе автоматически создаются все соответствующие поля CMS (это называется «строительные леса»). Однако в классах, которые расширяются SiteTree (т. Е. Страницы), этого не происходит.

Как я могу использовать эти леса полей формы на страницах?

Ответ №1:

Помимо вызова DataObject::getCMSFields (), как вы уже предлагали в своем собственном ответе, также возможно создать экземпляр scafolder напрямую:

 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', 'My Links', $foobar)
        );
        return $fields;
}
 

Это будет работать с любым объектом DataObject ($это должен быть экземпляр объекта DataObject). Страницы подкласса объектов данных.
restrictFields является необязательным, если не указано, он заполнит все поля, которые сможет найти.

Ответ №2:

Мы возвращаемся к DataObject полям с лесами и получаем их:

 use SilverStripeORMDataObject;
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;

    }
}