gpt4 book ai didi

yaml - 最后如何应用SilverStripe扩展?

转载 作者:行者123 更新时间:2023-12-02 15:49:24 24 4
gpt4 key购买 nike

我有一个特定的模块,可以执行一些操作来整理 CMS。我们称之为 silverstripe-cleanup

此模块所做的事情之一是将 MetaData 字段移至其自己的选项卡,我希望该选项卡始终成为 CMS 中的最后一个选项卡。

因此,如果我的 /httpdocs/silverstripe-cleanup/config/config.yml 如下所示,我如何确保此扩展在所有其他扩展之后应用?

---
Name: silverstripe-cleanup
---

SiteTree:
extensions:
- MetaDataMovementExtension

最佳答案

要使模块成为最后一个加载的模块,我们可以在模块 config.yml 文件中添加类似 After: "*" 的内容:

---
Name: silverstripe-cleanup
After: "*"
---

SiteTree:
extensions:
- MetaDataMovementExtension

这应该确保该模块在所有其他模块之后被调用。

在将所有字段和选项卡添加到页面的 CMS 字段后,这仍然可能无法加载。这是因为在页面的 getCMSFields 函数中调用了 updateCMSFields

假设这是我们的 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)之一:

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 Hook 在 SiteTree::getCMSFields 中被调用。查看上面的 getCMSFields 函数,updateCMSFields 函数将在函数顶部调用 parent::getCMSFields().之后我们添加额外的字段。这意味着我们的扩展将在添加额外字段之前被调用。这些额外的字段将放置在我们移动的元数据选项卡之后。

我们能做的就是用 beforeUpdateCMSFields 将我们的附加字段包装在每个 getCMSFields 中。 :

    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 时需要注意的重要一点是,我们需要在 beforeUpdateCMSFields 中使用 $self 而不是 $this block 。

关于yaml - 最后如何应用SilverStripe扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35679694/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com