Joomla.it Forum

Non solo Joomla... => Sviluppo => : lejubila 28 Oct 2010, 15:36:31

: [RISOLTO ????]Problema passaggio del Model dal Controller alla View
: lejubila 28 Oct 2010, 15:36:31
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
:
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
:
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.
: Re:Problema passaggio del Model dal Controller alla View
: mau_develop 28 Oct 2010, 15:40:16
$_onlyPublished
------------------------
sicuro tu possa usare qs sintassi?

M.
: Re:Problema passaggio del Model dal Controller alla View
: lejubila 28 Oct 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.
: Re:Problema passaggio del Model dal Controller alla View
: lejubila 28 Oct 2010, 23:50:44
Spulciando il codice della classe JController ho notato che nel metodo display() vengono eseguite le seguenti principali operazione:

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:
:
    // 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
:
    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.