2010-09-12 15 views
13

Tengo un controlador/modelo para proyectos. así que esto controla el modelo de proyectos, etc., etc. Tengo una página de inicio que está siendo controlada por el controlador de páginas. Quiero mostrar una lista de proyectos en la página de inicio. ¿Es tan fácil como hacer:CakePHP: uso de modelos en diferentes controladores

function index() { 
    $this->set('projects', $this->Project->find('all'));   
} 

supongo no lo que yo estoy haciendo:

Undefined property: PagesController::$Project 

Alguien me puede orientar en la dirección correcta por favor,

Jonesy

+0

una pregunta similar se ha hecho antes en: http://stackoverflow.com/questions/2895098/how-to-load-a-model/2895136 – Vicer

Respuesta

55

Debe cargar cada modelo en la clase de controlador mediante la variable $uses, por ejemplo:

var $uses = array('Project'); 

o en la acción método de uso

$this->loadModel('Project'); 
+0

si parece haber funcionado gracias! una pregunta más sin embargo, ¿la usaría en la vista como tal ?: foreach ($ projects as $ project) { \t \t \t echo $ project ['title']; \t \t \t echo '
'; \t \t} porque me está diciendo que el título no está definido – iamjonesy

+0

No puedo decirte esto ahora porque no tengo código para ejecutar ahora, pero por favor var_dump() el contenido que devuelve find() y ver dónde exactamente es 'título' ubicado en el árbol. –

+0

lo obtuvo foreach ($ projects as $ project) { \t \t \t echo $ proyecto ['Proyecto'] ['título']; \t \t \t echo '

'; \t – iamjonesy

0

Para mí es más razonable utilizar requestAction. De esta manera, la lógica queda envuelta en el controlador.

En el ejemplo:

// en sus proyectos de controlador:

class ProjectsController extends AppController { 
    function dashboard(){ 
    $this->set('projects', $this->Project->find('all')); 
    } 
    $this->render('dashboard'); 
} 

tener en cuenta que es necesario crear dashboard.ctp en/app/views/proyectos de curso.

En vista de panel de la página (probablemente /app/views/pages/dashboard.ctp) Añadir:

echo $this->requestAction(array('controller'=>'projects', 'action'=>'dashboard')); 

De esta manera la lógica permanecerá en el controlador del proyecto. Por supuesto, puede solicitar/proyectos/indexar, pero el manejo de la paginación será más complicado.

más sobre requestAction(). pero tenga en cuenta que debe usarlo con cuidado. Podría ralentizar su aplicación.

+1

Me parece que el uso de requestAction" arruina "la estructura de MVC. La única razón para usarlo podría ser en elementos. –

+0

De acuerdo, pero de esta manera encapsula el módulo en un complemento separado, por lo que se puede reutilizar. –

+0

@OfirBaruch Creo que no arruina la estructura de MVC en todas partes. Depende de dónde use requestAction(). Si lo usa en Ver (página o elemento) está bien, pero en otro lugar, sí, arruina la estructura de MVC. – ozanmuyes

2

En mi opinión, la forma correcta de hacer esto es agregar una función a su modelo actual que ejemplifica el otro modelo y devuelve los datos necesarios.

He aquí un ejemplo que devuelve datos del modelo de proyecto en un modelo llamado Ejemplo y llama a los datos en el controlador Ejemplo:

Uso de proyecto modelo dentro Ejemplo Modelo:

<?php 
/* Example Model */ 
App::uses('Project', 'Model'); 
class Example extends AppModel { 

    public function allProjects() { 
     $projectModel = new Project(); 
     $projects = $projectModel->find('all'); 
     return $projects; 
    } 

} 

Volviendo esos datos en Ejemplo Controlador

// once inside your correct view function just do: 
$projects = $this->Example->allProjects(); 
$this->set('projects', $projects); 

En la vista Ejemplo

<?php 
// Now assuming you're in the .ctp template associated with 
// your view function which used: $projects = $this->Example->allProjects(); 
// you should be able to access the var: $projects 
// For example: 
print_r($projects['Project']); 

¿Por qué es esta práctica "mejor" que la carga de ambos modelos en el controlador? Bueno, el modelo del Proyecto es heredado por el modelo de Ejemplo, por lo que ahora los datos del Proyecto se vuelven parte del alcance del modelo de Ejemplo.(Lo que esto significa en el lado de la base de datos de las cosas es que las 2 tablas se unieron usando las cláusulas SQL JOIN).

O como dice el manual:

Una de las características más potentes de CakePHP es la habilidad para enlazar el mapeado relacional proporcionado por el modelo. En CakePHP, los enlaces entre los modelos se manejan a través de asociaciones. La definición de relaciones entre diferentes objetos en su aplicación debe ser un proceso natural. Por ejemplo: en una base de datos de recetas, una receta puede tener muchas reseñas, las revisiones tienen un solo autor y los autores pueden tener muchas recetas. Definir la forma en que funcionan estas relaciones le permite acceder a sus datos de una manera intuitiva y poderosa. (source)

Cuestiones relacionadas