我有一个普通的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。
所以我想我的问题是,有没有办法找出当前的视图脚本文件名将被使用?
由于
答案 0 :(得分:3)
ZF MVC请求的基本工作流程如下:
- 应用程序引导
- 路由
- 调度
醇>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%满意,但我没有时间进一步研究它。希望这会指出你正确的方向。