Как настроить несколько макетов в Zend Framework. Например. Общедоступный / Вход / Различные комбинации модулей - PullRequest
2 голосов
/ 19 января 2011

Я знаю и использовал очень простые макеты Zend Framework, где я использовал 1 макет по всему сайту. Но теперь мне нужна более промежуточная / организованная настройка.

  • Публичный макет сайта будет иметь div#mainContent, занимающий целые 12 столбцов (используя 960gs)
  • Зарегистрированный сайт будет иметь div#mainContent, занимающий 9 столбцов + боковую панель с 3 столбцами
  • На боковой панели зашедшего на сайт сайта разные страницы могут содержать различные модули (не модули Zend Framework, а скорее «ящики / виджеты»)
  • У них тоже будут разные навигационные меню

Я подумываю использовать 1 базовый макет, в котором 2 суб-макета будут «расширяться». Базовый макет будет просто содержать <html> объявления headScripts и т. Д. До <body>, тогда подуровни будут содержать определения для переноса divs div.grid_12, grid_9, grid_3. Как я могу реализовать это «расширение», в принципе, я просто хочу повторно использовать код

Также, каков хороший способ визуализации боковых панелей / виджетов

Ответы [ 2 ]

9 голосов
/ 19 января 2011

Я переключаюсь между макетами в зависимости от субдомена моего сайта.

Вот плагин макетов, который я использую ...

class App_Layout_Controller_Plugin_Layout extends Zend_Layout_Controller_Plugin_Layout
{

    public function preDispatch(Zend_Controller_Request_Abstract $request)
    {
        $layout = $this->getLayout();
        $filename = $layout->getLayoutPath() . '/' . $request->getModuleName() . '.' . $layout->getViewSuffix();

        //check if the layout template exists, if not use the default layout set in application.ini
        if (file_exists($filename))
        {
            $this->getLayout()->setLayout($request->getModuleName());
        }
    }

}

Конечно, вы можете изменить это дляваши собственные потребности.

Убедитесь, что вы правильно настроили свой application.ini, включая элементы, подобные следующим ...

resources.layout.layout = "default"
resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
resources.layout.pluginClass = "App_Layout_Controller_Plugin_Layout"

В моем случае у меня есть:

default.phtml, admin.phtml, clients.phtml

Надеюсь, это поможет ...
Ангел

2 голосов
/ 07 сентября 2011

То, как мы это делаем, я не уверен, что это лучший подход, - это установить текущий макет в методе init (), доступном на каждом контроллере.

Так, например, в случае, если у нас есть этот URL: www.mysite.com/social/

class SocialController extends BaseController
{
    public function init(){
        $layout = $this->_helper->layout();
        $layout->setLayout('social');
    }
}

Затем в config.ini:

resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"

Ив файле resources.layout.layoutPath

определен файл socia.phtml.
...