【问题标题】:SilverStripe extensions for GridFieldConfigGridFieldConfig 的 SilverStripe 扩展
【发布时间】:2016-07-25 11:46:06
【问题描述】:

我正在尝试创建一个类,以简化每次重新构建 GridFieldConfig 的过程。我对 CMS 中的几乎每个 GridFieldConfig 都使用以下设置:

$config = GridFieldConfig::create()->addComponents(
      new GridFieldToolbarHeader(),
      new GridFieldAddNewButton('toolbar-header-right'),
      new GridFieldTitleHeader(),
      ... etc
    )

与其每次都重复自己,我宁愿创建一个类,它返回一个带有上面components 的GridFieldConfig 实例。所以我创建了这个类,但是我不确定如何让它正常工作以及如何将它插入到框架/cms中。

<?php

class CustomGridConfig extends ??? {

function __construct() {

    $config = GridFieldConfig::create()->addComponents(
      new GridFieldToolbarHeader(),
      new GridFieldAddNewButton('toolbar-header-right'),
      new GridFieldTitleHeader()
      ... etc
    );

    return $config;

  }

}

最终它将在GridField 中实现如下:

GridField::create('Foo', 'Bar', $this->Foo(), new CustomGridConfig());

我不确定是否可以在这样的类中创建一个类,我也不太确定如何将这个类加载到 CMS 中。

这种设置的概念可行吗?如果是这样,怎么做?这将帮助我了解如何正确扩展框架/cms。

【问题讨论】:

  • 我建议使用 Dans 或 Jannes 解决方案,也许更多 Dans,因为它包含更多文档链接。

标签: silverstripe


【解决方案1】:

SilverStripe 已经附带了一组开箱即用的GridFieldConfigs,它可能已经满足您的需求。

要回答您的问题,您需要扩展 GridFieldConfig 并在构造函数中添加组件,如下所示:

class CustomGridConfig extends GridFieldConfig {
    public function __construct() {
        $this->addComponents(
            new GridFieldToolbarHeader(),
            new GridFieldAddNewButton('toolbar-header-right'),
            new GridFieldTitleHeader()
            ... etc
        );
    }
}

在您执行“刷新”(将 ?flush 附加到任何站点 URL)后,此类将可用 - 请参阅 the documentation on caching

the docs for information on the built in configs

【讨论】:

  • 我想知道我之前在哪里看到这些默认设置。很高兴看到它们出现在文档中。
【解决方案2】:

我认为您可以像这样扩展GridFieldConfig 来创建自定义GridFieldConfigs:

class CustomGridFieldConfig extends GridFieldConfig {

    public function __construct() {
        parent::__construct();
        $this->addComponent(new GridFieldToolbarHeader());
        $this->addComponent(new GridFieldAddNewButton('toolbar-header-right'));
        // etc...
    }

}

然后将其传递给您的GridField,如下所示:

GridField::create(
    'Foo', 
    'Bar', 
    $this->Foo(), 
    CustomGridFieldConfig::create()
);

查看文件 GridFieldConfig.php 中的课程 GridFieldConfig_RelationEditor 以获得灵感。

【讨论】:

    【解决方案3】:

    你的概念很好,设置是可行的。我只有一个普通的类,然后添加你的方法......作为构造函数应该没问题,但如果不是静态方法应该没问题......

    class CustomGridConfig {
        public static function create() {
            $config = GridFieldConfig::create()->addComponents(
                  GridFieldToolbarHeader::create(),
                  GridFieldAddNewButton::create('toolbar-header-right'),
                  GridFieldTitleHeader::create()
                  ... etc
                );
    
            return $config;
        }
    }
    

    【讨论】:

    • 这是扩展 GridFieldConfig 的一种有点奇怪的方法,因为您失去了扩展的任何优势,并且实际上只是创建了一个工厂类而不是新的 GridFieldConfig。这也失去了核心的好处,因为Object 不再在继承树中。
    • @DanHensby 这不是 gridfield 的扩展,这才是重点……它是一个实用程序类,用于将这些默认配置添加到 GridField。我考虑说扩展它......但认为这不是 OP 所要求的。我可能是错的:)
    • 正确的 Barry,我实际上只是将它用作一个实用程序类。但是,如果需要来自父类的任何属性,Dan 的解决方案在未来可能会更方便。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多