LOGIC Library

Questo sito rappresenta l'impegno di Logic nella condivisione delle esperienze acquisite nel lavoro quotidiano. L'obiettivo è creare una solida base di conoscenze e condividere le esperienze nello sviluppo software e nell'amministrazione dei sistemi.

Per maggiori informazioni su di noi, visitate logicsistemi.it.

Sviluppare componenti MVC per Joomla 2.5 - Parte 8

Con questo post, finalmente, completeremo il nostro esempio dal punto di vista delle funzionalità, aggiungendo le funzioni di creazione e modifica dei record.

Per far questo introdurremo una nuova vista e i form di Joomla (JForm), anche se questo aspetto, vista la sua complessità, sarà analizzatto solo superficialmente.

Il model per la modifica

Torniamo al model AnagraficheModelPersona definito nel file persona.php nella cartella model.

Se vi ricordate avevamo dichiarato un metodo, getForm, in quanto essendo astratto avrebbe generato un errore durante l’utilizzo.

Questo metodo è presente poiché il nostro model eredita da JModelAdmin, classe che implementa i metodi di inserimento e cancellazione dal database, che a sua volta eredita da JModelForm. Questa classe mette a disposizione dei metodi che ci consentono di definire i campi da visualizzre nel nostro form tramite un apposito file XML. Questa possibilità viene completata con funzionalità aggiuntive che prevedono la creazione di campi personalizzati e la validazione dei dati inseriti nel form.

Modifichiamo il model in questo modo:

<?php
defined('_JEXEC') or die();
jimport( 'joomla.application.component.modeladmin' );
class AnagraficheModelPersona extends JModelAdmin
{    
    public function getForm($data = array(), $loadData = true)
    {
        // Get the form
        $form = $this->loadForm('com_anagrafiche.persona', 'persona', 
           array('control' => 'jform', 'load_data' => $loadData));
        if (!$form) {
            return false;
        } else {
            return $form;
        }
    }
    public function loadFormData()
    {
        // Load form data
        $data = $this->getItem();
        return $data;
    }
}

Il metodo getForm, di fatto, si limita a chiamare il metodo loadForm, passandogli, nell’ordine, i seguenti parametri:

  • Il nome del form. Se ho capito bene questo nome viene utilizzato per memorizzare le informazioni in una struttura interna in modo da evitare di ricaricare più volte gli stessi dati. Probabilmente è solo un meccanismo di ottimizzazione, tuttavia è bene che il nome dato sia unico in tutto Joomla!, pertanto utilizziamo anche il nome del componente.
  • La sorgente XML. Questo è normalmente il nome del file XML che verrà caricato dall’apposita cartella (in questo caso persona.xml). E’ anche possibile specificare direttamente il codice XML del form impostando opportunamente i parametri successivi
  • Un array di opzioni. Le opzioni che passiamo riguardano il control, che agirà sui nomi dei vari controlli, i quali saranno nella forma jform[nomecampo], e un parametro,  load_data, che specifica se il valore dei campi deve essere popolato (modifica) o vuoto (inserimento). In caso di modifica i dati vengono popolati richiamando la funzione loadFormData.

La funzione loadFormData è decisamente semplice e utilizza getItem, che già conosciamo, per recuperare i dati dal database.

Definizione del form

Come detto il form viene definito tramite un file XML. Creiamo, all’interno della cartella models, la cartella forms e, al suo interno, il file persona.xml con il seguente contenuto.

<?xml version="1.0" encoding="UTF-8"?>
<form>
    <fieldset>
        <field 
            name="id" 
            type="hidden" />
        <field 
            name="nome" 
            type="text" 
            label="NOME"
            size="40"
            class="inputbox" />
        <field 
            name="cognome" 
            type="text" 
            label="COGNOME"
            size="40"
            class="inputbox" />
    </fieldset>
</form>

Come si vede viene definito l’elenco dei campi (denominati field), con il rispettivo nome, il tipo, l’etichetta e una serie di opzioni che dipendono dal tipo.

Il nome deve coincidere con il nome del campo nel database, mentre per quanto riguarda il tipo, potete trovare a questo link un elenco dei controlli che Joomla! mette a disposizione in modo nativo.

View e template per il form

Ultimo passo, creiamo la view e il relativo template per visualizzare il nostro form.

All’interno della cartella views creiamo la nuova cartella persona e al suo interno la cartella tmpl. Dentro la cartella person creiamo il file view.html.php con il seguente contenuto.

