Un problema con i checkbox nello sviluppo di un componente

Il tema

codiceIl checkBox ha la caratteristica di assumere un valore, predefinito, solo nel caso esso sia checked.
Ovvero un form invia ( tra l'altro via Post o Get) il valore del checkBox solo se questi è checked. Nel caso esso non sia checked non invia niente. Questo comportamento può generare un problema.

Il problema

Associando il valore di un campo di una tabella di DB ad un tag di tipo checkBox, si riscontrano due eventualità

  1. nel caso il checkBox sia checked al post del form e conseguente memorizzazione del record, tutto procede come previsto: il valore associato al checked viene memorizzato nel campo del record della tabella del db.
  2. nel caso il checkBox non sia checked al post del form il corrispondente valore non viene passato e, quindi, non memorizzato nel campo del record della tabella del db. La cosa non va bene quando, in aggiornamento di un record, si vuole commutare lo stato del valore associato al checkBox: da checked a (not)checked.

La soluzione

Primo intervento



Nel file XML, associato al form interessato, ovvero il form che contiene il campo checkBox, occorrerà inserire il tag di decodifica del campo stesso. Nell’ esempio il campo della tabella ha nome thumbNail: creiamo, quindi, il nuovo tipo di campo come da manuale.

Listato frammento script: com_example/models/forms/mio_form.xml

 
<!—Frammento di codice XML relativo alla ridefinizione di un checkBox—>
<field name="thumbNail" type="checkhidebox" id = "thumbNail"
label = "COM_EXAMPLE_LBL_CKECKBOX"
description = "COM_EXAMPLE_DESC_CKECKBOX"
class = ""
default = "0"
/>
 

nb: il “type” a cui fa riferimento il field è checkhidebox.

ad esso sarà associato il file successivo


Secondo intervento

grazie alla ::Rules form field type:: provvisto da joomla! possiamo creare un nuovo tipo di campo di nome checkhidebox esattamente con lostesso nome del campo creato nell’ intervento I.
In tal caso occorrerà creare uno script di nome checkhidebox.php e memorizzarlo nella opportuna cartella com_example/models/fields.

Lo script in questione consta nel creare un campo composto da un input.hidden con il nome del campo della tabella del Db interessata e, da un checkBox di supporto al quale è demandata l’azione di associare qualunque valore desiderato al campo di input 1 / 0 - On / Off - true / false. Tale azione viene associata all’ evento onchange come visibile dallo script sottostante.
Il checkBox continuerà a essere nullo nel caso non sia checked ma, non avrà più importanza perché, il valore inviato dal form sarà quello assunto dal tag input.hidden che, in quanto tale, sarà sempre inviato.

Listato script: com_example/models/fields/checkhidebox.php

 
<?php
/**
* @version 1.0.0
* @package com_example
* @copyright Copyright (C) 2014. Tutti i diritti riservati.
* @license GNU General Public License versione 2 o successiva; vedi LICENSE.txt
* @author Capera <Questo indirizzo email è protetto dagli spambots. È necessario abilitare JavaScript per vederlo.> - http://caperaweb.it
*/
defined('JPATH_BASE') or die;
jimport('joomla.form.formfield');
/**
* Supports an HTML select list of categories
*/
class JFormFieldCheckHideBox extends JFormField {
/**
* The form field type.
*
* @var string
* @since 1.6
*/
protected $type = 'checkhidebox';
/**
* Method to get the field input markup.
*
* @return string The field input markup.
* @since 1.6
*/
protected function getInput() {
//
$html = array();
$id = $this->id;
$name = $this->name;
$value = $this->value;
//
$html[] = "<input type='text' name='$name' value='$value' id='$id' />”;
$html[] = "<input
type='checkbox'
name='support_$name'
onchange='if (this.checked) {
document.getElementById(\"$id\").value=\"1\";}
else
{document.getElementById(\”$id\").value=\"0\";
}' " . ($value == '0' ? '' : 'checked' ) . "/>";
return implode($html);
}
}
 


CommentaCommenta questo articolo sul forum