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

时间:2011-07-20 22:08:24

标签: php zend-framework

我有一个普通的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。

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

由于

2 个答案:

答案 0 :(得分:3)

  

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

     
      
  1. 应用程序引导
  2.   
  3. 路由
  4.   
  5. 调度
  6.         

    Zend_Application只处理该列表中的第一项,   引导。那时,我们根本不知道请求是什么   是 - 在路由期间发生。它只是在我们排除了之后   我们知道请求了哪些模块,控制器和操作。

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

因此,您无法在引导程序中基于脚本后缀切换视图类,因为尚未发生路由。你可以早在routeShutdown的FrontController插件中做到这一点,但我觉得在Action Helper中做这件事更自然。确定视图脚本路径的常规方法是Zend_View和Zend_Controller_Action_Helper_ViewRenderer。这两个都可以在Action Helper中轻松获得。

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

首先,您需要注册您的助手。一个好地方就是你的观点在引导程序中:

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。

答案 1 :(得分:0)

以下内容: -

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%满意,但我没有时间进一步研究它。希望这会指出你正确的方向。