<?php
// Check to ensure this file is included in Joomla!
defined('_JEXEC') or die();
jimport( 'joomla.application.component.view' );
class AnagraficheViewPersona extends JView
{
    function display($tpl = null)
    {
        // Get data from the model
        $item = $this->get( 'Item' );
        $form = $this->get( 'Form' );
        $isNew = ($item->id < 1);
        // Disable main menu
        JRequest::setVar('hidemainmenu', true);
        // Toolbar
        if ($isNew) {
            JToolBarHelper::title( JText::_( 'INSERIMENTO' ), 'generic.png' );
        } else {
            JToolBarHelper::title( JText::_( 'MODIFICA' ), 'generic.png' );
        }
        JToolBarHelper::apply('persona.apply');
        JToolBarHelper::save('persona.save');
        JToolBarHelper::save2new('persona.save2new');
        JToolBarHelper::cancel('persona.cancel', $isNew ? 'JTOOLBAR_CANCEL' : 'JTOOLBAR_CLOSE');
        $this->item = $item;
        $this->form = $form;
        parent::display($tpl);
    }
}

Ormai dovrebbe esservi tutto chiaro, ma evidenziamo alcuni aspetti.

  • Vengono recuperati i dati con getItem. Questo potrebbe essere superfluo, ma viene fatto in quanto nel template ci servirà il valore del campo id
  • Viene recuperato il form, sotto forma di oggetto, di cui utilizzeremo alcuni metodi.
  • Viene composta la toolbar, impostando un titolo diverso a seconda che siamo in modifica o in inserimento
  • Vengono aggiunti un po’ di pulsanti che consentiranno di salvare rimanendo nella stessa pagina, salvare tornando all’elenco, salvare procedendo ad un nuovo inserimento o annullare l’operazione. Tutte queste operazioni sono standard e, come vedremo, già gestite dal nostro controller.

Passiamo ora al template. Create il file edit.php nella cartella tmpl con il seguente contenuto:

<?php 
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

$option = JRequest::getCmd('option');

JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
?>
<form action="index.php" method="post" name="adminForm" id="persona-admin-form" class="form-validate">
    <input type="hidden" name="option" value="<?=$option?>" />
    <input type="hidden" name="task" value="" />
    <input type="hidden" name="id" value="<?=$this->item->id?>" />
    <?php echo JHtml::_('form.token'); ?>
    
    <fieldset class="adminform">
        <legend><?=JText::_( 'DETAILS' ); ?></legend>
        <ul class="adminformlist">
<?    foreach ($this->form->getFieldset() as $field) { ?>
            <li><?=$field->label?><?=$field->input?></li>
<?    } ?>
        </ul>
    </fieldset>
</form>

Tutte cose che già conosciamo, tranne la chiamata getFieldset, che restituisce un array con i field precedentemente definiti e con proprietà già predisposte per generare il codice HTML necessario. Questa struttura è molto comoda, in particolare poiché aggiungere o togliere campi si limiterà a modificare il file XML, unico posto in cui vengono definiti.

In più è stato aggiunto il campo id nascosto. Si tratta un po’ di un doppione, ma necessario in quanto il campo id specificato nel form, in realtà viene rinominato come jform[id] e non più individuato in sede di modifica.

Fate attenzione al template che, in questo caso, non si chiama default.php, ma edit.php. Questa scelta, standard in Joomla!, è legata al fatto che default dovrebbe essere per la visualizzazione, edit per la modifica. In questo modo possiamo mantenere 2 template differenti sulla stessa view da utilizzare in base all’operazione richiesta o ai permessi dell’utente.

Il controller

Tutto il resto del codice necessario è implementato da Joomla! e, in particolare, il controller definito in persona.php ha già i metodi per salvare i dati e fare gli opportuni redirect in base al task selezionato. Questo metodo chiama il metodo save del model, il quale provvede ad utilizzare la table per il salvataggio.

Un dietro le quinte complicato, ma per noi nulla da scrivere, tranne una piccola cosa…

Joomla! parla inglese e, dopo il salvataggio di un record, per tornare all’elenco, si aspetta di chiamare una vista che si chiama come quella di modifica (persona), ma al plurale. Peccato che in inglese tale plurale sia personas!!!

Dobbiamo fare una piccola modifica per specificare come si chiama la vista di elenco e questo viene fatto modificando il controller AnagraficheControllerPersona nel seguente modo:

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
// import Joomla controlleradmin library
jimport('joomla.application.component.controllerform');
class AnagraficheControllerPersona extends JControllerForm
{
    public function __construct($config = array())
    {
        $this->view_list = 'persone';
        parent::__construct($config);
    }
}

Il significato è abbastanza semplice, anche se il mio consiglio è di iniziare ad abituarvi a scrivere tutto il codice in inglese.

Creazione del pacchetto

La struttura presente sul nostro pc sarà ora la seguente (ho aggiunto un po’ di file index.html che avevo dimenticato negli esempi precedenti):

