1

我目前有 Zend 设置以在每个模块的 view/scripts/layout.phtml 文件(即:/application/modules/moduleName/scripts/layout.phtml)中查找布局脚本。这是通过在 application.ini 文件 () 中将 layout[] 设置为空(空白resources.layout[] =

问题是许多模块可能共享相同的布局。我不想将完全相同的布局复制到使用它的每个模块中。我知道我可以通过设置特定路径来设置所有内容以使用一个布局脚本,resources.layout.layoutpath = /layoutPath并且所有内容都将使用 /layoutpath/layout.phtml,并且我知道我可以通过使用设置单个页面(或在 init 中的整个控制器)$this->_helper->layout->setLayout('foobaz');

问题是某些模块会有不同的布局,而不是“标准”的,我不想在控制器或动作的基础上设置它。我想为整个模块设置它,设置在一个地方(或者通过代码/Zend 自动直观地计算出来)。理想情况下,它将按照当前的方式设置,但如果模块没有自己的 layout.phtml,它将使用默认模块的布局。

那么......我该怎么做呢?

4

3 回答 3

2

有几种解决方案,选择自己的策略

1 扩展动作控制器

class App_Controller_Action extends Zend_Controller_Action 
{

    public function init()
    {
        parent::init();

        $moduleName = $this->getRequest()->getModuleName();
        $layoutPath = APPLICATION_PATH . '/modules/' . $moduleName . '/layouts';
        if (is_dir($layoutPath)) {
            $this->view->addScriptPath($layoutPath);
        }    
    }
 }

IndexController extends App_Controller_Action ...
如果目录中存在布局文件,然后照常执行APPLICATION_PATH . '/modules/' . $moduleName . '/layouts'- 它将使用它而不是默认布局

2 你可以写前端控制器插件

class App_Controller_Plugin_ModuleSwitcher extends Zend_Controller_Plugin_Abstract
 {
     protected $_view = null;

     public function routeShutdown(Zend_Controller_Request_Abstract $request)
     {
         $moduleName = $request->getModuleName();

         Zend_Layout::startMvc();
         $layout = Zend_Layout::getMvcInstance();
         $layout->setLayoutPath(APPLICATION_PATH . '/modules/' . $moduleName . '/layouts')->setLayout($moduleName);

         return $request;
     }
 }

并且不要忘记谷歌寻找其他解决方案;)

于 2009-12-18T23:02:05.980 回答
1

您可以通过几个步骤设置自己的布局选择器

第1步:使模块管理员和默认。

第 2 步:在每个模块中创建布局文件夹作为 admin/layouts/scripts 和 default/layouts/scripts 放入 layout.phtml

第 3 步:从 Application/layouts/scripts 中删除 layout.phtml 文件。

第 4 步:在库中创建 Plugin 文件夹并将 Plugin.php 设置为

class Plugin_Layout extends Zend_Controller_Plugin_Abstract 
{

   public function preDispatch(Zend_Controller_Request_Abstract $request)

    {
        $layoutPath = APPLICATION_PATH . '/modules/' . $request->getModuleName() . '/layouts/scripts/';
        Zend_Layout::getMvcInstance()->setLayoutPath($layoutPath);
    }
}   

第 5 步:

打开 Application/configs/Appication.ini 文件并将其编辑为

;resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts/"
resources.layout.layout = "layout"
;register your plugin

autoloaderNamespaces[] = "Plugin"
resources.frontController.plugins[] = "Plugin_Layout"

第 6 步:

打开 bootstrap 文件 Application/Bootstrap 把代码放在里面

protected function _initAutoload()

 {

        $loader = new Zend_Application_Module_Autoloader(array(
                    'namespace' => '',
                    'basePath' => APPLICATION_PATH . '/modules/'
                ));

        return $loader;
    }

    protected function _initPlugins()

{

        $this->bootstrap('frontcontroller');
        $fc = $this->getResource('frontcontroller');
        $fc->registerPlugin(new Plugin_Layout());
}
于 2012-08-18T04:59:25.080 回答
0

最快的解决方案可能是创建一个符号链接,将模块布局文件指向默认布局。这在 Windows 上不起作用,并且更难维护。

更好的是,在 Bootstrap 中创建一个方法来设置布局。

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function _initLayoutScript(){
        //ensure layout is setup
        $this->bootstrap(array('layout', 'FrontController'));

        $layout= $this->getResource('layout');

        $front = $this->getResource('FrontController');

        //do something with $layout and $front - set layout script/path etc based on request 
        //You could use file_exists to detect module layout scripts 

    }

}

有关详细信息,请参阅http://framework.zend.com/manual/en/zend.application.quick-start.html#zend.application.quick-start.resources 。

最后,您可以编写自己的应用程序资源以与 Zend_Application 一起使用。

于 2009-12-09T18:12:22.733 回答