2011-03-10 18 views

Respuesta

9

A partir de la versión 2.3 de CakePHP puede utilizar el método de la elementExists Vista:

if($this->elementExists($name)) { ... } 

En las versiones anteriores de 2.x que puede hacer:

if($this->_getElementFilename($name)) { ... } 

Pero, lamentablemente, en la versión 1.3 parece que la única forma es conocer la ruta completa y hacer algo como:

if(file_exists($path . 'elements' . DS . $name . $ext)) { ... } 

T Esto es lo que hacen en el código fuente 1.3, pero hay cierta complejidad en obtener $path de varios complementos y verificar cada una de esas rutas. (Ver enlace más abajo.)

Fuentes:

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

+0

Traté de llamar a esto desde el controlador pero no funciona para la versión 2.4 –

+1

'elementExists @MohamadAli() 'es un método de Vista, por lo que no debería llamarse desde el controlador. – drmonkeyninja

+0

@drmonkeyninja necesito verificar antes de visualizar el contenido ¿Cómo puedo verificarlo desde el controlador? actualmente utilizo try/catch –

2

conjunto nombre del elemento en el controlador:

$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

Siempre se puede cargar un elemento específico para una categoría "a pedido" diciéndolo desde el controlador. Por ejemplo:

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

De hecho, incluso hay otras maneras de lograr esto. Si el elemento se va a cargar dentro de un diseño , el método set() que se muestra arriba se puede especificar desde la vista misma. O, incluso puede capturar de los parámetros URL, como:

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

Por supuesto, siempre se tiene que especificar, pero el mismo iría para comprobar si existe el archivo.