Zend Framework: Как мне изменить скрипт макета по умолчанию на что-то отличное от layout.phtml? - PullRequest
4 голосов
/ 04 февраля 2012

Я хотел бы назвать свой файл макета по умолчанию чем-то иным, чем layout.phtml, так как он на самом деле не описывает тип макета.Как я могу это сделать?Спасибо!

Ответы [ 2 ]

6 голосов
/ 04 февраля 2012

Из вашего файла Bootstrap.php вы можете сделать что-то вроде этого:

protected function _initLayoutName()
{
    // use sitelayout.phtml as the main layout file
    Zend_Layout::getMvcInstance()->setLayout('sitelayout');
}

Если вы хотите использовать другой макет для другого модуля, вам нужно зарегистрировать плагин в Bootstrap, и плагин должен содержать следующий код:

class Application_Plugin_LayoutSwitcher extends Zend_Controller_Plugin_Abstract
{
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request)
    {
        $module = $request->getModuleName(); // get the name of the current module

        if ('admin' == $module) {
            // set the layout to admin.phtml if we are in admin module
            Zend_Layout::getMvcInstance()->setLayout('admin');
        } else if ('somethingelse' == $module) {
            Zend_Layout::getMvcInstance()->setLayout('somethingelse');
        }
    }
}

Внутри вашего application.ini вы можете сделать это, чтобы установить скрипт макета:

resources.layout.layout = "layoutname"

Однако это не будет работать для каждого макета. Если вам нужно изменить макет на основе модуля, вам нужно будет использовать плагин, но вы можете использовать параметр в application.ini, чтобы установить имя макета по умолчанию.

3 голосов
/ 04 февраля 2012

Если вы хотите иметь определенный макет в зависимости от ваших модулей, вы можете создать плагин и зарегистрировать его в своем Boostrap:

<?php

class Plugin_LayoutModule extends Zend_Controller_Plugin_Abstract 
{
        /**
         * preDispatch function.
         * 
         * Define layout path based on what module is being used.
         */
        public function preDispatch(Zend_Controller_Request_Abstract $request)
        {
                $module = strtolower($request->getModuleName());
                $layout = Zend_Layout::getMvcInstance();

                if ($layout->getMvcEnabled())
                {
                        $layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $module . '/layouts/');
                        $layout->setLayout($module);
                }
        }
}

//Register it in your bootstrap.php     
    <?php
        defined('APPLICATION_PATH')
            or define('APPLICATION_PATH', dirname(__FILE__));
        ...

        Zend_Layout::startMvc();
        $frontController->registerPlugin(new Plugin_LayoutModule()); 
    ?>

РЕДАКТИРОВАТЬ:

чтобы установить свой макет в другой файл, используя файл .ini:

создайте layout.ini файл и вставьте в него:

[layout]
layout = "foo"
layoutPath = "/path/to/layouts"
contentKey = "CONTENT"

в файле начальной загрузки:

$config = new Zend_Config_Ini('/path/to/layout.ini', 'layout');

$layout = Zend_Layout::startMvc($config);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...