I checkbox nello sviluppo dei componenti per joomla

I checkbox e le pagine form: html e Joomla!

L'origine del problema è nota a tutti: lo standard html prevede che i campi checkbox non siano trasferiti, al submit della form che li contiene, a meno che non abbiano il segno di spunta, ovvero a meno che non siano checked (in termine tecnico). Le checkbox sono gli unici input con questo comportamento e da qui l'anomalia nella gestione.

Joomla!, dal canto suo, non gestisce i checkbox non checked e ne demanda al programmatore la gestione, come visibile dalla specifica del campo nella documentazione ufficiale in http://docs.joomla.org/Checkbox_form_field_type. Vi è un bel box con un warning che invita a fare attenzione a quello che è un "common mistake", ovvero pensare che sia il framework del componente a farsi carico della cosa.

Ma qual è il problema?

Il problema è che se uno pensa di mettere il segno di spunta per indicare di salvare il campo come checked la cosa funziona, ma se, al contrario, pensa di rimuovere il segno di spunta per salvare il campo con unchecked non funziona! il valore non è trasmesso e quindi non è effettuato il bind dei dati della form html con la form xml di definizione e il dato nel database sarà sempre checked.

Le soluzioni per Joomla! 1.5 e Joomla! 2.5 sono già state lungamente discusse, e qui vi è un sunto delle possibili soluzioni http://docs.joomla.org/Talk:Checkbox_form_field_type.

Visto che come mio solito, non amo né fare il traduttore del lavoro di altri, né ripetere cose dette e ridette, proporrò una mia soluzione, basata sulle nuove caratteristiche rese disponibili in Joomla! 3+.

 

Editing dei dati in Joomla!

checkbox e pagine form xmlLe funzioni di editing dei dati in Joomla! 2.5+ sono enormemente semplificate, rispetto alle precedenti versioni del cms, dal fatto che è possibile definire un file xml contenente le definizioni di tutti i campi presenti nel record del database che si intendono editare.

Questo file, come sapete, si trova nella cartella /administrator/components/com_[nome]/models/forms, che contiene le definizioni delle form di editing associate ad ogni model, ed è in formato xml e facilmente editabile.

 

Checkbox e definizione dei form fields type

Vediamo ora la sintassi per creare un checkbox non checked:

<field name="show_title" type="checkbox" label="Show title" description="Show the title of the item" value="1" default="0" />

La prima volta che editeremo l'informazione  la checkbox, non sarà checked, come giusto. Supponiamo di porre il segno di spunta e premere 'salva' (non salva e chiudi). Al reload la pagina mostrerà la checkbox correttamente flaggata.

Ora togliamo il segno di spunta dalla nostra checkbox e premiamo nuovamente 'salva': nulla, la checkbox rimane spuntata.

Come detto sopra Joomla! effettua il bind dei dati ricevuti dal submit della form html con le definizioni dei campi dati contenute nella form xml; se il dato non è stato trasmesso Joomla! non lo inserisce tra i dati restituiti e, quando poi viene effettuato il bind dei dati recuperati con la tabella destinata a contenerli, l'informazione non è presente e quindi non è aggiornata nel database.

 

Salvare le checkbox non inviate ma presenti nella form xml

Joomla! 3 ha esteso le funzionalità disponibili all'interno delle classi JForm e JFormField, permettendo ora, cosa non possibile con J2.5, una facile esplorazione dell'oggetto JForm e dei campi in esso definiti.

Risulta pertanto possibile iterare tutti i campi presenti nella form xml alla ricerca di eventuali checkbox e, se trovati, verificare che siano stati inseriti anche nei dati ricevuti dal submit della form di editing: se non sono presenti provvederemo ad inserirli con l'opportuno valore unchecked.

modifichiamo la linea che definisce la checkbox nella definizione dei dati in:

<field name="show_title" type="checkbox" label="Show title" description="Show the title of the item" value="1" unchecked="0" default="0" />

Abbiamo quindi inserito l'attributo unchecked che conterrà il valore da salvare se il campo non ha avuto il flag di spunta.

Se il valore per il campo senza segno di spunta è '0' si può anche evitare di modificare la definizione. Questa è solo una caratteristica aggiunta per gestire anche i casi particolari.

Provvediamo ora a scrivere la funzione che svolgerà il compito richiesto.

I dati ricevuti dal web sono disponibili all'interno del metodo JModelLegacy::validate($form, $data, $group = null); agire in questo punto ci permetterà anche di intervenire solo dopo che i dati siano stati opportunamente filtrati e verificati sulla base delle regole definite nella form di definizione: quindi all'ultimo stadio del processo e solo quando necessario.

Procediamo ora all'override del metodo citato, all'interno del model che avremo scritto per gestire i nostri dati, tramite il seguente codice:

public function validate($form, $data, $group = null){
  $data =  parent::validate($form, $data, $group);
  foreach($form->getFieldsets() as $fset){
    foreach($form->getFieldset($fset->name) as $f){
      if ( (JString::strcasecmp($f->type, 'Checkbox') == 0) &amp;&amp; !isset($data[$f->fieldname]) ) {
        $data[$f->fieldname] = $f->getAttribute('unchecked', '0');
      }
    }
  }
  return $data;
}
 

Ecco fatto! Se in $form (la form xml di definizione) è definito un campo di tipo checkbox, e questo campo non è presente nella hash table $data che contiene i dati associati ai campi definiti nell'xml, allora la funzione provvede ad inserire il relativo campo nella hash table ed a valorizzarlo con il valore relativo alla condizione unchecked.

Questo codice è assolutamente indipendente dal nome dei campi e dalla complessità della form, e può essere inserito in qualsiasi implementazione di JModelLegacy, purchè si tratti di Joomla!3.

 


Questo articolo propone una soluzione alternativa ad un problema abbastanza sentito tra gli sviluppatori e a questi ultimi, principalmente, si rivolge.

Se voi non siete sviluppatori ma avete necessità di realizzare un'estensione che si adatti ai vostri bisogni, senza che siate voi a dovervi adattare ad essa, non esitate a contattarci: è uno dei nostri servizi!

 

happy coding,

marco maria leoni

 

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