Joomla! - Autocomplete da Database

google-plus Scritto da . Postato in Joomla!

Nell'ultimo 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, nel 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);

input text automplete

Nel prossimo articolo proseguiremo nella scoperta di questo fantastico widget jQuery, affrontando il tema: jQuery Autocomplete con più parametri.

Se hai gradito l'articolo, condividilo, basta un click!

Commenti   

beatris
0 #1 beatris 2016-06-17 09:34
Ciao, io ho creato una web querry in excel dove ogni 5 min vengono aggiornati i dati della borsa. Però tutto questo non ha senso se non vengono pubblicati e aggiornati automaticamente sul mio sito. Dati che per adesso li aggiorno manualmente io.
Mi puoi aiutare al riguardo? Grazie mille
Citazione

Aggiungi commento


Codice di sicurezza
Aggiorna

  • logo prontopro
  • logo boutique serramento
  • koilab japan and tropical fish farm
  • Trasloco economico - gruppo Arco Traslochi
  • logo flash pulizie
  • logo revolution
  • logo planetkoi small
  • logo finiture
  • ick logo template
  • montaggio mobili trento

Realizzato da: Daniele Gagliardi
Viale Monache 3 - 38062 Arco - TN
- Contattami -

Per essere più facile ed intuitivo, il blog fa uso dei cookie, piccole porzioni di dati che consentono di capire come gli utenti navighino e ne visualizzino le pagine. I cookie non registrano alcuna informazione personale sull'utente ed eventuali dati identificabili non verranno memorizzati. La nostra Privacy Policy è cambiata: Ti invitiamo a prenderne visione. Oppure visiona la nostra Cookie Policy: