giovedì 30 agosto 2007

Joomla 1.5: Sviluppo Componenti (Amministrazione)

Il componente di esempio MyForm è ora in grado di ricevere dati inviati da un modulo, compiere un controllo di validità degli stessi e salvarli nel database.

Resta da scrivere la funzione di visualizzazione dei dati che sarà inserita nella parte di amministrazione del componente (backend).

La parte di amministrazione di un componente per Joomla 1.5 è strutturata in modo del tutto analogo a quello della parte pubblica che abbiamo visto fino ad ora. Avremo quindi un file principale (entry point) e oggetti Controller, Model, View con relativo Template.

File principale (entry point). admin.myform.php

in .../administrator/components/com_myform/
defined('_JEXEC') or die('Restricted access');

require_once(JPATH_COMPONENT.DS.'controller.php');

$controller = new MyFormController();
$controller->execute(JRequest::getVar('task'));
$controller->redirect();

Stesse funzioni del corrispondente file della parte pubblica.

Controller. File controller.php

in .../administrator/components/com_myform/
defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.controller');

class MyFormController extends JController {}

Per ora definiamo solo la classe, non ci serve implementare alcun metodo.

Model. File myform.php

in .../administrator/components/com_myform/models/
defined('_JEXEC') or die();
jimport('joomla.application.component.model');

class MyFormModelMyForm extends JModel {

  function _buildQuery() {
    $query = 'SELECT * FROM #__myform';
    return $query;
  }
 
  function getData(){
    $data = $this->_getList($this->_buildQuery());
    return $data;
  }
}

Implementiamo due metodi. Conviene, se possibile, centralizzare la creazione delle istruzioni sql utilizzate da un oggetto Model in un unico metodo (_buildQuery()). In questo caso abbiamo solo una semplicissima query per recuperare tutti i dati salvati nella tabella del componente.

Il metodo getData() utilizza questa query per ritornare un array contenente tutti i record della tabella.

Il metodo _getList(), ereditato da JModel, esegue la query che gli viene passata come argomento e ritorna il risultato sotto forma di array di oggetti.

View. File view.html.php

in .../administrator/components/com_myform/views/myform/

Come abbiamo visto in precedenza per ogni altro oggetto View dobbiamo implementare il metodo display()

defined('_JEXEC') or die('Restricted access');

jimport('joomla.application.component.view');

class MyFormViewMyForm extends JView {
    
  function display($tpl = null) {
    $items =& $this->get('Data');
    $this->assignRef('items', $items);
    parent::display($tpl);
  }
}

Quasi tutto già visto, ma la riga

$items =& $this->get('Data');

merita una spiegazione a parte. Quando in un oggetto Model è implementato un metodo il cui nome inizia con get, la View a cui l'oggetto Model è stato assegnato può accedere al valore di ritorno del metodo come se si trattasse di una sua proprietà il cui nome è dato dal nome del metodo meno il get iniziale.

Quella singola riga di codice è quindi l'equivalente, molto più leggibile e compatto, di

$model =& $this->getModel();
$items = $model->getData();

$items contiene l'array di record risultato della query impostata nel metodo _buildQuery() dell'oggetto Model.

Template. File default.php

in .../administrator/components/com_myform/views/myform/tmpl/

Non commento tutto il codice perché si tratta di semplici istruzioni per la visualizzazione dei dati.

Faccio solo notare che, poiché abbiamo nell'oggetto View

$this->assignRef('items', $items);

nel Template per leggere l'array che contiene i dati da visualizzare si usa

foreach($this->items as $item) {
  ...
}

File myform.xml

in .../administrator/components/com_myform/

La sezione tra <administrator> e </administrator> del file xml di installazione deve essere aggiornata per includere tutti i file che abbiamo appena aggiunto

<administration>
  <menu>My Form</menu>
  <files folder="admin">
    <filename>admin.myform.php</filename>
    <filename>controller.php</filename>
    <filename>tables/myform.php</filename>
    <filename>views/myform/view.html.php</filename>
    <filename>views/myform/tmpl/default.php</filename>
    <filename>models/myform.php</filename>
    <filename>install.sql</filename>
    <filename>uninstall.sql</filename>
  </files>  
</administration>

Il file del componente con le modifiche fatte in questo articolo è scaricabile dal sito (myform3.zip)

Per quanto sia solo un semplice esempio (oddio, magari sulla semplicità non tutti saranno d'accordo), il componente può essere già utilizzato. Volendo modificare o aggiungere campi al modulo si deve intervenire sulla struttura definita nell'oggetto Model della parte pubblica (.../components/com_myform/models/myform.php) di cui abbiamo parlato nel primo articolo di questa serie.

E' chiaro che dovranno essere modificati anche lo script per la creazione della tabella nel database (.../administrator/components/com_myform/install.sql) e la classe TableMyForm del componente (.../administrator/components/com_myform/tables/myform.php).

Un esempio così semplice non può certo esaurire tutto quello che ci sarebbe da dire sullo sviluppo di componenti per Joomla 1.5.

Però penso possa essere un buon punto di partenza per chi è interessato a questo argomento. Io lo sono parecchio per cui aspettatevi integrazioni e futuri sviluppi. Se necessarie anche correzioni perché, come detto fin dall'inizio, qui nessuno fa lezione e qualche errore è sempre possibile. Se siete interessati restate in zona.

Tutto il codice presentato è stato testato in locale sotto Windows XP + wamp5 (Apache/2.2.4, PHP 5.21, MySql 5.0.27)

Se riscontrate problemi nell'installazione o nell'uso del componente lasciate un commento.

Per il momento chiudiamo questa lunga chiaccherata su Joomla. Anche se è un cms che mi piace molto non è l'unica cosa di cui voglio parlare nel blog.

2 commenti:

koalacurioso ha detto...

grazie per questi post... mi sto muovendo da poco in questo campo e mi piacerebbe capirne di più... Ottimi esempi, complimenti

Toto007 ha detto...

Complimenti per il tutorial :)

Posta un commento

Nota. Solo i membri di questo blog possono postare un commento.