Funzionalità lato server


Per funzionare nella maniera che fa risparmiare in termini di traffico di rete e per avere la possibilità che l' insieme dei suoi dati sia dinamico, possa cioè cambiare ad ogni istante, ErgoDataGrid deve fare affidamento ad un server web Apache e ad un database MySql.
I dati così contenuti nelle tabelle del database vengono trasferiti al client di ErgoDataGrid solo per l' effettivo bisogno in ogni situazione di filtraggio, se un filtro è stato stabilito, di ordinamento e di numero di record visualizzati in ogni istante, e devono seguire la validazione da parte del server, che avviene nel modo qui riportato.

Per il lato client i passi da fare per attivare le funzionalità lato-server sono, nella creazione dell' oggetto Grid:

- impostazione di dataUrl sulla pagina PHP stabilita per il trasferimento dei dati.

Sul server, la pagina PHP con i dati da trasferire al browser deve avere una sintassi uguale a quella dell' esempio riportato in fondo, con le seguenti regole:

- deve includere i file dbutils.php e config.php, quest' ultimo con 4 variabili da settare secondo le impostazioni del server MySql usato:
mysql_host per il nome dell' host (nome_host:porta) su cui gira MySql;
mysql_db per il nome del database da cui provengono i dati;
mysql_user per il nome utente che deve accedere al db;
mysql_password per la password di accesso;

- le righe seguenti, prima della chiamata a mysql_connect per effettuare la connessione al database, sono la dichiarazione di 2 variabili (una è opzionale) e 4 array-proprietà fatta nel modo seguente:
$query è la stringa con l' istruzione di SELECT da passare a MySql.

è possibile dichiarare anche una variabile $imgPath con il percorso nel quale cercare i file con le immagini per i campi in cui il valore di ArrayGrid [col][2] sul lato client è uguale a I.

$ArrayFilter è un array con i nomi dei campi della tabella, presenti nella riga di intestazione passata al browser dal primo comando print, che determinano quali campi usare per il filtro di ogni colonna di ErgoDataGrid (la prima colonna a sinistra determina il filtro in base al campo di quest' array con indice 0, e così via);

$ArrayFilterType contiene l' array con la definizione (un carattere) del tipo di campo per ogni elemento di ArrayFilter, con i seguenti valori possibili:

          S = Stringa
          N = Numero
          D = Data
          I = Immagine

$ArraySortAsc è l' array con i nomi dei campi che determinano l' ordinamento di ErgoDataGrid quando il click dell' utente finale sul componente visualizzato dal browser stabilisce che il filtro deve essere crescente, quando cioè dopo il click compare una freccia rivolta verso l' alto vicino al nome della colonna;

ArraySortDesc è l' array che stabilisce quali campi determinano l' ordinamento decrescente; si può stabilire che sia uguale a ArraySortAsc;


- la connessione al database (istruzioni mysql_connect e mysql_select_db) deve essere seguita da
$isWhere = strstr(strtoupper($query)," WHERE ")!=FALSE;
ConvertFilterFields(); //opzionale, serve per l' internalizzazione delle griglie dati.
$out = PrintRecordCount("nomeTabella",$isWhere);
nomeTabella: stringa con il testo della query di selezione per i dati che segue la clausola FROM (nome della tabella più eventuale clausola WHERE); es. "Files WHERE Owner='Admin'", "Visits", "Product";

- l' istruzione che lancia la query vera e propria (mysql_query) ha questa sintassi:
$result = mysql_query($query . Filter($isWhere) . OrderBy() . DbPage() );
- il print che segue invia al browser la riga con l' intestazione dei dati della query, che include il nome della tabella, che deve essere uguale al nome dell' oggetto grid dichiarato nel file .js per il lato client di ErgoDataGrid.
- il ciclo while successivo è il trasferimento del corpo dei dati:
è opzionale rispettare le regole dell' internazionalizzazione, valutando il valore di $_POST["lang"], che contiene la sigla della lingua scelta dall' utente finale per visualizzare la griglia e i dati.
- le righe finali sono una prassi della programmazione di MySql in PHP, e devono essere riportate come indicato.

Esempio: file dataCars.php
<?php
include "../../config.php";
include "../dbutils.php";

$imgPath="cars/";

$ArrayFilter=array("img_url","id","description","displacement","registration","km","power","fuel","price_euro");
$ArrayFilterType=array("I","M","S","N","D","N","N","S","N");
$ArraySortAsc=array("img_url","id","description","displacement","registration","km","power","fuel","price_euro");
$ArraySortDesc=$ArraySortAsc;
$query="SELECT *,UNIX_TIMESTAMP(registration) AS Date2 FROM Cars";
$conversion_value=1.26;
if (isset($_POST["lang"]) && $_POST["lang"]=="it") $lang="it"; else $lang="en";

function ConvertFilterFields() {
	global $lang,$conversion_value;
	if (!isset($_POST["F"])) return;
	$af=split("~",$_POST["F"]);
	$i=0;
	foreach($af as $ff) {
		if ($i<>0) $f.="~";
		if ($lang=="en") {
			$fi=split("[|]",$ff);
			for ($ii=0;$ii<count($fi);$ii++) {
				if ($ii<>0) $f.="|";
				if ($ii>1) {
					if ($fi[0]==5) {
						$f.=Round($fi[$ii]*1.609);
					} else if ($fi[0]==7) {
						if ($fi[$ii]=="Gasoline")
							$f.="Benzina";
						else
							$f.="Diesel";
					} else if ($fi[0]==8) {
						$f.=Round($fi[$ii]/$conversion_value);			
					} else
						$f.=$fi[$ii];
				} else
					$f.=$fi[$ii];
			}
		} else
			$f.=$ff;
		$i++;
	}
	$_POST["F"]=$f;
}

$link = mysql_connect($mysql_host, $mysql_user, $mysql_password);
mysql_select_db($mysql_db);

$isWhere=strstr(strtoupper($query)," WHERE ")!=FALSE;
ConvertFilterFields();
$out=PrintRecordCount("Cars",$isWhere);
$result = mysql_query($query . Filter($isWhere) . OrderBy() . DbPage());
$out .= '"table":"Cars","value":[';
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
       if ($lang=="it") {
		   $k=$row["km"];
		   $p=$row["price_euro"]; 
		   $f=$row["fuel"];   
	   } else { 
		   $k=round($row["km"]/1.609);
		   $p=round($row["price_euro"]*$conversion_value);
		   if ($row["fuel"]=="Benzina") $f="Gasoline"; else $f="Diesel";
	   }
	   $line=  "['". $imgPath. $row["img_url"] . "','"
			 . $row["id"] . "','"
             . $row["description"] . "','"
             . $row["displacement"] . "','"
             . ConvertDate(Date("l j F Y",$row["Date2"]),$lang) . "','"
             . Date("d/m/Y",$row["Date2"]) . "','"
             . Group($k) . "','"
             . $k . "','"
             . $row["power"] . "','"
             . $f . "','"
             . GroupImport($p);
			 if ($lang=="it") $line.= " €"; else $line.=" $";
			 $line.= "','" . $p . "'],";
  		$out .= $line;
}
$out = preg_replace("/,$/is","", $out);

print "{" . $out . "]}";
if (isset($result)) {
	mysql_free_result($result);
}
mysql_close($link);
?>