Back to top

Autore Topic: Errore nel caricamento del Model di default  (Letto 2430 volte)

Offline fortejava

  • Nuovo arrivato
  • *
  • Post: 16
    • Mostra profilo
Errore nel caricamento del Model di default
« il: 13 Gen 2014, 02:10:14 »
Ciao a tutti,
sto sviluppando una nuova estensione per Joomla! 2.5 e mi sono incagliato su un comportamento alquanto strano di J!2.5


Ho un controller che istanzia una view, il quale presenta in particolare due metodi: il metodo save() e il metodo apply().


Ebbene, quando la view richiama questi metodi (tramite Jtoolbar), entrambi i metodi salvano le modifiche inserite via form e poi rispettivamente tornano alla schermata principale (save) e mostrano i dati aggiornati (apply).


Il problema arriva quando si mostrano i dati salvati dopo l'apply: i campi vengono mostrati vuoti a causa del mancato caricamento del model di default della view.


Vi incollo i due file (il controller e la view), sperando che possano essere utili a spiegare ciò che forse non sono iuscito a far capire nelle righe precedenti


Controller
Codice: [Seleziona]
defined('_JEXEC') or die;
jimport('joomla.application.component.controlleradmin');
class QrManagerControllerSettings extends JControllerAdmin
{
  public function __construct($config = array())
  {
    $this->view = 'settings';
    parent::__construct($config);
  }
  public function getModel($name = 'Settings', $prefix = 'QrManagerModel')
  {
    $model = parent::getModel($name, $prefix, array('ignore_request' => true));
    return $model;
  }
 
  function save()
  {
      //Salvo i dati
      $this->apply();
      //Torno alla schermata principale del backend del componente
      $this->cancel();
  }
 
  function apply()
  {
      $model=$this->getModel();
      $model->updateData();
      $this->display();
  }
 
  function cancel()
  {
      $link=  JRoute::_('index.php?option=com_qrmanager',false);
      $this->setRedirect($link);
  }
 
  public function display($cachable = false, $urlparams = false)
  {
      $view= $this->getView($this->view, 'html');
     
      $view->display();
  }
}

[/size][size=78%]View[/size]
[/size]
[/size]
Codice: [Seleziona]
defined('_JEXEC') or die;
jimport('joomla.application.component.view');
jimport( 'joomla.access.access' );
class QrManagerViewSettings extends JView
{
  function display($tpl = null)
  {
 
    //Fase di update delle informazioni
    $this->urlPrefix= $this->get('UrlPrefix');
    $this->mainGroup = $this->get('MainGroup');
    // Set the toolbar
    $this->addToolBar();
 
    // Display the template
    parent::display($tpl);
  }
       
  protected function addToolBar()
  {
    JToolBarHelper::title(JText::_('COM_QRMANAGER_MANAGER_OBJECTS'));
    JToolBarHelper::apply("settings.apply");
    JToolBarHelper::save('settings.save');
    JToolBarHelper::cancel("settings.cancel");
  }


}

[/size]
[/size][size=78%]In pratica: quando la form viene mostrata all'accesso della pagina, i dati vengono mostrati correttamente, mentre dopo aver richiamato il metodo apply, essi vengono aggiornati nel db ma i campi della form sono vuoti e non viene caricato il model predefinito (l'array _model della view risulta vuoto).[/size]
[/size]
[/size][size=78%]Potete aiutarmi per favore? grazie di tutto in anticipo[/size]

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Errore nel caricamento del Model di default
« Risposta #1 il: 13 Gen 2014, 18:53:54 »
difficile capire, hai controllato il nome della classe del model?

comunque: c'è un motivo per cui hai inserito i metodi nel controller?
nel senso che non vedo niente di particolare, e mi chiedevo lo scopo dell'override.

