Cakephp: Проверьте, существует ли элемент представления - PullRequest
7 голосов
/ 10 марта 2011

Есть ли способ проверить, существует ли элемент для вида?Я хочу загрузить другой элемент в соответствии с категорией, к которой он принадлежит, но не во всех категориях есть элемент для него ...

Ответы [ 3 ]

9 голосов
/ 05 июня 2013

Начиная с 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 голосов
/ 16 марта 2011

установить имя элемента в контроллере:

$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 голосов
/ 16 марта 2011

Вы всегда можете загрузить элемент, относящийся к категории «по запросу», сообщив об этом из контроллера. Например:

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);
}
?>

На самом деле, есть даже другие способы добиться этого. Если элемент будет загружен в layout , то метод 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);
?>

Конечно, вы всегда должны будете указывать, но то же самое будет и для проверки, существует ли файл.

...