2016-02-28 62 views
4

我有一個特定的模塊來完成整理CMS的一些工作。 我們稱之爲silverstripe-cleanup如何最後應用SilverStripe擴展名?

此模塊所做的一件事是將MetaData字段移動到他們自己的選項卡上,我想要總是是CMS中的最後一個選項卡。

因此,如果我的/httpdocs/silverstripe-cleanup/config/config.yml看起來如下所示,我該如何確保在其他所有人之後應用此擴展?

--- 
Name: silverstripe-cleanup 
--- 

SiteTree: 
    extensions: 
    - MetaDataMovementExtension 
+0

我** **覺得你可以做 '--- 名稱:silverstripe-清理 後: 「*」 ---' – munomono

回答

0

使用Before:和After:從配置標題部分(定義之前---行之間的位)構造。

cf.來自silverstripe/installer的默認mysite之一提示。

+0

我已經試過這樣做,雖然我總是感到困惑與之前:/之後:但是我有另一個模塊添加到另一個選項卡中,所以我嘗試了兩種變體(使用適當的縮進/新行)'Before:'other-module''和'After:''other-module'到沒有效果。唯一一次我設法從中得到任何東西的時候,我用其中的一個替換了''*''的'other-module',但是這只是拋出一個錯誤,說它被要求在前後都運行東西,沒有別的直接引用這個模塊,所以我很困惑。 – Hailwood

3

爲了使模塊的最後一個加載,我們可以添加類似After: "*"我們的模塊config.yml文件:

--- 
Name: silverstripe-cleanup 
After: "*" 
--- 

SiteTree: 
    extensions: 
    - MetaDataMovementExtension 

這將確保該模塊是所有其他人後調用。

將所有字段和製表符添加到頁面的CMS字段後,仍可能無法加載。這是因爲在頁面的getCMSFields函數中調用updateCMSFields的時間點。

說這是我們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()。之後,我們添加額外的字段。這意味着我們的擴展會在添加額外字段之前被調用。這些額外的字段將放在我們移動的元數據標籤後面。

我們可以做的是包裝我們另外的領域,我們每一個getCMSFieldsbeforeUpdateCMSFields

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時需要注意的一個重要事項是我們需要在beforeUpdateCMSFields塊內使用$self而不是$this

相關問題