Back to top

Autore Topic: [RISOLTO] Creare nuova vista  (Letto 3311 volte)

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
[RISOLTO] Creare nuova vista
« il: 27 Mar 2012, 16:55:57 »
Ciao a tutti!
Eccomi di nuovo con il mio tentativo di creare un componente da zero per registrare le anagrafiche dei partecipanti ad un concorso musicale.
La situazione è questa: sono ad un ottimo punto, il backend funziona benissimo, permettendomi di creare nuove registrazioni e di modificare quelle esistenti.
Sono riuscita anche a prevedere la possibilità di inserire un breve file audio.
Posso poi creare delle voci di menù che puntano alle singole anagrafiche (cioè: una voce di menù per il Gruppo 1, un'altra per il Gruppo 2 e così via), e da frontend tutto va alla perfezione: cliccando sulla relativa voce di menù si apre l'anagrafica giusta con tutti i dati che ho scelto di pubblicare impaginati come volevo io (d'altra parte questa è stata la cosa più facile da ottenere!).
Ora il problema è questo: dato che si prevede un elevato numero di iscritti, non è pensabile creare una voce di menù per ognuno. Senza contare che richiederebbe un surplus di lavoro.
Quindi la mia idea è di realizzare un'altra vista, che invece di visualizzare il singolo record della mia tabella mi impagini tutti i record posizionandoli in una tabella.
Praticamente vorrei un elenco (cliccabile) dei partecipanti.
Ho provato a creare una nuova vista seguendo varie guide, cercando di capire come fare da componenti esistenti e funzionanti, ma qualcosa non va: sono riuscita a creare la relativa voce di menù, ma la pagina a cui punta decisamente non funziona bene! Infatti si apre una pagina tutta bianca in cui si legge solo la riga delle intestazioni della tabella.
Dando uno sguardo al codice della pagina generata vedo che la seconda riga inizia ma non finisce, una cosa tipo:
Codice: [Seleziona]
<table><tr><th>Partecipante</th><th>Categoria</th><th>genere</th></tr>
<tr><td>
quindi credo di aver sbagliato qualcosa nel ciclo che richiama i dati contenuti nella mia tabella, quindi o nel file default.php o in view.html.php della vista elenco.
Il problema c'è sia su Joomla 2.5 (che è dove dovrebbe poi girare il tutto) sia su Joomla 1.7, sempre in locale.
Non chiedo certo che mi scriviate il codice corretto, ma se qualcuno sapesse almeno indicarmi una guida o darmi una dritta su come risolvere gliene sarei davvero grata!
Io intanto continuo a provare, ma non so più bene che tentativi fare, quindi spero davvero che qualcuno possa aiutarmi!

Grazie mille!
« Ultima modifica: 30 Mar 2012, 00:20:32 da akasha »

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
Re:Creare nuova vista
« Risposta #1 il: 28 Mar 2012, 20:40:25 »
Eccomi qui per alcuni aggiornamenti!
La situazione è leggermente cambiata: ora la pagina a cui approdo dal menù per la vista "lista" non è più bianca ma carica correttamente il mio template, solo che continua a pubblicare solo la riga di intestazione della tabella che dovrebbe contenere l'elenco di iscritti.
Purtroppo non ho modo di pubblicare il tutto on-line, ma vi scrivo qui il codice del file default.php della vista "lista".
Vedrete che verso la fine c'è una riga commentata che è quella relativa al footer e che bloccava tutto (ho capito che non ho definito da nessuna parte pagination e per il momento ho preferito rimandare ad un secondo momento questo problema).
Ecco qui il codice:

Codice: [Seleziona]
<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
?>

<form action="<?php echo JRoute::_('index.php?option=com_anagrafica'); ?>" method="post" name="listaform">
  <table><thead>
    <tr>
  <th>
  <?php echo JText::_('COM_ANAGRAFICA_LISTA_NOME'); ?>
  </th>
  <th>
  <?php echo JText::_('COM_ANAGRAFICA_LISTA_GRUPPO'); ?>
  </th>
    <th>
  <?php echo JText::_('COM_ANAGRAFICA_LISTA_EDITO'); ?>
  </th>
</tr></thead>
    <tbody><?php
    
function getOptions()
  {
    
$db JFactory::getDBO();
    
$query $db->getQuery(true);
    
$query->select('id,nome,gruppo,edito');
    
$query->from('#__anagrafica_iscritti');
    
$db->setQuery((string)$query);
    
$titles $db->loadObjectList();
    
$options = array();
    if(
$titles){
      foreach(
$titles as $title)
      {
        
$options[] = JHtml::_('select.option'$title->id$title->id.' '.$title->nome.' '.$title->gruppo.' '.$title->edito); ?>

        <tr>
          <td>
 <a href="<?php echo JRoute::_('option=com_anagrafica&view=scheda&id=' $title->id); ?>">
              <?php echo $title->nome?>
            </a>
          </td>
<td><?php echo $gruppo?></td>
<td><?php echo $edito?></td>

  </tr>
        <?php
      
}}}
      
?>

    </tbody>
   
        <tfoot><tr>
  <td><?php //echo $this->pagination->getListFooter(); ?></td>
</tr></tfoot>
  </table>
</form>

Qualcuno mi sa indicare dove è l'errore?
Immagino di aver sbagliato qualcosa per quanto riguarda l'interrogazione al database, ma non so proprio cosa...
Beh, spero davvero che qualcuno di voi possa darmi una mano!
Grazie mille!

mau_develop

  • Visitatore
Re:Creare nuova vista
« Risposta #2 il: 28 Mar 2012, 20:46:19 »
perchè non segui leggendo e rifacendo il tutorial com_helloworld? ... ho come l'impressione tu vada a "naso"...

perchè c'è una query in una vista che dovrebbe contenere solo html?

perchè hai un array di oprion e non hai la select che li contiene?

M.

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
Re:Creare nuova vista
« Risposta #3 il: 28 Mar 2012, 21:01:40 »
Ciao, grazie per la risposta!
Si, è vero che sto andando "a naso", ma semplicemente perché dopo aver provato senza successo a seguire tanti tutorial sto sperimentando altre soluzioni!
Se il tutorial a cui ti riferisci è lo stesso che ho seguito io non spiega (o io non ho capito) come creare una vista di tipo "lista" anziché "singolo oggetto".
Infatti seguendo il tutorial sono più o meno tranquillamente riuscita ad ottenere di visualizzare i dettagli di ogni record.
Se mi sto sbagliando puoi indicarmi cortesemente qual è il tutorial di cui parli? Magari si tratta di qualcosa che mi è sfuggito!
So che la query non dovrebbe trovarsi in quel file, ma non riesco a capire dove la dovrei mettere: ho provato sul view.html.php della vista e su lista.php (in models), ma evidentemente sbaglio sempre qualcosa e non so cosa!
Per quanto riguarda l'array di options e la select... non capisco! Puoi spiegarmi? O indicarmi dove trovare spiegazioni?
Non cerco assolutamente qualcuno che risolva tutto al posto mio, sono anzi ben felice di documentarmi e studiare, ma sono del tutto arenata qui e non so più neppure dove cercare informazioni!
Quindi, se mi darai almeno un spunto da cui partire ne sarò contentissima!
Grazie mille!

mau_develop

  • Visitatore
Re:Creare nuova vista
« Risposta #4 il: 28 Mar 2012, 21:08:33 »
Se il tutorial a cui ti riferisci è lo stesso che ho seguito io non spiega (o io non ho capito) come creare una vista di tipo "lista" anziché "singolo oggetto"
---------------------------------------------------------------------------------------------------------------------------
ummhh non è proprio così il concetto... cmq
Joomla >1.5.x offre due nuove sottoclassi per le liste che funzionano solo in amministrazione e propongono nella vista lista il risultato della query nel relativo model, nella vista che tu chiami singola propone il form per editare o aggiungere "una riga"

conosci la programmazione a oggetti? l'mvc? ... sono essenziali per scrivere codice con il framework joomla.

M.

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
Re:Creare nuova vista
« Risposta #5 il: 28 Mar 2012, 21:35:42 »
Joomla >1.5.x offre due nuove sottoclassi per le liste che funzionano solo in amministrazione e propongono nella vista lista il risultato della query nel relativo model, nella vista che tu chiami singola propone il form per editare o aggiungere "una riga"

conosci la programmazione a oggetti? l'mvc? ... sono essenziali per scrivere codice con il framework joomla.

M.
Si, conosco la programmazione ad oggetti (in particolare C++, ma anche un po' Java) e me la cavo bene anche con php.
Per quanto riguarda l'mvc ho scoperto da poco cosa sia, se ho ben capito divide la programmazione vera e propria dalla "formattazione".
Io sto cercando di creare questo componente per Joomla 2.5, sai consigliarmi dove andare a reperire le informazioni di cui ho bisogno?
Il componente nell'amministrazione funziona benissimo: posso vedere tutta la lista di record inseriti e cliccandoli accedo al form tramite cui modificarli.
Posso creare due diversi tipi di voci di menù, quello per la vista "singola" funziona benissimo e mi mostra nel sito tutti i dettagli del relativo record non modificabili, mentre quello per la vista "lista" non va.
Da quello che mi scrivi mi sembra di capire che devo spostare la query nel model relativo alla vista "lista", ma non capisco come fare poi per richiamare i risultati nel file default.php.
Se dovessi scrivere del semplice codice php eseguirei una query SELECT, inserirei i risultati in un array e li scriverei nella tabella con un ciclo while o foreach.
Immagino che anche in questo caso l'iter sia lo stesso, forse eseguendo la query nel model e il ciclo nella vista... giusto?
Ma, in ogni caso, come faccio a richiamare i risultati della query nella vista?
Mi dai un suggerimento?

Grazie mille!

mau_develop

  • Visitatore
Re:Creare nuova vista
« Risposta #6 il: 29 Mar 2012, 12:18:59 »
allora...

dove ti trovi? frontend o backend? perchè solo in backend hai le classi per le liste.

Comunque sia l'MVC non è complicato, provo a spiegarmi banalmente, oggetto del discorso un componente, frontend o backend.

ogni componente ha un "entry point", dove se te ne freghi di tutto puoi anche rimanere, senza aggiungere altri files; è il file che viene chiamato da joomla quando richiedi il componente.
Se invece lo usi a modo (MVC) fa questo:

Istanzia il controller principale (può essere anche l'unico)
$controller = JController::getInstance('TuoController');

esegue nel controller la task (metodo) del controller richiesta
$controller->execute(JRequest::getCmd('task'));

$controller->redirect();

bene, quindi dopo c'è il controller principale ( e mi fermo a qs nel discorso)

se la task è pippo verrà chiamato il metodo pippo del controller il quale "didatticamente" unisce i dati alla vista.

La peculiarità di MVC e il motivo per cui esiste, è proprio di tenere separato codice eseguibile e tag code o pseudo codice (js fa qualche eccezione)

Quindi il metodo pippo del controller con la mano destra recupera i dati, con la sinistra recupera la vista e gli mette a disposizione i dati come "oggetto creato" $this ... in pratica

function pippo(){
// di elaborare i dati si occupa il model che vuoi, nella cartella model (dove devi mettere la query) e lo istanzi
$model = $this->getModel('mio_model');

// poi ne usi il metodo che hai scritto per recuperare i dati (query o quello che è)
$data=$model->recupera_dati();

// poi (questi "poi" sono in realtà "intanto") istanzi la view
$view =& $this->getView('Tua_view', 'html');

//setti il model per la view
$view->setModel($model);

// crei la referenza "data" ai tuoi dati
$view->assign('data',$data);

// chiami il tuo metodo della view (display è il default) con parametro il template che vuoi usare (se vuoto usa default se passi display('pluto') usa default_pluto
$view->display();

nella tua view.html.php recuperi i dati creando un oggetto per la vista con
$this->data = $this->get('data');

... il resto... baggianate...

M.

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
Re:Creare nuova vista
« Risposta #7 il: 29 Mar 2012, 12:47:10 »
Ciao, grazie per la spiegazione, inizio ad avere le idee molto più chiare!
Da quello che mi hai scritto non credo di essere del tutto fuori strada, solo che io mi trovo nel frontend, quindi mi sembra di capire che non esistano le classi per ottenere delle liste.
Ma è possibile comunque avere lo stesso risultato, giusto? Perché ho avuto modo di utilizzare componenti (tipo joodb) che realizzano qualcosa di simile, e cioè mostrano nel frontend, in una tabella, i vari record di una table del database.
La situazione al momento è questa:
- ho inserito la query in una funzione getLista() nel file models/lista.php:
Codice: [Seleziona]

    $query = 'SELECT id, nome, gruppo, edito FROM #__anagrafica_iscritti';
    $db->setQuery( $query );
    $lista[] = $db->loadRowList();
    return $lista;


- ho richiamato il modello dal file lista/view.html.php:

Codice: [Seleziona]

$model = &$this->getModel();
$lista = $model->getLista();
$this->assignRef( 'lista', $lista);


- ho creato un ciclo in lista/tmpl/default.php:

Codice: [Seleziona]

$this->lista = $this->get('lista');
      foreach ($this->lista as $row):
      echo "<tr>";
      $id = $row['id'];
      $nome = $row['nome'];
      $gruppo = $row['gruppo'];
      $edito = $row['edito'];
      echo "<td>".$nome."</td><td>".$gruppo."</td><td>".$edito."</td></tr>";
      endforeach;

Ottengo però questi errori:
Citazione
Notice: Undefined index: id in [...]default.php on line 20
Notice: Undefined index: nome in [...]default.php on line 21
Notice: Undefined index: gruppo in [...]default.php on line 22
Notice: Undefined index: edito in [...]default.php on line 23

Credo che il problema sia nel passaggio dei dati da un file all'altro... forse sbaglio qualcosa nel richiamarli?
O c'è altro che non va?

Come sempre, grazie mille per l'aiuto!

Edit: mi sono accorta di aver scritto male una variabile, ho corretto e ora i messaggi di errore sono quelli scritti sopra.
« Ultima modifica: 29 Mar 2012, 12:59:11 da akasha »

mau_develop

  • Visitatore
Re:Creare nuova vista
« Risposta #8 il: 29 Mar 2012, 12:53:08 »
- ho richiamato il modello dal file lista/view.html.php:

$model = &$this->getModel(  --->  che model?  <--------- );

M.

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
Re:Creare nuova vista
« Risposta #9 il: 29 Mar 2012, 13:05:07 »
$model = &$this->getModel(  --->  che model?  <--------- );
Ops! Ho corretto così:

Codice: [Seleziona]
$model = &$this->getModel('anagraficaModelLista');

Ma ora non funziona più nulla!
Quando provo a caricare ottengo una pagina bianca con questi avvisi:
Citazione
Notice: Undefined index: anagraficamodellista in [...]view.php on line 371
Fatal error: Call to a member function getLista() on a non-object in [...]view.html.php on line 10

Ho sbagliato la sintassi?

mau_develop

  • Visitatore
Re:Creare nuova vista
« Risposta #10 il: 29 Mar 2012, 13:27:44 »
.. :)

i nomi sono basilari in joomla.

quando nell'entry point istanzi il controller e fai getIstance(nome)

quel nome sarà preposto ad ogni classe che crei; quello post posto,... quello che chiami

immagino che avrai un controller:
anagraficaController extends .....

la view sarà:
anagraficaViewLista extends ....

 e il model lista.php:
anagraficaModelLista extends ....

quindi il tuo model è 'lista'

M.

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
Re:Creare nuova vista
« Risposta #11 il: 29 Mar 2012, 13:37:21 »
Ok, errore stupido corretto! Grazie!
Però adesso ottengo un avviso come questo:
Citazione
Notice: Undefined index: id in [...]default.php
per ogni campo che vado a chiamare (id, nome, gruppo, edito).
Proprio non capisco: se ora richiamo correttamente il model, e nel view.html.php è tutto a posto, cosa c'è che non va?
Sto davvero impazzendo!
Meno male che mi stai dando il tuo aiuto, altrimenti sarei persa!

mau_develop

  • Visitatore
Re:Creare nuova vista
« Risposta #12 il: 29 Mar 2012, 13:53:10 »
a ri :)
mi quoto:
------------------------------------
nella tua view.html.php recuperi i dati creando un oggetto per la vista con
$this->data = $this->get('data');
------------------------------------------------

nel default avrai quindi $this->data che, a seconda di come gli hai passato i dati sarà o un array o una stdClass

quindi o $this->id oppure se hai passato array $this->data['id']

insomma, questo dipende da come hai costruito il tuo dato che passi,... magari ti serve una foreach per scorrere e ottenere la lista

se metti un bel print_r($this->tuo_data); vedi se arrivano e come sono fatti

M.
« Ultima modifica: 29 Mar 2012, 14:01:03 da mau_develop »

Offline akasha

  • Esploratore
  • **
  • Post: 106
    • Mostra profilo
Re:Creare nuova vista
« Risposta #13 il: 29 Mar 2012, 17:04:09 »
Grazie grazie grazie!!! ;D
Seguendo i tuoi suggerimenti sono riuscita praticamente a completare il tutto, mancano solo alcune piccolezze (la paginazione, l'ordinamento della tabella)!
Ho fatto come dicevi, con il print_r, e mi sono resa conto che si trattava di un array multidimensionale, per cui sbagliavo gli indici e ovviamente non funzionava nulla!
Corretto questo e con un ciclo ho risolto tutto e ora funziona e pubblica la mia tabella di iscritti con i collegamenti alle anagrafiche complete!
Ora cercherò di ultimare quei piccoli dettagli da sola, ma se dovessi avere bisogno di aiuto aprirò un nuovo topic qui e spererò in un intervento illuminante come il tuo!
Grazie ancora! ;D ;D ;D

 



Web Design Bolzano Kreatif