我有一个正常的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请求的基本工作流程如下:
- 应用程序引导
路由- 分派
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%满意,但是我没有时间进一步研究它。