整理 UI,应用订单扩展

decluttering UI, order Extension gets applied

几年前我制作了一个 SilverStripe 网站,并在 Page.php 中添加了太多字段。我目前正在修改其中的一些内容,但无力重新发明该项目 - 现在在 SilverStripe 3.1.10 上。

我想为 Page Sub-类 整理 UI,不需要所有继承的字段,只需要一些扩展。

此扩展的外观示例

class NoClutter extends Extension {
    public function updateCMSFields(FieldList $fields) {
        $fields->removeFieldFromTab("Root.Main", "MenuTitle");
        $fields->removeFieldFromTab("Root.Main", "Workflow");
    }
}

config.yml

RedirectorPage:
  extensions:
    - NoClutter

这适用于 SiteTree 中添加的所有 类 字段(例如 MenuTitle 字段),但不适用于 [=14] 中添加的字段=](例如 Workflow 字段)。如果扩展在 UserDefinedForm 上,Workflow 也会被删除。但如果扩展名在 RedirectorPage 上,它就不起作用。另一方面,MenuTitle 在两个 类 中都被删除了。我猜这是关于秩序的。我的项目是 After: 'framework/','cms/',希望我可以在项目中进行类似 NoClutter 的扩展。

我怎样才能做到这一点,或者我还能如何解决这个问题?

您需要在 Page getCMSFields() 函数的末尾添加 $this->extend('updateCMSFields', $fields)

class Page extends SiteTree {

    // ...

    public function getCMSFields() {
        // call updateCMSFields after adding your fields
        SiteTree::disableCMSFieldsExtensions();
        $fields = parent::getCMSFields();
        SiteTree::enableCMSFieldsExtensions();

        // ...

        $this->extend('updateCMSFields', $fields);

        return $fields;
    }

}

$this->extend('updateCMSFields', $fields) 声明代码 updateCMSFields() 函数将在何处被调用。

您遇到的问题是 updateCMSFields() 在您将自定义字段添加到 Page getCMSFields() 函数之前被调用。因此,您试图在添加 Workflow 字段之前将其删除。这是因为 updateCMSFields 扩展挂钩是在父 SiteTree getCMSFields() 函数中声明的。

UserDefinedForm 通过在 getCMSFields() 的底部调用 $this->extend('updateCMSFields', $fields) 来解决这个问题。在调用 parent::getCMSFields() 之前需要 SiteTree::disableCMSFieldsExtensions() 才能使扩展挂钩工作。