Eso te ocurre porque al variar las rutas estás llamando a un controlador u otro, y por lo tanto a un modelo u otro.
Los elementos son módulos independientes que ubicamos en nuestro layout y se usan para reutilizar una porción de nuestro sitio web que se muestra mucho.
Te voy a poner un ejemplo de como un elemento llama a un controlador para obtener unos datos el truco está en usar la función requestAction:
En nuestro elemento "latest_posts.ctp" debemos hacer una llamada mediante la función requestAction a una acción del controlador que queramos.
Código PHP:
<?php
<h2>Últimos posts</h2>
<?php $posts = $this->requestAction(array('controller'=>'posts','action'=>'latest')) ?>
<ol>
<?php foreach($posts as $post): ?>
<li>
<?php echo $html->link($post['Post']['title'],array('controller'=>'posts','action'=>'view',$post['Post']['id'])) ?>
</li>
<?php endforeach; ?>
</ol>
En nuestro controlador "posts_controller.php" analizamos si hubo una petición de este tipo "requestAction" y le retornamos los datos, OJO no se lo pasamos a la vista con $this->set() como estamos acostumbrados sino que se los retornamos.
Código PHP:
<?php
class PostsController extends AppController
{
public $name = 'Posts';
// últimos posts (para el elemento latest_posts)
public function latest()
{
// Si la petición fue realizada por medio de requestAction
if(isset($this->params['requested'])) {
return $this->Post->find(
'all',
array(
'order' => 'Post.created DESC',
'limit' => 5
)
);
}
}
Espero que te ayude en algo.
Ah y una cosa muy importante los elementos tienen la posibilidad de usar el sistema de caché, puedes poner esto para que esté cacheado al menos una hora y tu sitio web vaya mucho más rápido:
Código PHP:
echo $this->element('latest_posts',array('cache'=>'+1 hour'));
Venga un saludo.