com_anagrafiche
  admin
    anagrafiche.php
    controller.php
    index.html 
    controllers
      index.html 
      persona.php 
      persone.php 
    models
      forms
        index.html 
        persona.xml 
      index.html 
      persona.php 
      persone.php 
    sql 
      index.html 
      install.sql 
      uninstall.sql 
      updates 
        index.html 
        1.0.3.sql 
        1.0.4.sql 
        1.0.5.sql 
        1.0.6.sql 
    tables 
      index.html 
      persona.php 
    views
      index.html
      persona
        index.html 
        view.html.php 
        tmpl 
          edit.php 
          index.html 
      persone
        index.html 
        view.html.php 
        tmpl
          default.php 
          index.html 
  site 
    anagrafiche.php 
    index.html 
  anagrafiche.xml

Mentre il file anagrafiche.xml dovrà essere modificato nel seguente modo:

<?xml version="1.0" encoding="UTF-8"?>
<install type="component" version="2.5.0" method="upgrade">
    <name>Anagrafiche</name>
    <author>Edy Incoletti</author>
    <authorEmail>edy.incoletti@logicsistemi.it</authorEmail>
    <authorUrl>eincoletti.wordpress.com</authorUrl>
    <creationDate>March 2012</creationDate>
    <version>1.0.6</version>
    <description>Gestione anagrafiche per tutorial.</description>
    <files folder="site">
        <filename>index.html</filename>
        <filename>anagrafiche.php</filename>
    </files>
    <install folder="admin">
        <sql>
            <file charset="utf8" driver="mysql">sql/install.sql</file>
        </sql>
    </install>
    <uninstall folder="admin">
        <sql>
            <file charset="utf8" driver="mysql">sql/uninstall.sql</file>
        </sql>
    </uninstall>
    <update>
      <schemas>
        <schemapath type="mysql">sql/updates</schemapath>
      </schemas>
    </update>
    <administration>
        <files folder="admin">
            <filename>index.html</filename>
            <filename>anagrafiche.php</filename>
            <filename>controller.php</filename>
            <folder>controllers</folder>
            <folder>models</folder>
            <folder>sql</folder>
            <folder>tables</folder>
            <folder>views</folder>
        </files>
    </administration>
</install>

Rispetto alla versione precedente è stato solamente aggiornato il numero di versione.

Come al solito è possibile installare il pacchetto utilizzando il vostro pacchetto o quello che trovate qui.

Nel prossimo post metteremo a posto un po’ di dettagli e, in particolare, affronteremo il meccanismo della localizzazione, intesa come traducibilità in varie lingue.

Commenti   

 
#1 marco 2013-07-30 22:59
ciao edy ho provato ad eseguire l'esempio da te scritto però quando clicco sul record visualizzato in output mi rimanda sempre sul metodo diplay della view persone ...secondo te cosa potrei aver sbagliato qualche indicazione??
Citazione
 
 
#2 marco 2013-08-01 19:34
Citazione marco:
ciao edy ho provato ad eseguire l'esempio da te scritto però quando clicco sul record visualizzato in output mi rimanda sempre sul metodo diplay della view persone ...secondo te cosa potrei aver sbagliato qualche indicazione??

per capire meglio ho copiato interamente lo zip nella directory dei doc di wamp però quando clicco sul record per modificarlo mi reindirizza a questo link
http://localhost/gmappa/administrator/index.php?option=com_anagrafiche&task=persona.edit&id=1
che però non trova ...cosa potrebbe essere?
Citazione
 
 
#3 Edy Incoletti 2013-08-12 08:52
Citazione roberto:
Citazione marco:
Citazione marco:
ciao edy ho provato ad eseguire l'esempio da te scritto però quando clicco sul record visualizzato in output mi rimanda sempre sul metodo diplay della view persone ...secondo te cosa potrei aver sbagliato qualche indicazione??

per capire meglio ho copiato interamente lo zip nella directory dei doc di wamp però quando clicco sul record per modificarlo mi reindirizza a questo link
http://localhost/gmappa/administrator/index.php?option=com_anagrafiche&task=persona.edit&id=1
che però non trova ...cosa potrebbe essere?


In effetti anche a me non funziona ... nel mio caso cerca di aprire /test/ecc ecc ecc anzichè localhost/test ecc ecc

qualcosa da modificare nella default.php immagino

Potrebbe essere dovuto al fatto che non state lavorando nella root di localhost, ma in una sotto-cartella.
Citazione
 
 
#4 MarianoFev 2013-11-05 16:47
Ciao, a me non funzionavano i bottoni "salva", "salva", "salva e chiudi", "salva e nuovo" e "chiudi".
Ho risolto inserendo, nel file edit.php il valore di "adminForm" all'id:
Citazione