Back to top

Autore Topic: [RISOLTO ????]Problema passaggio del Model dal Controller alla View  (Letto 2291 volte)

Offline lejubila

  • Nuovo arrivato
  • *
  • Post: 17
    • Mostra profilo
Salve a tutti,
sono alle prese con il mio primo componente e probabilmente ho un po di confusione in testa su come funziona.

Io ho un codice simile al seguente

Model
Codice: [Seleziona]
class RrModelRecensioni extends JModel
{
    var $_data;

    /**
      * Campi di ricerca
      */
    var $_id_ristorante = null;
    var $_id_utente = null;
    var $_onlyPublished = true;

    function onlyPublished( $onlyPublished=true )
    {
      $this->_onlyPublished = $onlyPublished;
      $this->_data = null;
    }

    [cut]
       .
       .
       .
       .
    [cut]

}

Controller
Codice: [Seleziona]
class RrControllerRecensioni extends RrController
{

  function display()
  {
    // Inizializza il model per le recensioni
    $model =& $this->getModel('recensioni');

    [cut...] INIZIALIZZAZIONE ALTRI MODEL ACCESSORI [...cut]


    if ( RrHelper::condizione() ) )
      $model->onlyPublished( false );

    // Assegna i model alla view
    $document =& JFactory::getDocument();
    $viewType = $document->getType();
    $view = $this->getView("recensioni", $viewType);
    $view->setModel( $model, true );

   [cut...] ASSEGNAZIONE ALTRI MODEL ALLA VIEW [...cut]

    JRequest::setVar('view', 'recensioni');

    parent::display();
  }


Come si può vedere nel controller viene richiamato onlyPublished() del model che setta la variabile $this->_onlyPublished, dopo di che viene assegnato il model alla view. La variabile $this->_onlyPublished indica al model quali dati recuperare.

Il mio problema è che quando viene eseguita la view, la variavile $this->_onlyPublished del model non ha più il valore precedentemente assegnato nel controller.

Inserendo un echo nel costruttore del model ho notato che questo viene creato due volte (una volta nel controller e l'altra nella view), cosa secondo me errata in quanto pensavo che il model venisse passato alla view per riferimento e non ricreato.

Quindi mi chiedo se questo è il comportamento corretto, o sbagli io qualche cosa ?

Se effettivamente è il comportamento corretto, come posso dal controller istruire il model su che dati recuperare successivamente nella view con una chiamata tipo $this->get("Data") ?

Spero di non essere stato troppo contorto e di essermi spiegato.

Grazie.
« Ultima modifica: 28 Ott 2010, 23:51:27 da lejubila »

mau_develop

  • Visitatore
Re:Problema passaggio del Model dal Controller alla View
« Risposta #1 il: 28 Ott 2010, 15:40:16 »
$_onlyPublished
------------------------
sicuro tu possa usare qs sintassi?

M.

Offline lejubila

  • Nuovo arrivato
  • *
  • Post: 17
    • Mostra profilo
Re:Problema passaggio del Model dal Controller alla View
« Risposta #2 il: 28 Ott 2010, 16:01:33 »
$_onlyPublished
------------------------
sicuro tu possa usare qs sintassi?

M.
In che senso ?

Nelle spiegazioni che ho scritto mi riferivo con la forma $_onlyPublished per semplicità (che comunque ho appena cambiato in $this->_onlyPublished)

Nel codice la dichiaro con
var $_onlyPublished = false;

mentre nelle altre parti del codice del model uso
$this->_onlyPublished

che a quanto mi risulta dovrebbero essere la forme corretta.

Ho sbagliato qualcosa ?

Comunque il mio dubbio era se il comportamento che ho riscontrato è giusto, ovvero la creazione nella view di una nuova istanza del model rispetto a quella usata dal controller e non il passaggio per riferimento del model tra controller e view.

Grazie,
ciao.

Offline lejubila

  • Nuovo arrivato
  • *
  • Post: 17
    • Mostra profilo
Re:Problema passaggio del Model dal Controller alla View
« Risposta #3 il: 28 Ott 2010, 23:50:44 »
Spulciando il codice della classe JController ho notato che nel metodo display() vengono eseguite le seguenti principali operazione:
  • creazione della view
  • settaggio del template alla view
  • creazione del model e conseguente assegnazione alla view

Quindi il metodo classico di richiamare la view da un task del controller con parent::display() ha l'effetto di creare una nuova istanza del model anche se ne era già stata creata una nel controller stesso.

Volendo invece assegnare alla view l'istanza del model già creata nel controller va scavalcato il metodo parent::display istanziando direttamente la view, assegnargli il template, assegnargli il model (quello già creato) ed eseguirne il display.
Tradotto in codice dovrebbe essere come segue:
Codice: [Seleziona]
    // Inizializza il model per le recensioni
    $model =& $this->getModel('recensioni');

    // Crea la view, assegna il model
    $document =& JFactory::getDocument();
    $viewType = $document->getType();
    $view = $this->getView("recensioni", $viewType);
    $view->setModel( $model, true );

    // Setta il template da visualizzare e lo visualizza
    $view->setLayout( JRequest::getCmd( 'layout', 'default' ) );
    $view->display();

Quanto sopra dovrebbe sostituire la più classica metodologia seguente
Codice: [Seleziona]
    JRequest::setVar('view', 'recensioni');
    parent::display();

Questa è stata l'unica soluzione che sono riuscito a trovare.

Sono bene accette soluzioni alternative specialmente se più semplici.

 



Web Design Bolzano Kreatif