如何最后应用SilverStripe扩展?

时间:2016-02-28 06:53:45

标签: yaml silverstripe

我有一个特定的模块可以做一些事情来整理CMS。 我们称之为silverstripe-cleanup

此模块执行的操作之一是将MetaData字段移至他们自己的标签,我希望始终成为CMS中的最终标签。

因此,如果我的/httpdocs/silverstripe-cleanup/config/config.yml看起来如下所示,我如何确保此扩展程序适用于所有其他扩展程序?

---
Name: silverstripe-cleanup
---

SiteTree:
  extensions:
    - MetaDataMovementExtension

3 个答案:

答案 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