#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;
}
}