Creare componenti per Joomla! 1.5 - Gestire il front end

Creare componenti per Joomla! 1.5 - Gestire il front end

Scrivere componenti con Joomla! Component Builder è abbastanza agevole dato che è il programma che si preoccupa di scrivere lo scheletro per  models, views e per i templates delle views. Resta da definire il layout con cui presentare i dati, in questo articolo spieghiamo come fare.

 Attenzione: questa pagina non è aggiornata!
I contenuti qui presenti si riferiscono alla versione per J1.5 di  Joomla! component builder, i contenuti aggiornati sono disponibili in lingua inglese: Create components for Joomla! - Managing the front end.

State cercando uno sviluppatore per realizzare un componente?

Questa pagina spiega come usare il nostro programma per generare componenti, ma, se siete alla ricerca di qualcuno che possa convertire in codice una vostra idea, contattateci, creeremo per voi il componente desiderato. È uno dei nostri servizi professionali

 

Funzionamento dei componenti per Joomla! 1.5

Non vogliamo qui spiegare ancora il funzionamento della progettazione MVC in Joomla!TM, dato che è già stata descritta dagli stessi autori, e che, dell'articolo in questione, ne è diponibile anche la traduzione italiana; ci limiteremo a seguire il flusso dei dati attraverso le varie classi.

Una curiosità: la 'metafora' modello-vista-controllore, non è una idea propriamente recente, in effetti risale al 1979, ed è descritta in un articolo dedicato a SmallTalk di Trygve Reenskaug. Si è poi iniziato a parlare di 'pattern design' a partire dall'agosto 1994 dopo la pubblicazione di "Design Patterns - Elements of reusable Object-Oriented Software" di Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, lettura che consiglio vivamente a chiunque abbia una qualche conoscenza di OOP e voglia migliorarsi.

Ogni componente di Joomla! ha, sia che si parli di front end, sia che si parli di back end, un entry point. Questi è un file php, con nome equale a quello del componente, cui sono inviate tutte le richieste che debbono essere gestite dal componente stesso. Questo file si occuperà poi di definire quale view e quale controller caricare.

 

Lato Front - End

A lato front end il lavoro base dell'entry point è decisamente semplice, infatti, dato che, di norma, l'accesso avviene tramite una voce di menù, la view è già definita nell'URL creato da Joomla!.

http://www.example.com/index.php?option=com_ccat&view=ccatbrands

Ad esempio, l'URLin questione fa si che Joomla! cerchi il file ccat.php nella cartella /components/com_ccat/:

...  [ccat.php]
// Require the base controller
require_once (JPATH_COMPONENT.DS.'controller.php');
...
// Create the controller
$classname = 'CcatController'.$controller; // $controller==""
$controller = new $classname();
// Perform the Request task
$controller->execute( JRequest::getVar('task'));

Il file ccat.php, come si vede dal codice, carica il controller di default.

  • /components/com_ccat/controller.php

 

Il controller di default creato da Joomla! Component Builder, in realtà, non ha nessun codice proprio, ma fa sì che venga richiamato il costruttore ed il metodo display (default se $task non è definito) della classe base JController. Ciò forzerà, data la presenza di view=ccatbrands nell'URL, il caricamento automatico dei seguenti files:

  • /components/com_ccat/views/ccatbrands/view.html.php
  • /components/com_ccat/views/ccatbrands/tmpl/default.php
  • /components/com_ccat/models/ccatbrands.php

Un passo indietro:

  1. quando viene eseguita l'istruzione $controller->execute( JRequest::getVar('task')) nel file /components/com_ccat/ccat.php
  2. viene richiamato il metodo display() del file /components/com_ccat/controller.php
  3. questi a sua volta richiama il metodo display() della classe CcatViewCcatbrands in /components/com_ccat/views/ccatbrands/view.html.php

All'interno di quest'ultimo file abbiamo, in mezzo ad altre, le seguenti linee di codice:

function display($tpl = null){
$data = $this->get( 'Data' );
$this->assignRef( 'data', $data );
...
parent::display($tpl);
}

L'intestazione del metodo display prevede il parametro opzionale $tpl, Attenzione! non è il nome del template da caricare, ma il nome del sub-template!

  1. L'istruzione $data = $this->get( 'Data' ) richiama il metodo getData() all'interno del file /components/com_ccat/models/ccatbrands.php (classe CcatModelCcatbrands), il quale metodo effettua la query sul db e restituisce un recordset come array di oggetti in standard Joomla!.
  2. L'istruzione $this->assignRef( 'data', $data ) crea la proprietà $this->data all'interno della classe CcatViewCcatbrands in modo che questi dati siano facilmente accessibili dal template.
  3. L'istruzione parent::display($tpl) richiama ed esegue il file /components/com_ccat/views/ccatbrands/tmpl/default.php che visualizza il contenuto del recordset.

All'interno del file /components/com_ccat/views/ccatbrands/tmpl/default.php troverete un codice simile a questo:

<?php foreach($this->data as $dataItem): ?>
<?php
$link = JRoute::_( "index.php?option=com_ccat&view=ccatbrand&brand_id={$dataItem->id}" );

?>
<div class="ccat_viewBrandsItemName" >
<a href="/<?php echo $link; ?>"><?php echo $dataItem->name; ?></a>
</div>
<?php endforeach; ?>

Il loop foreach itera tutti i record recuperati dal metodo getData(), presente nel model, ed assegnati alla proprietà $this->data dalla view con assignRef().

L'istruzione $link = JRoute::_( "..." ) crea l'URL per visualizzare il singolo record, nelle righe successive si vede come usare questo URL (<a href="/<?php echo $link; ?>">) e come recuperare i dati dal record set ($dataItem->name, ove "name" è il nome del campo della tabella), Joomla! Component Builder riporterà tutti i capi della tabella di riferimento, sta a voi decidere quali visualizzare e scrivere il codice per la generazione del layout ritenuto più opportuno.

Per quanto riguarda la visualizzazione del singolo record il processo è praticamente uguale, ovviamente nel template non vi è il foreach: semplice, no?

Commenti   

0 #2 Nicola 2011-09-09 14:14
Ho creato un componente che ha sia frontend che backend.

Nel lato frontend, ho dei form, ma se li invio a mezzo POST, la pagina risultante mostra tutti i moduli presenti in homepage.
Questo (ritengo) perchè l'url risultante è dominio/index.php

Però nel post ci sono tutte le variabili di routing (component,controller,ecc..)

Non capisco il perchè
Devo passarli per forza via GET?

===Risposta:
ciao nicola,
è giusto che il post sia fatto a index.php, ed è indifferente che sia fatto in get o post, a meno che tu non abbia modificato il codice di base.

assicurati invece che sia previsto il caricamento delle parti aggiunte nell'entry point del front end del componente: vedi dove vi è il commento:

// define default controller & view if you need routing...


ciao,
marco
Citazione
0 #1 Guest 2011-04-08 17:21
informazioni molto utili grazie!
Citazione

Aggiungi commento

Please note: URL in text are not linked and user's site address is only for internal use and is not published.

Comments are human checked. All spam will be removed, so don't waste your time and, especially, mine!

Codice di sicurezza
Aggiorna