2016-07-06 50 views
2

想象一個網站結構/菜單佈局是這樣的:SilverStripe虛擬頁/菜單項

首頁
關於我們
服務
__Peeling土豆
__Slicing土豆
__Baking土豆

所有菜單項都鏈接到一個真實頁面,並帶有自己的URL和內容。但粗體項目只是一個沒有鏈接,內容和URL的菜單項,它的唯一目的是摺疊懸停的子菜單。 SilverStripe不允許您創建這樣的Page實體。

我在尋找最清潔,最簡單和最哈克的方式僅僅創建一個虛擬頁面作爲一個菜單項,沒有內容,並在最好的情況下也沒有一個URL蛞蝓(後者可能是難)。

回答

3

只需創建一個RedirectorPage並選擇第一個子頁面作爲重定向目標,即可在沒有任何附加代碼的情況下實現「虛擬」頁面。

就我個人而言,過去我使用了一個更簡單的「RedirectorPage」版本,如果直接訪問它,它會自動重定向到第一個子頁面。

例子:

class ChildRedirectorPage extends Page 
{ 
    private static $description = 'Page that has no content but automatically redirects to the first of its child-pages'; 

    public function ContentSource() { 
     if($firstChild = $this->Children()->First()) { 
      return $firstChild; 
     } else { 
      return $this; 
     }  
    } 

    public function Link($action = null) { 
     // prevent link "redirection" when we're in CMS 
     if (!is_subclass_of(Controller::curr(),'LeftAndMain')){ 
      if($firstChild = $this->Children()->First()) return $firstChild->Link($action); 
      else return parent::Link($action); 
     } 
    } 

    public function getCMSFields() { 
     $fields = parent::getCMSFields(); 
     $fields->removeByName('Content', true); 
     return $fields; 
    } 
} 

class ChildRedirectorPage_Controller extends Page_Controller 
{ 
    function init() { 
     parent::init(); 
     if($firstChild = $this->Children()->First()) { 
      $this->redirect($firstChild->Link(), 301); 
     }   
    } 
} 

我覺得URL蛞蝓實際上是有益的,因爲你的網址,於是將services/peeling-potatoes等,這是最有可能更好的搜索引擎優化的目的。