Для того, чтобы модуль, последний для загрузки мы можем добавить что-то вроде After: "*"
в наш файл модуля config.yml
:
---
Name: silverstripe-cleanup
After: "*"
---
SiteTree:
extensions:
- MetaDataMovementExtension
Это должно обеспечить этот модуль вызывается после того, как все остальные.
Это все еще может не загрузиться после того, как все поля и вкладки будут добавлены в поля CMS страницы. Это связано с точкой, в которой updateCMSFields
вызывается в функции getCMSFields
страницы.
Скажи это наша updateCMSFields
функция:
class MetaDataMovementExtension extends Extension {
function updateCMSFields($fields) {
if ($metadataFields = $fields->fieldByName('Root.Main.Metadata')) {
$fields->removeFieldFromTab('Root.Main', 'Metadata');
$fields->addFieldToTab('Root.Metadata', $metadataFields);
}
}
}
И это один из наших классов:
class HomePage extends Page {
// ...
public function getCMSFields()
{
$fields = parent::getCMSFields();
$slidesField = GridField::create(
'Slides',
'Slide',
$this->Slides(),
GridFieldConfig_RecordEditor::create()
);
$fields->addFieldToTab('Root.Slides', $slidesField);
$fields->addFieldToTab('Root.Column', TextField::create('ColumnTitle', 'Title'));
return $fields;
}
}
updateCMSFields
крюк вызывается в SiteTree::getCMSFields
. Посмотрев на нашу функцию getCMSFields
, функция updateCMSFields
будет вызываться в верхней части нашей функции в точке, которую мы называем parent::getCMSFields()
. После этого добавим дополнительные поля. Это означает, что наше расширение будет вызвано до добавления дополнительных полей. Эти дополнительные поля будут размещены после вкладки перемещенных метаданных.
Что мы можем сделать, это обернуть наши дополнительные поля в каждом из наших getCMSFields
с beforeUpdateCMSFields
:
public function getCMSFields()
{
$self =& $this;
$this->beforeUpdateCMSFields(function ($fields) use ($self) {
$slidesField = new GridField(
'Slides',
'Slide',
$self->Slides(),
GridFieldConfig_RecordEditor::create()
);
$fields->addFieldToTab('Root.Slides', $slidesField);
$fields->addFieldToTab('Root.Column', TextField::create('ColumnTitle', 'Title'));
});
return parent::getCMSFields();
}
Это гарантирует, что наши поля добавлены до updateCMSFields
называется.
Важная вещь, чтобы обратить внимание при использовании beforeUpdateCMSFields
является то, что мы должны использовать $self
вместо $this
внутри нашего beforeUpdateCMSFields
блока.
I ** думаю ** вы можете сделать '--- Имя: SilverStripe-очистка После: "*" ---' – munomono