web-dev-qa-db-fra.com

L'appel de la méthode du modèle à partir de la vue fonctionne, mais pas à partir du contrôleur

J'essaie d'appeler la méthode du modèle depuis le contrôleur.

controller.php

if($view='myview'){   
      $model= $this->getModel('mymodel');  //on echo-prints class name of model
      $locations= $model->get('Locations');
      var_dump($locations);//prints NULL
      ...
}

mymodel.php

public function getLocations(){  
      $db=JFactory::getDBO();
      $query=$db->getQuery(true);  
      $query->select('distinct location');   
      $query->from('#__locations');
      $db->setQuery($query);  
      return $loc = & $db->loadObjectList();  
}

Pourquoi renvoie NULL dans le contrôleur, cependant getLocations() fonctionne correctement dans view.html.php.

3
user1926

Vous ne faites pas $model->get('Locations'). La syntaxe correcte consiste simplement à appeler le nom de la méthode: $model->getLocations().

L'utilisation de la syntaxe ->get('Locations') n'est valide que dans une vue (car get() est une méthode de la classe d'affichage).

Cela ne génère pas d'erreur sur le modèle, car il possède également une méthode get. Cependant, cela fait une tâche complètement différente de celle d'être une référence pour d'autres méthodes.

-

Il y a beaucoup d'autres choses que je veux noter à propos du code:

  1. Votre déclaration if dans le contrôle doit avoir deux signes =. Sinon, vous définissez la vue comme étant cette chaîne (elle sera donc toujours exécutée).

  2. Pourquoi cela: return $loc = & $db->loadObjectList();? Stocker la liste d'objets dans une variable locale à la fin est tout simplement étrange. Et vous n'avez certainement pas besoin de stocker par référence en utilisant le &. Il suffit de faire return $db->loadObjectList();

  3. Celui-ci peut ne pas être vrai dans votre cas, mais si le modèle et le contrôleur proviennent du même ensemble (c'est-à-dire qu'ils portent le même nom), vous pouvez généralement vous en sortir en faisant simplement $model = $this->getModel(); au lieu de $model= $this->getModel('mymodel'); Le contrôleur utilise déjà le modèle du même nom.

5
David Fritsch

Il y a très peu de fond sur ce qu'il y a d'autre dans le composant.

Vous devez vraiment vérifier les exceptions de base de données. Voir: Comment gérer les exceptions/erreurs SQL compatibles avec les versions 2.5 et 3.x?

Je vois deux options ici:

1. Recommandé

Vous configurez votre débogueur dans le IDE que vous préférez et regardez dans le code pour voir ce qu'il fait et d'où vient le null.

Cela vous aidera non seulement maintenant, mais aussi à long terme.

2. Peut fonctionner

L’inconvénient de cette méthode est que la qualité de votre code continuera d’être médiocre et que le prochain null que vous obtiendrez entraînera une nouvelle question demandant de l’aide.

Comme il semble que $model Soit une instance de votre modèle, je ne vois que si getLocations() n'est pas appelée ou si loadObjectList() renvoie un null à la suite d'un requête échouée. Non exclu est aussi une faute de frappe quelque part.

3
Valentin Despa