it-swarm.com.de

Das Aufrufen der Modellmethode aus der Ansicht funktioniert, aber nicht vom Controller

Ich versuche, die Methode des Modells vom Controller aufzurufen.

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();  
}

Warum gibt es NULL im Controller zurück, aber getLocations() funktioniert gut in view.html.php.

3
user1926

Sie tun nicht $model->get('Locations'). Die korrekte Syntax lautet, nur den Methodennamen aufzurufen: $model->getLocations().

Die Verwendung der ->get('Locations') -Syntax ist nur in einer Ansicht gültig (da get() eine Methode der Ansichtsklasse ist).

Dies wirft keinen Fehler auf das Modell, da es auch eine get -Methode hat. Es ist jedoch eine ganz andere Aufgabe als eine Referenz für andere Methoden.

-

Viele andere Dinge, die ich über den Code beachten möchte:

  1. Ihre if-Anweisung im Steuerelement sollte zwei = - Zeichen haben. Andernfalls setzen Sie die Ansicht auf diese Zeichenfolge (damit sie immer ausgeführt wird).

  2. Warum machen Sie das: return $loc = & $db->loadObjectList();? Das Speichern der Objektliste in einer lokalen Variablen am Ende ist nur ungerade. Und Sie müssen definitiv nicht mit & Nach Referenz speichern. Mach einfach return $db->loadObjectList();

  3. Dies mag in Ihrem Fall nicht zutreffen, aber wenn das Modell und der Controller vom selben Set stammen (dh denselben Namen haben), können Sie normalerweise einfach $model = $this->getModel(); anstelle von $model= $this->getModel('mymodel'); Der Controller verwendet standardmäßig das Modell mit dem gleichen Namen.

5
David Fritsch

Es gibt nur sehr wenig Hintergrundinformationen darüber, was sich sonst noch in der Komponente befindet.

Sie müssen wirklich nach Datenbankausnahmen suchen. Siehe: Wie mache ich eine mit 2.5 und 3.x kompatible SQL-Ausnahmebehandlung/Fehlerbehandlung?

Ich sehe hier zwei Möglichkeiten:

1. Empfohlen

Sie richten Ihren Debugger in Ihrem bevorzugten IDE) ein und schauen in den Code, um zu sehen, was er tut und woher die Null kommt.

Dies wird Ihnen nicht nur jetzt, sondern auch langfristig helfen.

2. Kann funktionieren

Nachteil dieser Methode ist, dass Ihre Codequalität weiterhin schlecht ist und die nächste null, die Sie erhalten, zu einer neuen Frage führt, die Sie um Hilfe bittet.

Da es den Anschein hat, dass $model Eine Instanz Ihres Modells ist, sehe ich nur die Chance, dass getLocations() nicht aufgerufen wird oder loadObjectList() als Ergebnis von a eine Null zurückgibt Abfrage fehlgeschlagen. Nicht ausgeschlossen ist auch irgendwo ein Tippfehler.

3
Valentin Despa