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

该模块要做的一件事是将MetaData字段移到它们自己的选项卡上,我想一直将其作为CMS中的最终选项卡。

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

---
Name: silverstripe-cleanup
---

SiteTree:
  extensions:
    - MetaDataMovementExtension

最佳答案

为了使模块成为最后一个加载模块,我们可以在模块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

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

10-10 23:38