我有一个特定的模块可以做一些事情来整理CMS。
我们称之为silverstripe-cleanup
。
此模块执行的操作之一是将MetaData
字段移至他们自己的标签,我希望始终成为CMS中的最终标签。
因此,如果我的/httpdocs/silverstripe-cleanup/config/config.yml
看起来如下所示,我如何确保此扩展程序适用于所有其他扩展程序?
---
Name: silverstripe-cleanup
---
SiteTree:
extensions:
- MetaDataMovementExtension
答案 0 :(得分:3)
要使模块成为最后一个加载模块,我们可以将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;
}
}
在SiteTree::getCMSFields
中调用updateCMSFields
挂钩。查看上面的getCMSFields
函数,updateCMSFields
函数将在我们调用parent::getCMSFields()
的函数顶部调用。之后我们再添加额外的字段。这意味着在添加额外字段之前将调用我们的扩展。这些额外字段将放在我们移动的元数据选项卡之后。
我们可以做的是将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();
}
包含在beforeUpdateCMSFields
中的其他字段:
updateCMSFields
这将确保在调用beforeUpdateCMSFields
之前添加我们的字段。
使用$self
时需要注意的一点是,我们需要在$this
块中使用beforeUpdateCMSFields
而不是<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/title"
android:layout_above="@+id/Button1"
android:id="@+id/scrollView"
android:background="@drawable/list">
<TableLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TableRow
android:layout_width="fill_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/Maths"
android:id="@+id/Maths"
android:layout_column="1"
android:textColor="#ffffff" />
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/MathsCheck"
android:layout_column="2"
android:buttonTint="#00ffff"
android:onClick="MathsClicked"/>
</TableRow>
<TableRow
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="@string/History"
android:id="@+id/History"
android:layout_column="1"
android:textColor="#ffffff"/>
<CheckBox
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/HistoryCheck"
android:layout_column="2"
android:onClick="HistoryClicked"
android:buttonTint="#00ffff" />
</TableRow>
</TableLayout>
</ScrollView>
。
答案 1 :(得分:0)
使用配置标题部分中的Before:和After:构造(定义之前的---行之间的位)。
比照来自silverstripe / installer的提示的默认mysite。
答案 2 :(得分:0)
就我而言,它的工作方式正好相反,即将After改成Before。 我想从'anothermodule'的扩展名之后加载'mymodule'的扩展名,首先我要:
---
Name: mymodule # (it is also in mymodule/)
After:
- "anothermodule/*" # (this is also in anothermodule/)
---
SiteConfig:
extensions:
- MyModuleSiteConfigExtension
但是它不起作用,所以我尝试了:
---
Name: mymodule
Before:
- "anothermodule/*"
---
SiteConfig:
extensions:
- MyModuleSiteConfigExtension
此更改后,加载顺序对我来说似乎是正确的(AnotherModuleSiteConfigExtension,MyModuleSiteConfigExtension),我不知道为什么它违背了我的全部理解。 那么就您而言,您可以尝试一下吗?
---
Name: silverstripe-cleanup
Before: "*"
---
SiteTree:
extensions:
- MetaDataMovementExtension