CakePHP:检查视图元素是否存在

7

有没有一种方法可以检查视图中是否存在元素?我想根据元素所属的类别加载不同的元素,但并不是所有类别都有相应的元素...

3个回答

10
自从CakePHP 2.3版本起,您可以使用View的elementExists方法:
if($this->elementExists($name)) { ... }

在旧版本的2.x中,您可以这样做:
if($this->_getElementFilename($name)) { ... }

很遗憾,在1.3版本中,似乎唯一的方法是要知道完整路径并执行如下操作:
if(file_exists($path . 'elements' . DS . $name . $ext)) { ... }

这就是他们在1.3源代码中所做的,但是从各种插件获取$path并检查每个路径存在一些复杂性。(参见下面的链接。)
来源:

http://api.cakephp.org/2.3/class-View.html#_elementExists

http://api.cakephp.org/2.0/source-class-View.html#722

http://api.cakephp.org/1.3/source-class-View.html#380


我尝试从控制器调用它,但对于2.4版本不起作用。 - Mohamad Ali
1
@MohamadAli elementExists() 是一个视图方法,因此不应该从控制器中调用。 - drmonkeyninja
@drmonkeyninja 我需要在渲染视图之前进行检查,我该如何从控制器中检查?目前我使用try/catch。 - Mohamad Ali
@MohamadAli 这应该作为一个问题开放,这样回答会更容易。分享链接,我会尝试为您解答。 :-) - drmonkeyninja
@drmonkeyninja,您能否检查一下这个问题?http://stackoverflow.com/questions/31211446/cakephp-check-template-file-exist-or-not - Mohamad Ali

1

在控制器中设置元素名称:

$default_element = 'my_element';
$element = 'my_cat_element';

if ($this->theme) {
   $element_path = APP . 'views' . DS . 'themed' . DS . $this->theme . 'elements' . DS . $element . DS . $this-ext;
} else {
   $element_path = APP . 'views' . DS . 'elements' . DS . $element . $this-ext;
}
if (!file_exists($element_path)) {    
   $element = $default_element;
}

0

您可以通过从控制器中告诉它来“按需”加载特定于类别的元素。例如:

Within Controller Action:  
$this->set('elementPath', "directory_name/$categoryName");

Within the View (this can also be tried exactly within a Layout):
<?php
if (!empty($elementPath)) { // you can also set a default $elementPath somewhere else, just in case
echo $this->element($elementPath);
}
?>

事实上,还有其他方法可以实现这一点。如果元素将在布局中加载,则可以从视图本身指定上述set()方法。或者,甚至可以从URL参数中获取它,例如:
Within the View or Layout:
<?php
$elementPath = $this->params['url']['category']; // note that the param array can vary according how you set the url; see http://book.cakephp.org/#!/view/963/The-Parameters-Attribute-params
echo $this->element($elementPath);
?>

当然,你总是需要指定,但检查文件是否存在也是如此。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接