2016-07-25 5 views
2

Я пытаюсь создать класс, который упрощает реорганизацию GridFieldConfig каждый раз. Я использую следующие настройки почти каждый GridFieldConfig в моей CMS:Расширения SilverStripe для GridFieldConfig

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

Вместо того, чтобы повторять себе каждый раз, я предпочел бы создать класс, который возвращает экземпляр GridFieldConfig с выше components. Поэтому я создал этот класс, но я не уверен, как заставить его работать должным образом и как подключиться к инфраструктуре/cms. plug.

<?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.

+0

Я бы предложил решение Dans или Jannes, возможно, больше Dans, поскольку оно содержит больше ссылок на документацию. – Barry

ответ

3

SilverStripe уже поставляется с набором GridFieldConfig с из коробки, которые могут уже делать то, что вам нужно.

Чтобы ответить на вопрос, который вы хотите расширить 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.

+1

Мне было интересно, где я раньше видел эти настройки по умолчанию. Замечательно, что они находятся в документации. – Faloude

1

Ваша концепция хорошая, и установка жизнеспособна. Я бы просто обычный класс, а затем добавить свой метод ... должно быть хорошо, как конструктор, но если не статический метод должен быть хорошо ...

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

     return $config; 
    } 
} 
+1

Это немного странный подход к расширению GridFieldConfig, поскольку вы теряете любое преимущество расширения и эффективно просто создаете фабричный класс, а не новый GridFieldConfig. Это также теряет преимущество ядра, потому что 'Object' больше не находится в дереве наследования. –

+0

@DanHensby это не расширение gridfield, которое является точкой ... это класс утилиты, который добавляет эти конфигурации по умолчанию в GridField. Я считал, что предлагаю продлить его ... но думал, что это не то, о чем спрашивал ОП. Я мог ошибаться :) – Barry

+0

Правильный Барри, я фактически использую его как просто класс полезности. Однако решение Dan может быть более удобным в будущем, если потребуются какие-либо свойства родительского класса. – Faloude

3

Я думаю, что вы можете создавать собственные GridFieldConfig с помощью расширения GridFieldConfig примерно так:

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_RelationEditor в файле GridFieldConfig.php для вдохновения.

Смежные вопросы