2016-04-17 2 views
3

Согласно the documentation of Silverstripe, наследованию шаблонов определяются следующим образом:Изменения шаблона порядка наследования в SilverStripe

  1. MySite (или другое название для папки сайта)
  2. отдельных модулей тема (например, темы/simple_blog)
  3. темы (например, темы/простой)
  4. модули (например, блог)
  5. рамочные

Теперь у меня есть сайт с несколькими темами. Ну, «разные» в том, что у них разные имена, но у них все еще много общего. Теперь я помещаю все общие файлы в папку/mysite/templates, но это означает, что если одна из моих тем нуждается в изменении одного из шаблонов, мне нужно удалить этот файл из общей папки и перенести его на ВСЕ различные папки тем. Таким образом, я получаю много дубликатов шаблонов.

В моем случае было бы полезно изменить порядок наследования, в результате чего определенная папка темы будет иметь приоритет над папкой/mysite. Таким образом, я мог бы просто скопировать шаблон, который должен быть изменен в папку темы и эту тему один будет использовать измененные один, а остальные продолжает использовать родовые один в/MySITE папки:

  1. ТЕМА (например, темы/простые)
  2. отдельных модулей темы (например, темы/simple_blog)
  3. MySite (или другое название, данные папки сайта)
  4. модулей (например, блог)
  5. рамочных

Мне также кажется, что это был более обманный способ сделать это, но я, вероятно, упускаю здесь какой-то важный момент. Тем не менее, возможно ли это сделать без взлома ядра?

С уважением, Joost

ответ

2

рендеринга наследования шаблонов кажется управляться двумя классами преимущественно, SSViewer (основной класс для обработки просмотра рендеринга) и Controller (что все остальные контроллеры наследовать).

Для просмотра изображений, SSViewer объект может take an array in its constructor for template inheritance. Это важно, потому что класс Controller фактически instantiates the SSViewer in a function called getViewer.

На данном этапе важно упомянуть обычный сайт SilverStripe, который обычно наследуется от ContentController, а не overrides the getViewer of Controller. Это не изменит слишком многое из того, что вам нужно написать, но важно, как низкоуровневое, что вы хотите применить.

Для того, что вы хотите применить к страницам в целом, вы бы указали на переопределение getViewer в Page_Controller. Что касается того, что конкретно вам нужно будет писать, это несколько зависит от всей структуры сайта.Я предположил бы, что ему потребуется, чтобы начать немного, как это, хотя:

public function getViewer($action) { 
    $viewer = Parent::getViewer($action); 
    $templates = $viewer->templates(); 

    //Do your processing that you need to here 
    //Set it back via: 
    //$viewer->setTemplateFile($type, $file); 
    //Alternatively, you can create a new SSViewer object 

    return $viewer; 
} 

Это будет немного экспериментов, чтобы выяснить, что именно вам нужно сделать для перетасовки вокруг данных, хотя это никогда не будет легко. После того, как вы начнете движение по этому пути, вы, вероятно, найдете ряд краевых случаев, когда это может не работать должным образом (например, включает шаблон).

+1

Спасибо. Конечно, я надеялся на «Ну, это легко!», Но это хорошая отправная точка :) – jberculo

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