Welcome to the Cookbook

loading...

3.10.3 Elementos

Muchas aplicaciones tienen pequeños bloques de código de presentación que necesita ser repetido de página en página, algunas veces en diferentes lugares del diseño. CakePHP puede ayudarte a repetir partes de tu website que necesitan ser reutilizadas. Estar partes reutilizadas son llamadas Elementos. Anuncios, cajas de ayuda, controles de navegación, menús extras, formularios de login y llamadas están a menudo implementadas en CakePHP en forma de elementos. Un elemento es básicamente una minivista que puede ser incluido en otras vistas, en diseños, e incluso dentro de otros elementos. Los elementos pueden ser usados para hacer una vista más legible, situando el renderizado de elementos que se repiten en sus propios ficheros. Pueden también ayudarte a reutilizar fragmentos de contenido en tus aplicaciones.

Los elementos están en la carpeta /app/views/elements/ y tienen la extensión de archivo .ctp. Son mostrados usando el método element() de la vista.

<?php echo $this->element('cajaayuda'); ?>
  1. <?php echo $this->element('cajaayuda'); ?>

3.10.3.1 Passing Variables into an Element

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes:

Mas info sobre traduciones

Puedes pasarle datos a un elemento usando el segundo argumento de element():

<?php echo
$this->element('helpbox', 
    array("helptext" => "Oh, this text is very helpful."));
?>
  1. <?php echo
  2. $this->element('helpbox',
  3. array("helptext" => "Oh, this text is very helpful."));
  4. ?>

Dentro del archivo del elemento, todas las variables pasadas estan disponibles como miembros del array de parámetros (de la misma manera que set() en el controlador funciona con los archivos de las vistas). En el ejemplo siguiente, el archivo /app/views/elements/helpbox.ctp puede usar la variable $helptext.

<?php
echo $helptext; //outputs "Oh, this text is very helpful."
?>
  1. <?php
  2. echo $helptext; //outputs "Oh, this text is very helpful."
  3. ?>

La función element() combina opciones para el elemento con los datos a pasar en element. Las dos opciones son 'cache' y 'plugin'. Un ejemplo:

<?php echo
$this->element('helpbox', 
    array(
        "helptext" => "Esto es pasado al elemento como $helptext"
        "foobar" => "Esto es pasado al elemento como $foobar"
        "cache" => "+2 days" //setea el 'cacheo' a +2 días.
        "plugin" => "" //para renderizar un elemento desde un plugin
    )
);
?>
  1. <?php echo
  2. $this->element('helpbox',
  3. array(
  4. "helptext" => "Esto es pasado al elemento como $helptext"
  5. "foobar" => "Esto es pasado al elemento como $foobar"
  6. "cache" => "+2 days" //setea el 'cacheo' a +2 días.
  7. "plugin" => "" //para renderizar un elemento desde un plugin
  8. )
  9. );
  10. ?>

Para tener en cache distintas versiones del mismo elemento en una aplicación, provee una clave única de cache usando el siguiente formato:

<?php
$this->element('helpbox',
    array(
        "cache" => array('time'=> "+7 days",'key'=>'unique value')
    )
);
?>
  1. <?php
  2. $this->element('helpbox',
  3. array(
  4. "cache" => array('time'=> "+7 days",'key'=>'unique value')
  5. )
  6. );
  7. ?>

Puedes aprovechar bien los elementos usando requestAction(). La función requestAction() trae las variables desde una acción de controlador y las retorna como un array. Esto permite que tus elementos cumplan con el diseño MVC. Crea una acción de controlador que prepare las variables de la vista para tus elementos, luego haz la llamada requestAction() dentro del segundo parámetro de element() para proveerle al elemento las variables de vista desde tu controlador.

Para hacer esto, en tu controlador añade algo como lo siguiente, para el ejemplo de Post.

<?php
class PostsController extends AppController {
    ...
    function index() {
        $posts = $this->paginate();
        if (isset($this->params['requested'])) {
            return $posts;
        } else {
            $this->set(compact('posts'));
        }
    }
}
?>
  1. <?php
  2. class PostsController extends AppController {
  3. ...
  4. function index() {
  5. $posts = $this->paginate();
  6. if (isset($this->params['requested'])) {
  7. return $posts;
  8. } else {
  9. $this->set(compact('posts'));
  10. }
  11. }
  12. }
  13. ?>

Ahora en el elemento podemos acceder el modelo de posts paginados. Para tener los últimos cinco posts en una lista ordenada deberíamos hacer lo siguiente:

<h2>Latest Posts</h2>
<?php $posts = $this->requestAction('posts/index/sort:created/order:asc/limit:5'); ?>
<?php foreach($posts as $post): ?>
<ol>
    <li><?php echo $post['Post']['title']; ?></li>
</ol>
<?php endforeach; ?>
  1. <h2>Latest Posts</h2>
  2. <?php $posts = $this->requestAction('posts/index/sort:created/order:asc/limit:5'); ?>
  3. <?php foreach($posts as $post): ?>
  4. <ol>
  5. <li><?php echo $post['Post']['title']; ?></li>
  6. </ol>
  7. <?php endforeach; ?>

3.10.3.2 Cache de Elements

Puedes aprovechar el cache de vistas de CakePHP si aportas un parámetro 'cache'. Si lo ajustas a true, mantendrá en cache durante un día. De otro modo, puedes ajustar tiempos de caducidad alternativos. Lee Cache para más información sobre cómo fijar la caducidad.

<?php echo $this->element('helpbox', array('cache' => true)); ?>
  1. <?php echo $this->element('helpbox', array('cache' => true)); ?>

Si dibujas el mismo elemento más de una vez en una vista y tienes el cache activado, asegúrate de ajustar el parámetro 'key' con un nombre diferente cada vez. Esto evitará que cada sucesiva llamada sobreescriba el resultado almacenado en cache de la anterior llamada element(). Por ejemplo:

<?php
echo $this->element('helpbox', array('cache' => array('key' => 'first_use', 'time' => '+1 day'), 'var' => $var));

echo $this->element('helpbox', array('cache' => array('key' => 'second_use', 'time' => '+1 day'), 'var' => $differentVar));
?>
  1. <?php
  2. echo $this->element('helpbox', array('cache' => array('key' => 'first_use', 'time' => '+1 day'), 'var' => $var));
  3. echo $this->element('helpbox', array('cache' => array('key' => 'second_use', 'time' => '+1 day'), 'var' => $differentVar));
  4. ?>

Lo anterior asegura que ambos elementos son almacenados en cache de forma separada.

3.10.3.3 Utilizar Elements de un Plugin

El texto original ha cambiado despues que la traduccion. Por favor ayundanos a reslover este differencia. Puedes:

Mas info sobre traduciones

Si estás usando un plugin y deseas usar elements dentro de ese plugin, simplemente especifica el parámetro plugin. Si la vista está siendo dibujada para un controlador/acción de un plugin, se usará el elemento del plugin. Si el elemento no existe en el plugin, se buscará en la carpeta APP principal.

<?php echo $this->element('helpbox', array('plugin' => 'pluginname')); ?>
  1. <?php echo $this->element('helpbox', array('plugin' => 'pluginname')); ?>