2012-09-19 1 views
1

silverstripe 내의 새 페이지에 기본 위젯을 설정하거나 하위 페이지가 처음에 부모로부터 위젯을 상속받을 수 있습니까? 전체 사이드 바는 내가 작업하고있는 사이트의 커스텀 위젯에 의해 채택되며, 클라이언트가 생성 할 새로운 (많은) 새로운 페이지에 기본적으로 표시되도록 선택할 수 있습니다. 그들은 여전히 ​​그들을 제거하거나 다른 것들을 추가 할 수있는 선택권이 있어야합니다.Silverstripe : 새 페이지에 기본 위젯 설정

문서를 검색했지만 가능하다는 표시가 없습니다.

:

답변

2

기본 위젯 우리는 기본값을 설정할 수 있습니다 어디 SiteConfig에 위젯 영역을 추가 한 다음 새 페이지로 SiteConfig에서 위젯을 복사 페이지에 populateDefaults을 사용할 수 있습니다 을 할 오히려 쉽게해야 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'); 

... 

파일을 파일


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를 사용