2012-09-19 354 views
1

是否有可能爲銀色條紋內的新頁面設置默認窗口小部件,還是讓子頁面最初從父窗口繼承它們的窗口小部件?整個側欄被我正在工作的網站中的自定義小部件佔用,並且在客戶機將創建的(許多)新頁面上默認顯示少數選定的小部件會很好。他們仍然可以選擇刪除它們或添加其他任何選項。Silverstripe:在新頁面上設置默認窗口小部件

我搜查了文檔,沒有發現任何可能的指標。

回答

2

默認控件應該是相當容易做到 我們可以添加小工具區域的SiteConfig在那裏你可以設置的默認值,然後用populateDefaults頁面,以便從SiteConfig小部件複製到新的頁面:

文件mysite/code/mysiteSiteConfigDecorator.php

class mysiteSiteConfigDecorator extends DataObjectDecorator { 
    public function extraStatics() { 
     return array(
      'has_one' =>array(
       'DefaultWidgets' => 'WidgetArea' 
      ), 
     ); 
    } 
    public function updateCMSFields(FieldSet &$fields) { 
     $fields->removeByName('Theme'); 
     $fields->addFieldToTab('Root', new Tab('DefaultWidgetsTab', _t('SiteConfig.DefaultWidgetsTab', 'Default Widgets for new Pages'))); 
     $fields->addFieldToTab("Root.DefaultWidgetsTab", new WidgetAreaEditor("DefaultWidgets")); 
    } 
} 

文件mysite/_config.php

... 

Object::add_extension('SiteConfig', 'mysiteSiteConfigDecorator'); 

... 

文件mysite/code/Page.php

class Page extends SiteTree { 
    public static $has_one = array(
     'Sidebar' => 'WidgetArea' 
    ); 
    public function populateDefaults() { 
     parent::populateDefaults(); 
     if ($this->Sidebar()) { 
      $widgetArea = new WidgetArea(); 
      $widgetArea->write(); 
      $this->SidebarID = $widgetArea->ID; 
     } else { 
      $widgetArea = $this->Sidebar(); 
     } 
     $siteConfig = SiteConfig::current_site_config(); 
     if ($siteConfig && $siteConfig->DefaultWidgets() && $siteConfig->DefaultWidgets()->Widgets()->exists()) { 
      foreach ($siteConfig->DefaultWidgets()->Widgets() as $widget) { 
       $widget->ID = 0; 
       $widget->write(); 
       $widgetArea->Widgets()->add($widget); 
      } 
     } 
    } 
    public function getCMSFields() { 
     $fields = parent::getCMSFields(); 
     $fields->addFieldToTab("Root.Content.Widgets", new WidgetAreaEditor("Sidebar")); 
     return $fields; 
    } 
} 

... 

然而,從父應對不那麼容易。 但是,如果你願意,你也可以只檢查如果當前頁面有小部件如果不是,顯示父窗口小部件,像這樣:

class Page extends SiteTree { 
    ... 
    public function SidebarForTemplate() { 
     if ($this->Sidebar()) 
      return $this->Sidebar(); 
     elseif ($this->Parent()) 
      return $this->Parent()->SidebarForTemplate(); 
     return false; 
    } 
    ... 
} 

,然後使用模板

$ SidebarForTemplate
相關問題