dalla view, poi, non mi pare che tu abbia seguito le naming convention di joomla per i metodi del model (getItems() dov'è?).

nei framework convention over configuration è decisamente meglio seguire le convenzioni alla lettera...

ciao,
marco

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Errore nel caricamento del Model di default
« Risposta #2 il: 15 Gen 2014, 10:30:22 »
Ciao un paio di domande

Settings è la lista?
La view della form è setting?

Se è cosi allora hai sbagliato qua

Codice: [Seleziona]
public function getModel($name = 'Settings', $prefix = 'QrManagerModel')

getModell in JControllerAdmin non deve puntare al model della classe della lista ma a quello della form che estende JModelAdmin

molto probabilmente se guardi l'url non hai l'id oppure è uguale a 0, quindi non trovando nulla ti ritorna una form vuota.

Spero di averti aiutato

ciao
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

Offline mmleoni

  • Global Moderator
  • Instancabile
  • *****
  • Post: 5547
  • Sesso: Maschio
  • Just another *nix coder/sysadmin...
    • Mostra profilo
Re:Errore nel caricamento del Model di default
« Risposta #3 il: 15 Gen 2014, 11:31:10 »
giusta domanda simone83,
 la avevo frettolosamente archiviata guardando il codice della view (vedi i bottoni della toolbar) ove il controller è 'settings'.  :(

però il fatto che il controller QrManagerControllerSettings eredeti da JControllerAdmin e non da JControllerForm, mi fa venire il dubbio che tu abbia ragione...
il che vorrebbe dire che lì, però, ci sono i metodi nel controller sbagliato (stando almeno alle convenzioni di J).

ti fermi un po' sul forum, vero?  ;)

ciao,
marco

mmleoni web consulting - creazione siti web aziendali ed e-commerce avanzati - sviluppo moduli e componenti Joomla

Offline simone83

  • Appassionato
  • ***
  • Post: 362
  • Sesso: Maschio
    • Mostra profilo
Re:Errore nel caricamento del Model di default
« Risposta #4 il: 15 Gen 2014, 12:06:24 »
Non evavo guardato il codice sotto, diciamo che qua c'e un po di confusione.

Servirebbero un po piu informazioni.

Si sta utilizzando JControllerAdmin che serve nella lista invece che JControllerForm per la form di inserimento

Queste funzioni

Codice: [Seleziona]
function save()
  {
      //Salvo i dati
      $this->apply();
      //Torno alla schermata principale del backend del componente
      $this->cancel();
  }
 
  function apply()
  {
      $model=$this->getModel();
      $model->updateData();
      $this->display();
  }
 
  function cancel()
  {
      $link=  JRoute::_('index.php?option=com_qrmanager',false);
      $this->setRedirect($link);
  }

sono fatte a caso, come fa apply a ritornare alla form con un id nell'url.

Se guardi in libraries/legacy/controllers/form.php

vedi che la funzione apply non esiste direttamente ma è la funzione save che viene eseguita in quanto c'e un registerTask nel costruttore.

Quindi apply, save, save2copy, save2new vengono eseguite tutte da save, cambia solo il comportamento dopo il salvataggio. Nel tuo caso ci si aspetta che apply faccia questo

Codice da joomla 3.1

Codice: [Seleziona]
$recordId = $model->getState($this->context . '.id');
              $this->holdEditId($context, $recordId);
                $app->setUserState($context . '.data', null);
                $model->checkout($recordId);

                // Redirect back to the edit screen.
                $this->setRedirect(
                    JRoute::_(
                        'index.php?option=' . $this->option . '&view=' . $this->view_item
                        . $this->getRedirectToItemAppend($recordId, $urlVar), false
                    )
                );

cosa che il tuo apply non fa.

Forse ho divagato un po.

Comunque spero di essere stato di aiuto

Citazione
ti fermi un po' sul forum, vero?  ;)

Oggi ho un po di tempo, ho dato un occhiata sul forum per vedere, ma in questo periodo proprio non ce la faccio a dare una mano
BRAINCODE
Da Psd a Joomla - Sviluppo componenti joomla - SEO con Joomla
x-brain

 



Web Design Bolzano Kreatif