CakePhp:防止某些视图上的渲染元素

时间:2013-10-14 17:06:38

标签: php cakephp cakephp-2.0

我想在所有页面上渲染一个元素,所以我在default.ctp中调用它。我想阻止它出现在两个或三个特定页面上。

我用Google搜索并找到了一个解决方案,它正在努力完成我想做的事情:

http://bakery.cakephp.org/articles/saidbakr/2012/04/20/prevent_render_layout_elements_with_the_render_of_some_views

在此解决方案中,通过在元素中放置以下代码来提取元素的名称和路径:

<?php
$e = explode('views/elements/',__FILE__);
$e[1] = str_replace('.ctp', '', $e[1]);
if (isset($this->preventElement) && $e[1] == $this->preventElement[$e[1]]) return false;
?>

并且您不希望转发该元素的视图,这行代码放置在:

<?php $this->preventElement['someElement'] = 'someElement';?>

此处使用了视图对象preventElement,但在测试时,我收到了消息preventElementHelper could not be found.

我在cakePhp文档中找不到对prventElement的任何引用。

2 个答案:

答案 0 :(得分:2)

为了渲染元素,你不要使用像这样的代码吗?:

echo $this->element('foobar');

要渲染它,为什么不把它放在if语句中,如下所示:

if(!isset($noDisplay)) {
    echo $this->element('foobar');
}

在此示例中,在控制器中设置变量$ noDisplay,这应该使if为false而不呈现。

答案 1 :(得分:1)

一种方法是只检查请求对象中的控制器和操作,然后确定是否应该显示该元素。

<?php
// app/View/Element/your_element_name.ctp

$controller = $this->request->params['controller'];
$action = $this->request->params['action'];

if (($controller == 'foo' && $action == 'bar') || ($controller == 'baz' && $action == 'bob')) {
    continue;
}

它不够优雅,但会完成这项工作。