2010-01-08 6 views
0

Je dois créer une vue qui montre des données indépendantes de plusieurs tables. Je suis nouveau sur cakePHP (et PHP en général) et pour autant que je sache, chaque modèle est une représentation d'une seule table. Je sais que nous pouvons définir des associations avec d'autres tables, mais dans mon cas, je dois donner accès à des données qui n'ont aucun rapport avec le modèle dont la vue sera ouverte.Comment créer une méthode nécessitant des données sans rapport à partir de plusieurs tables dans CakePHP

Exemple: Dites qu'il existe une plateforme de blogs et que nous sommes en train de consulter un post. (Modèle - Poste, fonction - Lire). Maintenant, je veux une liste des abonnés (Say) de notre newsletter. Ces données ne sont pas liées au modèle et par conséquent, je ne pense pas que les données seront accessibles au contrôleur. S'il vous plaît dites-moi comment obtenir ces données directement.

Répondre

3

Dans votre automate, lors de la définition de la classe, ajoutez un attribut de classe $ uses pour indiquer à votre contrôleur les modèles à charger.

class SomeController extends AppController { 
    public $name  = 'Some'; 
    public $uses  = array('Model1', 'Model2');} 

Et puis, dans votre méthode, vous appelez simplement ce modèle:

$result = $this->Model1->find('all'); 
$result2= $this->Model2->find('all'); 
0

Si vous allez l'utiliser dans deux fonctions dans le même modèle, vous devez le spécifier à l'intérieur du contrôleur via:

$uses = array('Post', 'Suscriber'); 

Maintenant, si elle est un elemnt de la mise en page, vous devrait le mettre sur un élément.

De l'avis:

$ this-> renderElement ('suscribers-list');

Vous devez maintenant créer un fichier suscribers-list.ctp dans les vues/éléments. De là, importez le modèle:

App::Import('Model', 'Suscriber'); 
$this->Suscriber = new Suscriber(); 

$suscribers = $this->Suscriber->find('all'); 
pr($suscribers); 

Ce n'est pas joli, mais c'est ce qui fonctionne pour moi. Je ne sais pas s'il y a un autre moyen.

0

Vous pouvez le faire avec moins de code, et un peu plus simple. Vous pouvez utiliser le AppController::loadModel('ModelName'). (reference) Cette méthode prend soin de l'étape de initilization que metrobalderas suggère donc alors si devient

$this->loadModel('Subscriber'); 
$subscribers = $this->Subscriber->find('all', ...); 

Il y avait une fonction qui a été dépréciée en 1.2 qui était juste loadModel('ModelName'); mais pas la méthode AppController. Il convient également de noter que vous ne devez pas charger directement des modèles dans un élément, car cela ne correspond pas vraiment à l'esprit de MVC. Gardez cela dans le modèle. En utilisant cette méthode plutôt le var $uses = array('ModelName'); réduit les frais généraux des modèles non liés dans les méthodes qui n'en ont pas besoin, ainsi que réduit certaines des complications qui peuvent survenir lors de l'utilisation de cette approche.

2

Il y a plusieurs façons de procéder. Voici le synopsis de gwoo sur la façon dont ils diffèrent et quand utiliser:

App :: import() inclut uniquement le fichier. Ainsi, vous devriez créer une nouvelle instance à chaque fois. Ce n'est pas recommandé

ClassRegistry :: init() charge le fichier, ajoute l'instance à une carte d'objet et renvoie l'instance.C'est un moyen facile et pratique d'accéder aux modèles .

Contrôleur :: loadModel(); Utilise ClassRegistry :: init() ajoute le modèle à une propriété du contrôleur et autorise également l'activation de persistModel .

Pendant que vous « pouvez » faire aucune de ces choses , vous devriez vous demander pourquoi vous créez des dépendances sur modèles qui ne sont pas naturelles au contrôleur . Si vous "avez" à faire utiliser l'un de ceux-ci, alors je le ferais en dans l'ordre inverse de la façon dont je l'ai décrit eux. IE, Controller :: loadModel() puis CR :: init() et en fait je n'ai jamais utilisé App :: import() pour les modèles. Espérons cela aide.

Voir cette page pour la discussion complète: http://groups.google.com/group/cake-php/browse_thread/thread/137c57b4eb010317

En outre, d'autres réponses ont suggéré d'inclure le modèle indépendant dans le tableau $uses, mais je voudrais éviter cette méthode comme il est vraiment destiné à dire modéliser la table de base de données à utiliser et implique que ses membres sont au cœur du but du modèle, ce qui n'est pas le cas dans la situation que vous décrivez.

Questions connexes