1

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

我用谷歌搜索并找到了一个解决方案,它试图做我想做的事情:

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.

prventElement 我在 cakePhp 文档中找不到任何参考。

4

2 回答 2

2

为了呈现一个元素,你不使用这样的代码吗?:

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

要渲染它,为什么不把它放在 if 语句中,像这样:

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

在此示例中,在控制器中设置变量 $noDisplay,这应该会使其为iffalse 并且不呈现。

于 2013-10-14T18:05:41.387 回答
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;
}

这是不优雅的,但会做的工作。

于 2013-10-14T18:11:18.600 回答