Joomla! - Autocomplete da Database
Nell'articolo precedente si è parlato di come inserire grazie al widget jQuery UI - Autocomplete, si possa inserire per un campo di una form una funzione di autocompletamento del testo.
Ora, vediamo di completarlo in maniera semplice ma efficace con un interrogazione in grado di richiedere i dati dell'array direttamente dal database interessato.
A tal proposito, nell'articolo di cui il link: Autocomplete di un campo con jQuery viene spiegato nel dettaglio quanto andremo a spiegare e a completare con questo articolo.
In effetti, è molto semplice realizzare il funzionamento desiderato. Per prima cosa, avendo in mente la tabella dalla quale ricavare i dati, bisognerà testare la query a database perché dia il risultato desiderato.
Questo lo si può fare con phpMyAdmin. La query seguente, si occupa di ricavare i comuni dalla tabella SobiPro dove sono memorizzate le aziende della directory Cerca Attività contrassegnata per l'id 13:
SELECT optValue
FROM vitr_sobipro_field_option
WHERE fid = 13 AND optValue LIKE '$this->term%'
ORDER BY optValue ASC";
Nella query, si pone la condizione di cercare tutti i comuni per i quali vale la clausola LIKE term, dove term è il parametro GET passato in maniera trasparente dal widget jQuery.autocomplete al file PHP.
A tal proposito il codice autocomplete della view, cambierà accettando per argomento, non più un vettore di dati esplicitamente scritti nel codice, ma il file PHP che ritornerà tale array:
<script>
$(document).ready(function(){
$("#field_comune").autocomplete({
source: "source.php"
});
});
</script>
Non dobbiamo preoccuparci di come si realizzerà poi l'elenco a discesa, in quanto tutto ciò che serve è il codice suddetto, che lascia apprezzare per la sua semplicità, la facilità d'uso di questo tool.
Il file PHP, conterrà la classe Autocomplete che si occupera di stabilire la connessione al database di Joomla, interrogare il database e per ultimo trasformare i dati dervanti dall'interrogazione in un vettore json, cioè del tipo di dati che è richiesto dal metodo Autocomplete.
La classe si presenta nella seguente maniera:
<?php
include 'configuration.php'; class Autocomplete
{
public $term;
public $conn;
public function __construct()
{
$this->dbConnect();
$this->term = mysql_real_escape_string($_GET['term']); // parametro term
}
//Metodo che svolge la connessione al Database
private function dbConnect()
{
$config = new JConfig;
$this->conn = mysql_connect($config->host,$config->user,$config->password) OR die("Connessione non riuscita");
mysql_select_db($config->db, $this->conn) OR die("Impossibile selezionare il database");
mysql_query("set names 'utf8'");
}
//Metodo che svolge l'interrogazione e la restituisce sotto forma di array
public function printResult()
{
$sql = "SELECT optValue
FROM vitr_sobipro_field_option
WHERE fid = 13 AND optValue LIKE '$this->term%'
ORDER BY optValue ASC";
$res = mysql_query($sql, $this->conn);
$return = array();
$arr = array();
while($row = mysql_fetch_array($res))
{
if($row['optValue'] != "")
{
$arr['value'] = $row['optValue'];
array_push($return, $arr);
}
}
//Il metodo json_encode trasforma l'array nel formato json
echo json_encode($return);
}
}
$autocomplete = new Autocomplete();
$autocomplete->printResult();
?>
Tutto ciò non funziona se la versione di PHP è uguale o inferiore alla 5.2.0.
Per ovviare a questo problema, visto che non potremmo contare sul metodo PHP json_encode, ricorriamo a una classe, che includiamo nel file source.php e che svolge tale utile funzione di conversione:
class custom_json {
/**
* Convert array to javascript object/array
* @param array $array the array
* @return string
*/
public static function encode($array)
{ // determine type
if(is_numeric(key($array))) { // indexed (list)
$output = '[';
for($i = 0, $last = (sizeof($array) - 1); isset($array[$i]); ++$i) {
if(is_array($array[$i])) $output .= self::encode($array[$i]);
else $output .= self::_val($array[$i]);
if($i !== $last) $output .= ',';
}
$output .= ']';
} else { // associative (object)
$output = '{';
$last = sizeof($array) - 1;
$i = 0;
foreach($array as $key => $value) {
$output .= '"'.$key.'":';
if(is_array($value)) $output .= self::encode($value);
else $output .= self::_val($value);
if($i !== $last) $output .= ',';
++$i;
}
$output .= '}';
} // return
return $output;
}
/**
* [INTERNAL] Format value
* @param mixed $val the value
* @return string
*/
private static function _val($val)
{
if(is_string($val))return '"'.$val.'"';
elseif(is_int($val)) return sprintf('%d', $val);
elseif(is_float($val)) return sprintf('%F', $val);
elseif(is_bool($val)) return ($val ? 'true' : 'false');
else return 'null';
} }
Nella classe Autocomplete, ciò che varierà, sarà la chiamata al metodo json_encode() che invece richiamerà il metodo encode della classe custom_json:
echo custom_json::encode($return); //al posto di json_encode($return);
Nel prossimo articolo proseguiremo nella scoperta di questo fantastico widget jQuery, affrontando il tema: jQuery Autocomplete con più parametri.
Commenti
Mi puoi aiutare al riguardo? Grazie mille
RSS feed dei commenti di questo post.