2016-07-06 5 views
2

Представьте себе макет структуры сайта/меню, как это:SilverStripe фиктивная страница/пункт меню

Главная
О нас
Услуги
__Peeling картофель
__Slicing картофель
__Baking картофель

Все пункты меню ссылаются на настоящую страницу со своим собственным URL-адресом и контентом. Но полужирный элемент - это просто пункт меню без ссылки, контента или URL-адреса, и только цель - сбросить подменю при наведении. SilverStripe не позволяет создавать такой объект страницы из коробки.

Я искал чистый, самый простой и наименее Hacky способ создать фиктивную страницу только для работы в качестве пункта меню, без содержания и в лучшем случае также без 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 пробкового на самом деле полезно, так как ваши URL, затем будет services/peeling-potatoes и т.д., который, скорее всего, лучше для целей SEO.

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