it-swarm.dev

La chiamata del metodo del modello dalla vista funziona, ma non dal controller

Sto cercando di chiamare il metodo del modello dal controller.

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

Perché restituisce NULL nel controller, tuttavia getLocations() funziona bene in view.html.php.

3
user1926

Non si esegue $model->get('Locations'). La sintassi corretta è semplicemente chiamare il nome del metodo: $model->getLocations().

L'uso della sintassi ->get('Locations') è valido solo in una vista (poiché get() è un metodo della classe view).

Questo non genera un errore sul modello, perché ha anche un metodo get. Tuttavia, svolge un'attività completamente diversa dall'essere un riferimento per altri metodi.

-

Molte altre cose che voglio notare sul codice:

  1. L'istruzione if nel controllo dovrebbe avere due segni =. Altrimenti stai impostando la vista come quella stringa (quindi verrà sempre eseguita).

  2. Perché farlo: return $loc = & $db->loadObjectList();? Memorizzare l'elenco degli oggetti in una variabile locale alla fine è semplicemente strano. E sicuramente non è necessario memorizzare per riferimento utilizzando &. Basta fare return $db->loadObjectList();

  3. Questo potrebbe non essere vero nel tuo caso, ma se il modello e il controller sono dello stesso set (cioè hanno lo stesso nome) di solito puoi cavartela semplicemente facendo $model = $this->getModel(); invece di $model= $this->getModel('mymodel'); Il controller utilizza automaticamente il modello con lo stesso nome.

5
David Fritsch

C'è pochissimo sfondo su cos'altro c'è nel componente.

Devi davvero controllare le eccezioni del database. Vedere: Come rendere compatibile la gestione di eccezioni/errori SQL con 2.5 e 3.x?

Vedo due opzioni qui:

1. Consigliato

Devi impostare il tuo debugger nel tuo preferito IDE ed esaminare il codice per vedere cosa fa e da dove proviene il null.

Questo ti aiuterà non solo ora, ma anche a lungo termine.

2. Può funzionare

Lo svantaggio di questo metodo è che la qualità del tuo codice continuerà ad essere scarsa e il prossimo null che otterrai si tradurrà in una nuova domanda che chiede aiuto.

Dato che $model È un'istanza del tuo modello, l'unica possibilità che vedo se in qualche modo getLocations() non viene chiamato o loadObjectList() restituisce un valore nullo come risultato di un query non riuscita. Non escluso è anche un refuso da qualche parte.

3
Valentin Despa