拥有多个layout情况下,禁止输出它的处理方式
当项目中存在有多个layout情况下的时候(这种情况蛮多的,前台后台这就是两个了)。
我们假设后台使用的是默认layout,那么前台我是这样处理的,写在module.php文件中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public function onBootstrap($e) { $app = $e->getParam('application'); $app->getEventManager()->attach('dispatch', array($this, 'setLayout')); } public function setLayout($e) { $matches = $e->getRouteMatch(); $controller = $matches->getParam('controller'); if (false === strpos($controller, __NAMESPACE__)) { return; } $viewModel = $e->getViewModel(); $viewModel->setTemplate('site/layout'); } |
这样是可以使用当前设置的layout了,假如我在这个模块的下面的页面显示中想通过ajax调用其中的一个Action显示,只显示对应的模板内容,而不显示layout,我们该如何做呢。
可能你会说,使用如下代码
1 2 3 4 5 6 |
$viewModel = new ViewModel(); $viewModel->setTerminal(true); $array = array(); ………… return $viewModel->setVariables($array); |
这在系统中只有一个默认layout下是没问题的,当时超过一个的时候,怎么设置都无法禁止layout的显示,也许是我的方法不对或者是其他原因吧。既然不管用,我们该如何处理呢?
回到最上面的代码,我们需要做一下修改(module.php文件中的),将
1 2 |
$viewModel = $e->getViewModel(); $viewModel->setTemplate('site/layout'); |
修改为
1 2 3 4 5 6 |
$viewModel = $e->getViewModel(); if($e->getRequest()->isXmlHttpRequest()) { $viewModel->setTerminal(true); } else { $viewModel->setTemplate('site/layout'); } |
这是什么意思呢,当有ajax请求时,禁用layout,然后我们在去看我们调用的ajax显示内容,ok了,去除了layout。还不要高兴的太早,在火狐浏览器下用firebug查看ajax返回值时,会发现返回值中竟然带有默认layout的信息。
这时我们就需要再一次在对应的ajax调用的Action中,加入如下代码了
1 2 3 4 5 6 |
$viewModel = new ViewModel(); $viewModel->setTerminal(true); $array = array(); ………… return $viewModel->setVariables($array); |
这样就不会有问题了。