根据扩展在zend中呈现不同的视图引擎


rendering different view engine in zend depending on extension

我有一个正常的phtml模板和另一个在HAML。在bootstrap。php:

protected function _initView()   
{
     $view = new Haml_View();
     $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
     $viewRenderer->setView($view);
     Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
     return $view    
}

我初始化使用我的Haml_View,但我想要的是,如果脚本文件名有一个扩展名。haml,它将使用Haml_View,如果没有,那么它将使用常规的Zend_view。

所以我想我的问题是,有没有办法找出当前视图脚本文件名将被使用?

谢谢

ZF MVC请求的基本工作流程如下:

  1. 应用程序引导
  2. 路由
  3. 分派

Zend_Application只处理该列表中的第一个项目,引导。当时,我们不知道具体的要求是什么这发生在路由过程中。只有在我们击溃他们之后我们知道被请求的模块、控制器和操作。

来源:http://weierophinney.net/matthew/archives/234-Module-Bootstraps-in-Zend-Framework-Dos-and-Donts.html

所以你不能在引导中根据脚本后缀来切换视图类,因为路由还没有发生。你可以早在routesshutdown的FrontController插件中做这件事,但我觉得在Action Helper中做这件事更自然。找出视图脚本路径的正常方法是在Zend_View和Zend_Controller_Action_Helper_ViewRenderer中。这两种方法都可以在Action Helper中轻松获得。

Zend_Controller_Action_Helper_ViewRenderer也是一个Action Helper,它需要在init之前进行初始化,所以让我们在init之后进行切换,在Action Helper的predispatch调用中。

首先,您需要注册您的助手。一个好地方是在你的视图的引导中:

protected function _initView()
{
    $view = new Haml_View();
    $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
    $viewRenderer->setView($view);
    Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
    return $view;
}

protected function _initHelpers()
{
    Zend_Controller_Action_HelperBroker::addHelper(
        new Haml_Controller_Action_Helper_ViewFallback()
    );
}

辅助程序看起来像这样:

class Haml_Controller_Action_Helper_ViewFallback extends Zend_Controller_Action_Helper_Abstract
{
    public function preDispatch()
    {
        /** @var $viewRenderer Zend_Controller_Action_Helper_ViewRenderer */
        $viewRenderer = $this->getActionController()->getHelper('ViewRenderer');
        /** @var $view Haml_View */
        $view = $viewRenderer->view;
        /**
         * what i want is if the script filename has an extension .haml,
         * it'll use Haml_view if not, then it'll use the regular Zend_view
         */
        $viewRenderer->setViewSuffix('haml');
        $script = $viewRenderer->getViewScript();
        if (!$view->getScriptPath($script)) {
            $viewRenderer->setView(new Zend_View());
            $viewRenderer->setViewSuffix('phtml');
            $viewRenderer->init();
        }
    }
}

如果默认路径中没有扩展名为haml的文件,我们假设有一个扩展名为phtml的文件,并相应地修改ViewRenderer。不要忘记再次初始化ViewRenderer

类似以下内容:-

if(!file_exists('path/to/view.haml'){
    $view = new Zend_View();
    $viewRenderer->setView($view);
}

可以工作,虽然我还没有测试过。

编辑:

你可以在你的控制器中试试:-

class IndexController extends Zend_Controller_Action {
    public function init() 
    {
        $paths = $this->view->getScriptPaths();
        $path = $paths[0];
        $script = $path . $this->getHelper('viewRenderer')->getViewScript();
        if(!file_exists($script)){
            $this->viewSuffix = 'hmal';
        }
    }
    public function indexAction() 
    {
    }
}  

我对$path = $paths[0]位不是100%满意,但是我没有时间进一步研究它。