valori[$offset]); } public function offsetGet($offset) { return $this->valori[$offset]; } /**#@-*/ /** @ignore */ function AbsPath(){ if (!$_SERVER['MyFields']['PathSito']) { $_SERVER['MyFields']['PathSito']=str_replace('\\','/',$_SERVER['DOCUMENT_ROOT']).'/'; $v=explode('/',str_replace('\\','/',dirname(__FILE__))); for ($i=0;$i+1AbsPath(); return str_replace('//','/',$_SERVER['MyFields']['PathSito']); } function get_MyFormsPath() { $this->AbsPath(); return str_replace('//','/',$_SERVER['MyFields'][ 'MyFormsPath']); } /** * Costruttore di classe * @param array $tabella Opzionale è un array di righe, le righe vengono reindicizzate da zero a prescindere dalle chiavi **/ function myMatrix(&$tabella) { if (!is_array($tabella)) $this->valori=array(); else foreach ($tabella as $nriga=>&$riga) { if (!$this->intestazioni && is_array($riga)) $this->intestazioni=array_keys($riga); $this->valori[]=&array_values($riga); } } /** @ignore */ function ins_array(&$array,$dove,$cosa) { if ($cosa===null) return; if (!isset($array[$dove])) {$array[$dove]=$cosa; ksort($array); } else { $i=count($array); while ($i>$dove) {$array[$i]=$array[$i-1]; --$i; } $array[$dove]=$cosa; } } /** @ignore */ function riformatta($val) { if (!preg_match('#[/.-]#',$val)) return $val; if (preg_match('#^(([0-9]{4})[/.-]([0-9]{1,2})[/.-]([0-9]{1,2}))$#', $val)) return $val; if (preg_match('#^(([0-9]{1,2})[/.-]([0-9]{1,2})[/.-]([0-9]{4}))$#', $val,$regs)) return "$regs[3].$regs[2].$regs[1]"; if (preg_match('#^(([0-9]{4})[/.-]([0-9]{1,2})[/.-]([0-9]{1,2}))#', $val)) {$x=explode(' ',$val); if (count($x)==2 && preg_match('#([0-9]{4})[/.-]([0-9]{1,2})[/.-]([0-9]{1,2})#', $x[0])) return $val; } return $val; } /** @ignore */ function _sortcmp($a, $b) { foreach ($this->aSortkeys['dati'] as $col=>$verso) { if ($this->aSortkeys['case']=='s') $r = strnatcmp($this->riformatta($a[$col]), $this->riformatta($b[$col])); else $r = strnatcmp(strtolower($this->riformatta($a[$col])), strtolower($this->riformatta($b[$col]))); if ($verso == "-") $r = $r * -1; if ($r!=0) break; } return $r; } /** * Riordina la tabella Case sensitive * @param array $ordine E' un array associativo che ha come chiave il numero di colonna da ordinare e come valore i simboli +- a seconda se l'ordnamento è crescente o decrescente **/ function Sort($ordine) { if(count($ordine)) { //ksort($ordine); $this->aSortkeys['dati']=$ordine; $this->aSortkeys['case']='s'; usort($this->valori,array($this,"_sortcmp")); } return $this; } /** * Riordina la tabella Case Unsensitive * @param array $ordine E' un array associativo che ha come chiave il numero di colonna da ordinare e come valore i simboli +- a seconda se l'ordnamento è crescente o decrescente **/ function USort($ordine) { if(count($ordine)) { //ksort($ordine); $this->aSortkeys['dati']=$ordine; $this->aSortkeys['case']='u'; usort($this->valori,array($this,"_sortcmp")); } return $this; } /** * Inserisce la 'riga' nella posizione pos * @param array $riga * @param int $pos Opzionale, se non c'è si accoda **/ function ins_row ($riga,$pos='') { $riga=array_values($riga); //if (!$this->intestazioni) $this->intestazioni=array_keys($riga); if ($pos==='') $pos=$this->get_N_rows(); $this->ins_array($this->valori,$pos,$riga); return $this; } /** * Inserisce la 'colonna' nella posizione pos * @param array $colonna * @param int $pos Opzionale, se non c'è si accoda **/ function ins_col ($colonna,$pos='') { $i=0; if ($pos==='') $pos=$this->get_N_cols(); for ($i=0;$i<$this->get_N_rows();$i++) $this->ins_array($this->valori[$i],$pos,$colonna[$i]); return $this; } /** * Restituisce una colonna come array singolo a chiave numerica * * @param int $ncolonna * @return array **/ function get_col ($ncolonna) { for ($i=0;$i<$this->get_n_rows();$i++) $out[$i]=$this->valori[$i][$ncolonna]; return $out; } /** * Restituisce una riga come array singolo a chiave numerica * * @param int $nriga * @return array **/ function get_row ($nriga) { return $this->valori[$nriga]; } /** * Restituisce il numero di colonne * @return int **/ function get_N_cols () { if (is_array($this->valori)) foreach ($this->valori as $id=>&$riga) $max=max($max,max(array_keys($riga))); return $max+1; } /** * Cancella la colonna pos * @param int $pos **/ function del_col ($pos) { $i=0; unset($this->intestazioni[$pos]); if (is_array($this->intestazioni)) $this->intestazioni=array_values($this->intestazioni); for ($i=0;$i<$this->get_N_rows();$i++) {unset($this->valori[$i][$pos]); if (is_array($this->valori[$i])) $this->valori[$i]=array_values($this->valori[$i]); } return $this; } /** * Cancella la riga pos * @param int $pos **/ function del_row ($pos) { unset($this->valori[$pos]); return $this; } /** * Restituisce la matrice o ina sottomatrice sottoforma di array[][] * * @param int $colStart colonna di partenza per il prelievo della matrice (se omessa parte da 0) * @param int $rowStart riga di partenza per il prelievo della matrice (se omessa parte da 0) * @param int $colStop colonna di arrivo per il prelievo della matrice (se omessa prende tutte le colonne) * @param int $rowStop riga di arrivo per il prelievo della matrice (se imessa prende tutte le righe) * @param boolean $trasposta se true traspone la matrice prelevata, altrimenti la lascia com'è * @return array **/ function &get_matrix ($colStart=0,$rowStart=0,$colStop='',$rowStop='',$trasposta=false) { if (!$trasposta && $colStart==0 && $rowStop=='' && $colStop=='') return $this->valori; if ($rowStop==='') $rowStop=$this->get_N_rows(); if ($colStop==='') $colStop=$this->get_N_cols(); if ($rowStart>$rowStop || $colStart>$colStop) return array(); $nuova=array(); $k=0; for ($i=$colStart;$iget_N_cols());$i++) { $v=0; for ($j=$rowStart;$jget_N_rows());$j++) { if ($trasposta) $nuova[$k][$v]=$this->valori[$j][$i]; else $nuova[$v][$k]=$this->valori[$j][$i]; $v++; } $k++; } return $nuova; } /** * Setta i valori interni * @param array $valori è un array [][] con chiavi numeriche da 0 **/ function set_matrix (&$valori,$giaNumerica=false,$intestazioni=array()) { $this->valori=array(); $this->intestazioni=$intestazioni; if (!$giaNumerica)$this->myMatrix($valori); else $this->valori=&$valori; return $this; } /** * Restituisce il numero di righe * @return int **/ function get_N_rows () { return count($this->valori); } /** * Restituisce il contenuto di una cella * @param int $riga * @param int $colonna * @return mix **/ function &get_cell ($riga,$colonna) { return $this->valori[$riga][$colonna]; } } /** * Classe per la Gestione facilitata di tabelle html, vedi myTableFormQry * @package myTables **/ Class myTable extends myMatrix{ /**#@+ @ignore */ protected $parametri_table, $parametri_tr,$parametri_td,$parametri_th, $N, $PAG, $id, $sortJS,$myJQueries=array(); protected $jQuery,$sortJquery,$opzioniOrdJquery,$cssJquery,$opzioneOrdine,$zebra,$arrayColoreRighe,$evRiga,$filtro; protected $opzioniJquery,$Fisso; /**#@-*/ /** * Costruttore di classe * @access public * @param array $tabella Opzionale è un array di righe, le righe vengono reindicizzate da zero a prescindere dalle chiavi * @param string $parsTable Opzionale sono i parametri di default da associare al tag TABLE * @param string $parsTR Opzionale sono i parametri di default da associare da associare al tag TR * @param string $parsTD Opzionale sono i parametri da associare al tag TD * @param string $parsTH Opzionale sono i parametri da associare al tag TH **/ function myTable($tabella='',$parsTable='',$parsTR='',$parsTD='',$parsTH='') { parent::myMatrix($tabella); $this->catch_id($parsTable); $this->set_pars($parsTable,$parsTR,$parsTD,$parsTH); } /** @access private */ function __toString(){ return $this->get_html(); } protected function catch_id(&$testo) { if(preg_match('#\s*id\s*=\s*["\']{0,1}([^"\']+)["\']{0,1}#i',$testo,$m)) {$this->id=$m[1]; $testo=str_replace($m[0],' ',$testo); } else $this->set_id(str_replace('-','_',MyUUID::v4())); return $this; } function set_id($id) { $this->id=$id; } function get_id() { return $this->id; } function add_myJQuery(myJQuery $myJQ) { if(method_exists($myJQ, 'application')) $myJQ->application($this); $k=spl_object_hash($myJQ); unset($this->myJQueries[$k]); return $this->myJQueries[$k]=$myJQ; } /** * @ignore */ protected function send_html($html){ if($this->myJQueries) foreach ($this->myJQueries as $myjq) $js.=$myjq->get_new_html($html); return $html.$js; } /** * Setta parametri di default per i tag della tabella es. class='css' * @param string $parsTable Opzionale sono i parametri di default da associare al tag TABLE * @param string $parsTR Opzionale sono i parametri di default da associare da associare al tag TR * @param string $parsTD Opzionale sono i parametri da associare al tag TD * @param string $parsTH Opzionale sono i parametri da associare al tag TH **/ function set_pars($parsTable='',$parsTR='',$parsTD='',$parsTH='') { if ($parsTable) $this->parametri_table=$parsTable; if ($parsTR) $this->parametri_tr=$parsTR; if ($parsTD) $this->parametri_td=$parsTD; if ($parsTH) $this->parametri_th=$parsTH; return $this; } /** * Viene chiamata per ogni cella quando si costruisce l'html della tabella, estendendo questa classe e * riscrivendo questo metodo è possibile inserire regole di visualizzazione personalizzate in base a riga,colonna * es. se si vuole che il dato della colonna 6 sia un link che usa il valore della colonna 7 * Class prova extends myTable { * function ricalcola_cella($riga,$colonna) { * if ($colonna!=6) return parent::ricalcola_cella($riga,$colonna); * else return '<a href="link.php?parametro='.$this->get_cell($riga,7).'">'.$this->get_cell($riga,6).'</a>'; * } * } * @param int $riga * @param int $colonna * @return string Il valore che deve comparire nella cella della tabella **/ function &ricalcola_cella($riga,$colonna) { return $this->get_cell($riga,$colonna); } /** * Viene chiamata per ogni cella quando si costruisce l'html della tabella, estendendo questa classe e * riscrivendo questo metodo è possibile inserire regole di visualizzazione personalizzate in base a riga,colonna,tag * Attenzione, se si ricalcola un tag per qualsiasi motivo i parametri di default impostati con set_pars non verranno utilizzati, * occorrerà quindi riscriverli * es. se si vuole alternare la classe CSS usata per le righe * Class prova extends myTable { * function ricalcola_TAG($riga,$colonna,$tag) { * if ($tag!='TR') return parent::ricalcola_TAG($riga,$colonna,$tag); * elseif ($riga%2==0) return "class='ClasseXPari'"; * else return "class='ClasseXDispari'"; * } * } * @param int $riga * @param int $colonna * @param string $tag Può essere 'TR','TD','TABLE' * @return string l'html opzionale da aggiungere al tag **/ function ricalcola_TAG($riga,$colonna,$tag) { if ($tag=='TABLE' && $this->parametri_table) return $this->parametri_table; if ($tag=='TR' && $this->parametri_tr) return $this->parametri_tr; if ($tag=='TD' && $this->parametri_td) return $this->parametri_td; } /** * Viene chiamata per ogni cella quando si costruisce l'html dell'intestazione della tabella, estendendo questa classe e * riscrivendo questo metodo è possibile inserire regole di visualizzazione personalizzate in base a colonna,tag * Attenzione, se si ricalcola un tag per qualsiasi motivo i parametri di default impostati con set_pars non verranno utilizzati, * occorrerà quindi riscriverli * * * N.B. IL PARAMETRO IN ENTRATA $tag E' CONSIDERATO "TD" ANCHE SE DI FATTO E' UN "TH" * * es. se si vuole alternare l'allineamento dell'intestazione * * Class prova extends myTable { * function ricalcola_TAG_intestazione($colonna,$tag) { * if ($tag!='TD') return parent::ricalcola_TAG_intestazione($colonna,$tag); * elseif ($riga%2==0) return "align='left'"; * else return "align='right'"; * } *} * * @param int $colonna * @param string $tag Può essere 'TR','TD' * @return string l'html opzionale da aggiungere al tag **/ function &ricalcola_TAG_intestazione($colonna,$tag) { if ($tag=='TR' && $this->parametri_tr) return $this->parametri_tr; elseif ($tag=='TD') { if($this->parametri_th) return $this->parametri_th; else return $this->parametri_td; } } /** * Setta le intestazioni della tabella * @param array $intestazioni E' un array con le "scritte" da associare ad ogni colonna **/ function set_intestazioni($intestazioni) { if (is_array($intestazioni)) $this->intestazioni=array_values($intestazioni); return $this; } /** * Restituisce le intestazioni della tabella * @return array $intestazioni **/ function get_intestazioni() { return $this->intestazioni; } /** * Setta l'intestazione di una colonna della tabella * @param int $colonna * @param string $intestazione E' la "scritte" da associare a $colonna **/ function set_intestazione($colonna,$intestazione) { $this->intestazioni[$colonna]=$intestazione; return $this; } /** * Inserisce una colonna di icone nella posizione pos * @param string $intestazione E' la "scritte" da associare a $colonna * @param int $pos se non c'è si accoda **/ function add_intestazione($intestazione,$pos='') { if ($this->intestazioni) { if ($pos==='') $this->intestazioni[]=$intestazione; ELSE {foreach ($this->intestazioni as $i=>$v) { if ($i==$pos) $nuovo[]=$intestazione; $nuovo[]=$v; } $this->intestazioni=$nuovo; } } return $this; } /** * Inserisce una colonna di icone nella posizione pos * * $valori=array( array(1,'pippo'), * array(2,'topolino'), * array(3,'pluto') * ); * $tabella=new myTable($valori); * $i=new MyIcon('/icone/edit.png'); //creo un'icona * $i->set_link(new MyLink('gestione.php','Modifica dati')); //le assegno un link ad un script che per cancellare chiede le chiavi in _GET * $tabella->add_col_icone($i, array('codice'=>0) ); * * * @param MyIcon $Icona * @param array $parametri E' un array associativo con il nome del parametro e la colonna da cui prendere il valore da usare per arricchire il link dell'icona * @param int $pos se non c'è si accoda **/ function add_col_icone($Icona,$parametri='',$pos='') { if (is_array($parametri) && $link=$Icona->get_link()) $newLink=$link->clonami(); for ($i=0;$i<$this->get_N_rows();$i++) { if ($newLink) { $href=$link->get_attributo('href'); $url=''; $time=time(); if (is_array($parametri)) foreach ($parametri as $NomeCol=>$NumCol) { if(is_array($NumCol)){ $numCol=array_shift($NumCol); $obj=array_shift($NumCol); if($obj instanceof myTable_Plugin_for_add_col_icone) $val=$obj->add_col_val($NomeCol,$this->get_cell($i,$numCol)); else $val=$this->get_cell($i,$numCol); $url.="&$NomeCol=".rawurlencode($val); } else $url.="&$NomeCol=".rawurlencode($this->get_cell($i,$NumCol)); } $href.=(strpos($href,'?')!==false?'&':'?')."ttt=$time$url"; $newLink->set_attributo('href',$href); $Icona->set_link($newLink); $x[$i]=$Icona->get_Html(); } } $this->ins_col($x,$pos); return $this; } /** * Setta il numero di righe da visualizzare per pagina ed il numero di pagina da cui partire * @param int $N Numero di righe per pagina * @param int $pag Il numero della pagina che verrà visualizzata da 1 in poi **/ function set_limit($N,$pag='') { $this->N=$N; if ($pag<=0) $pag=1; if ($pag*$N>$this->get_N_rows()+$N) $pag=(int)($this->get_N_rows()/$N); if ($pag<=0) $pag=1; $this->PAG=$pag; return $this; } /** * Restituisce il selettore con la scelta di tutte le pagine disponibili * @param string $class Opzionale è la classe CSS da associale al selettore * @return MySelect **/ function get_pager($classe='') { if (!$this->N) $this->N=$this->get_N_rows(); if (!$this->PAG) $this->PAG=1; $i=1; while (($i-1)*$this->N<$this->get_N_rows()) {$pags[$i]=$i; $i++;} $mysel=new MySelect('MyPage',$this->PAG); if (is_array($pags)) {foreach ($pags as $i=>$v) $pags[$i]="$i di ".count($pags); $mysel->set_opzioni(array_flip($pags)); $mysel->SetReloadJS('completo'); } return $mysel; } /** * Inserisce una colonna di check nella posizione pos * @param MyChek $Check * @param array $parametri E' un array associativo con il nome del parametro e la colonna da cui prendere il valore da usare per arricchire il link dell'icona * @param int $pos se non c'è' si accoda **/ function add_col_check($Check,$parametri='',$pos='') { //if (is_array($parametri) && $link=$Icona->get_link()) $newLink=$link->clonami(); for ($i=0;$i<$this->get_N_rows();$i++) { if (is_array($parametri)) foreach ($parametri as $NomeCol=>&$NumCol) $valore=rawurlencode($this->get_cell($i,$NumCol)); $Check->set_value($valore); $x[$i]=$Check->get_Html(); } $this->ins_col($x,$pos); return $this; } /** * Restituisce il corpo della tabella in html senza ed eventuale intestazione * @param array $colonne E' opzionale e se inserito indica i numeri delle colonne da visualizzare (viene rispettato l'ordine) * @param array $righe E' opzionale e se inserito indica i numeri delle righe da visualizzare (viene rispettato l'ordine) * @param boolean $compresoTable viene inserito o meno il tag /TABLE * @return string **/ function &get_body_html($colonne='',$righe='',$compresoTable=false) { if (is_array($righe)) $righe=array_flip((array) $righe); /* if ($colonne) $colonne=array_flip($colonne);*/ if (!$this->N) $this->N=$this->get_N_rows(); if (!$this->PAG) $this->PAG=1; $i=($this->PAG-1)*$this->N; $n=$this->get_N_rows(); if ($compresoTable) $out= "\n
id?'id="'.$this->id.'" ':'').$this->ricalcola_TAG(-1,-1,'TABLE')." >"; $out.=""; while ($iPAG*$this->N,$n)) { if ((!$righe || isset($righe[$i])) && $this->valori[$i]) { $rigahtml=''; if (is_array($this->valori[$i])) { if (!$colonne) $colonne=array_keys((array) $this->valori[$i]); foreach ($colonne as &$j) { $tag=$this->ricalcola_TAG($i,$j,'TD'); if($tag!==false) $rigahtml.=''; } } $ric_tr=&$this->ricalcola_TAG($i,$j,'TR'); if($ric_tr!==false) $out.='$rigahtml\n"; } $i++; } return $out."".($compresoTable?"\n
'.$this->ricalcola_cella($i,$j).'
".$this->get_ordineJS():''); } /** * Setta l'ordinamento della tabella tramite Javascript, funziona solo se poi si usa il metodo get_html(); * @param array $criteri è un array che associa alla colonna il tipo di dato number,string,date, * * es. se si vuole ordinare una tabella di 4 colonne per la prima che è un numero e la terza che è un data * * $criteri=array('number','','date',''); * $tabella->set_ordineJS($criteri); * tabella->get_html(); * **/ function set_ordineJS($criteri) { $this->sortJS=' "; return $this; } /** * Restituisce la sola riga d'intestazione in html * @param array $colonne E' opzionale e se inserito indica i numeri delle colonne da visualizzare * @param boolean $compresoTable viene inserito o meno il tag TABLE * @return string **/ function &get_header_html($colonne='',$compresoTable=false) { if ($compresoTable) $out= "\nid?'id="'.$this->id.'" ':'').$this->ricalcola_TAG(-1,-1,'TABLE')." >"; if (!$this->intestazioni ) return $out; $valori[-1]=$this->intestazioni; if (is_array($this->intestazioni)) { if (!$colonne) $colonne=array_keys($this->intestazioni); foreach ($colonne as $j) { $tag=$this->ricalcola_TAG_intestazione($j,'TD'); if($tag!==false) $rigahtml.=''; } } $ric_tr=&$this->ricalcola_TAG_intestazione($j,'TR'); if($ric_tr!==false) $intesta="\n$rigahtml\n"; unset($this->valori[-1]); return $out."sortJS?" class='MysortedTable'":'').">$intesta\n"; } /** * Restituisce la tabella in html * @param array $colonne E' opzionale e se inserito indica i numeri delle colonne da visualizzare * @param array $righe E' opzionale e se inserito indica i numeri delle righe da visualizzare * @return string */ function &get_html($colonne='',$righe='') { if (!$this->get_N_rows()) return ''; $html=($this->get_header_html($colonne,true).$this->get_body_html($colonne,$righe,false).'
'.$this->intestazioni[$j].'
'); return $this->send_html($html); } /** @access private */ function get_ordineJS(){ static $__myTables; if ($this->sortJquery){ return $this->sortJquery; } else{ if ($this->sortJS && !$__myTables['SortTableJS']) { $js=" "; $__myTables['SortTableJS']=1; } return $js.$this->sortJS; } } /** * Importa un myTable da html * Ecco come importare la seconda tabella contenuta in questo html e poi aggiungerci una riga * * $html=" * * * * *
AB
12
1122
* * * * * * * * * * * * * * * * * *
ABC
123
112233
"; * * $t=new myTable(); * $t->importa_html($html,2) * ->ins_row(array(111,222,333)); * echo $t; *
* * * @param string $html html da lavorare * @param int $quale numero d'ordine della tabella da importare * @param boolean $accoda se true accoda i valori a quelli correnti (ma solo per le prime n colonne dove n è il numero di colonne già in memoria) * @param boolean $solodati se true importa solo i dati altrimenti anche gli attributi a table,th,tr,td (ma solo se comuni a tutti i tag come da esempio) */ function importa_html(&$html,$quale=1,$accoda=false,$solodati=false) { if (!$accoda) $this->set_matrix($x=array()); if (!$solodati) { $this->parametri_th=''; $this->parametri_tr=''; $this->parametri_td=''; $this->parametri_table=''; } if(preg_match_all("~]*)>.*~Uis",$html,$m)) if(($table=$m[0][$quale-1])) { if(!$solodati) $this->parametri_table=$m[1][$quale-1]; $table=preg_replace(array('@]*>@Uis', '@@Uis', '@]*>@Uis', '@@Uis', '@]*>@Uis', '@@Uis'),'',$table); if(preg_match_all("~]*)>(.*)~Uis",$table,$m) && $m[1]) { foreach ($m[1] as &$v) $v=trim($v); $this->set_intestazioni((array) $m[2]); if(!$solodati && $m[1]) { if (implode(chr(0),$m[1])===implode(chr(0),array_fill(0,count((array)$m[1]),$m[1][0]))) $this->parametri_th=trim($m[1][0]); } $salta=true; } if(preg_match_all("~]*)>(.*)]*>~Uis",$table,$m)) {unset($m[0]); if($salta) unset($m[2][0]); if(!$solodati && $m[1]) { if (implode(chr(0),$m[1])===implode(chr(0),array_fill(0,count((array)$m[1]),$m[1][0]))) $this->parametri_tr=trim($m[1][0]); } unset($m[1]); $attr_td=array(); foreach ($m[2] as &$riga) if(preg_match_all('~]*)>(.*)]*>~SUis',$riga,$mm) && $mm[2]) { if(!$solodati) $attr_td=array_merge($attr_td,$mm[1]); $this->ins_row($mm[2]); } if(!$solodati && $attr_td) { if (implode(chr(0),$attr_td)===implode(chr(0),array_fill(0,count((array)$attr_td),$attr_td[0]))) $this->parametri_td=trim($attr_td[0]); } } } return $this; } /** @access private */ function clonami() { if (PHP_VERSION >= 5) return clone($this); else return (unserialize(serialize($this))); } } /** * Classe per la Gestione facilitata di tabelle html basate su query * es. Supponiamo di voler fare una visualizzazione paginata dei nominativi * * //istanzio la classe passando connessione, query, se salvare il risultato della query in sessione, parametri aggiuntivi per la TABLE * $mat=new myTableQry($conn,"Select id,cognome,nome,matricola from utenti where cognome<>'' order by cognome,nome",true,'border=1 width=100%'); * $mat->set_limit(5,$_GET['MyPage']); //setto 5 righe per pagina a partire da quella passata in _GET (si fa in automatico) * * echo $mat->get_html(); //visualizzo tabella * $pager=$mat->get_pager(); //estrapolo il visualizzatore di pagine disponibili che crea l'apposito link da passare in _GET * echo "Scegli Pag. ".$pager->get_html(); //visualizzo il visualizzatore * * @package myTables **/ Class myTableQRY extends myTable{ /**#@+ @ignore */ protected $conn; /**#@-*/ /** * Costruttore di classe * @access public * @param ADONewConnection $conn E' connessione ADODB * @param string $qry E' la query da lanciare * @param boolean $ForzaQRY Opzionale se true si ripete la query ad ogni cambio pagina o se false(default) si riusano i valori gia estrapolati nella query precedente * @param string $parsTable Opzionale è il nome della classe css da associare al tag TABLE * @param string $parsTR Opzionale è il nome della classe css da associare al tag TR * @param string $parsTD Opzionale è il nome della classe css da associare al tag TD * @param string $parsTH Opzionale sono i parametri da associare al tag TH **/ function myTableQRY(&$conn,$qry,$ForzaQRY='',$parsTable='',$parsTR='',$parsTD='',$parsTH='') { $this->conn=$conn; session_register('__myTableQRY'); //$conn->debug=1; if ($_GET['MyPage'] && !$ForzaQRY && $_SESSION['__myTableQRY']['cache'][md5($qry)]) { $this->intestazioni=$_SESSION['__myTableQRY']['cache'][md5($qry)]['intestazioni']; $this->valori= $_SESSION['__myTableQRY']['cache'][md5($qry)]['valori']; } else{ $mode=$this->conn->setfetchmode(ADODB_FETCH_ASSOC); $_SESSION['__myTableQRY']['cache']=array(); $RS=&$conn->execute($qry); IF (!$this->intestazioni && $RS->fields) $this->set_intestazioni(array_keys($RS->fields)); $this->valori=array(); while ($RS && !$RS->EOF) { $this->ins_row($RS->fields); $RS->movenext(); } $this->conn->setfetchmode($mode); unset($_SESSION['__myTableQRY']['cache']); $_SESSION['__myTableQRY']['cache'][md5($qry)]['intestazioni']=$this->intestazioni; $_SESSION['__myTableQRY']['cache'][md5($qry)]['valori']=$this->valori; } $this->catch_id($parsTable); $this->set_pars($parsTable,$parsTR,$parsTD,$parsTH); } } /** * myTableQRY ottimizzata per query lunghe che richiedono la paginazione non * c'è forzatura di query nel costruttore perchè i dati vengono letti di volta in volta quando viene chiamato il set_limit. * Il DB utilizzato deve supportare selezione da riga a riga es. selectlimit * @package myTables **/ Class myTableQRYPaginata extends myTable{ /**#@+ @ignore */ protected $conn,$qry,$nrighe=null, $extrarighe; /**#@-*/ /** * Costruttore di classe * @access public * @param ADONewConnection $conn E' connessione ADODB * @param string $qry E' la query da lanciare * @param string $parsTable Opzionale è il nome della classe css da associare al tag TABLE * @param string $parsTR Opzionale è il nome della classe css da associare al tag TR * @param string $parsTD Opzionale è il nome della classe css da associare al tag TD * @param string $parsTD Opzionale è il nome della classe css da associare al tag TH **/ function myTableQRYPaginata(&$conn,$qry,$parsTable='',$parsTR='',$parsTD='',$parsTH='') { $this->qry=$qry; $this->conn= $conn; $this->catch_id($parsTable); $this->set_pars($parsTable,$parsTR,$parsTD,$parsTH); } /** * Restituisce il numero di righe * @return int **/ function get_N_rows () { if ($this->nrighe===null) { $q=preg_split('#\s+order\s+by\s+#siU',$this->qry); if (count($q)>1) unset($q[count($q)-1]); $q=implode(' order by ',$q); if (!preg_match('#^\s*select\s+distinct\s+#siU',$q)) { $qtemp=str_replace(array("\n","\r","\t"),array(' ',' ',' '),$q); while (($pos=stripos($qtemp,' from ',$pos))!==false) { if (substr_count($qtemp,'(',0,$pos)==substr_count($qtemp,')',0,$pos)) { $q="select 1 ".substr($q,$pos); break; } $pos+=5; } } $this->nrighe=$this->conn->getone("select count(*) from ($q) mysubDir"); } return $this->nrighe+$this->extrarighe; } /** * Inserisce la 'riga' nella posizione pos * USARE SOLO DOPO @see set_limit() * @param array $riga * @param int $pos Opzionale, se non c'è si accoda **/ function ins_row ($riga,$pos='') { if (isset($this->valori[$pos])) $this->extrarighe++; parent::ins_row ($riga,$pos); return $this; } /** * Setta il numero di righe da visualizzare per pagina ed il numero di pagina da cui partire * E' in questa fase cha avviene il recupero dei dati dal DB * * @param int $N Numero di righe per pagina se =0 si prenderanno tutte le righe ed il pager sarà nullo * @param int $pag Il numero della pagina che verrà visualizzata da 1 in poi **/ function set_limit($N,$pag='') { if ($pag<=0) $pag=1; if ($N) $RS=&$this->conn->selectlimit($this->qry,$N,(int)($N*($pag-1))); else $RS=&$this->conn->execute($this->qry); IF (!$RS->fields && $N) {$LastPag=1 + (int)($this->get_N_rows()/$N); if ($LastPag!=$pag) $this->set_limit($N,$LastPag); return; } $i=(int)($N*($pag-1)); $mode=$this->conn->setfetchmode(ADODB_FETCH_ASSOC); while ($RS && !$RS->EOF) { if (!$intestazioni) $intestazioni=array_keys($RS->fields) ; $this->valori[$i++]=&array_values($RS->fields); ++$lette; $RS->movenext(); } $this->conn->setfetchmode($mode); if ($N*($pag-1)==0 && (!$N || $lette<$N)) $N=$this->nrighe=$lette; $this->N=$N; $this->PAG=$pag; IF ($intestazioni && !$this->intestazioni) $this->set_intestazioni($intestazioni); return $this; } /** * Restituisce il selettore con la scelta di tutte le pagine disponibili * @param string $class Opzionale è la classe CSS da associale al selettore * @param string $reload Indica il tipo di reload da applicare completo|submit|... ecc. * @return MySelect **/ function get_pager($classe='',$reload='completo') { $mysel=new MySelect('MyPage',$this->PAG); if (!$this->N) return $mysel; if (!$this->PAG) $this->PAG=1; $i=1; while (($i-1)*$this->N<$this->get_N_rows()) {$pags[$i]=$i;$i++;} if (is_array($pags)) {foreach ($pags as $i=>$v) $pags[$i]="$i di ".count($pags); $mysel->set_opzioni(array_flip($pags)); if ($reload) $mysel->SetReloadJS($reload); } return $mysel; } } /** * myTableQRYPaginata ottimizzata per mysql * @package myTables * **/ Class myTableQRY_MySQL extends myTableQRYPaginata{ /** * Costruttore di classe * @access public * @param ADONewConnection $conn E' connessione ADODB * @param string $qry E' la query da lanciare * @param string $parsTable Opzionale è il nome della classe css da associare al tag TABLE * @param string $parsTR Opzionale è il nome della classe css da associare al tag TR * @param string $parsTD Opzionale è il nome della classe css da associare al tag TD * @param string $parsTH Opzionale è il nome della classe css da associare al tag TH **/ function myTableQRY_MySQL(&$conn,$qry,$parsTable='',$parsTR='',$parsTD='',$parsTH='') { parent::myTableQRYPaginata($conn,$qry,$parsTable,$parsTR,$parsTD,$parsTH); } } /** * myTableQRYPaginata ottimizzata per Oracle 10g * @package myTables * **/ Class myTableQRY_Oracle extends myTableQRYPaginata{ /** * Costruttore di classe * @access public * @param ADONewConnection $conn E' connessione ADODB * @param string $qry E' la query da lanciare * @param string $parsTable Opzionale è il nome della classe css da associare al tag TABLE * @param string $parsTR Opzionale è il nome della classe css da associare al tag TR * @param string $parsTD Opzionale è il nome della classe css da associare al tag TD * @param string $parsTH Opzionale è il nome della classe css da associare al tag TH **/ function myTableQRY_Oracle(&$conn,$qry,$parsTable='',$parsTR='',$parsTD='',$parsTH='') { parent::myTableQRYPaginata($conn,$qry,$parsTable,$parsTR,$parsTD,$parsTH); } } ##################################################################################################################################### /** * Classe per la Creazione facilitata di form per la gestione di tabelle di piccola dimensione (es tabelle di codifica * es. Supponiamo di voler fare un form per la cancellazione di nominativi * * //istanzio la classe passando connessione, query, l'elenco delle chiavi primarie della tabella da gestire, parametri aggiuntivi per la TABLE * $mat=new myTableQry($conn,"Select id,cognome,nome,matricola from utenti where cognome<>'' order by cognome,nome",'border=1 width=100%'); * $mat->set_limit(5,$_GET['MyPage']); //setto 5 righe per pagina a partire da quella passata in _GET (si fa in automatico) * * $v=new MyIcon('chiudi.gif'); //creo un'icona * $v->set_Domanda('Sicuro di voler cancellare?'); //le assegno domanda di conferma * $v->set_link(new MyLink('/cancella.php?opz=x','Elimina questo record')); //le assegno un link ad un script che per cancellare chiede le chiavi in _GET * * $mat->add_col_icone($v,array('matricola','id'),4); //aggiungo una colonna fatta con le icone i cui link verranno personalizzati sulla base delle chiavi ad ogni riga * echo $mat->get_html(); //visualizzo tabella * $pager=$mat->get_pager(); //estrapolo il visualizzatore di pagine disponibili che crea l'apposito link da passare in _GET * echo "Scegli Pag. ".$pager->get_html(); //visualizzo il visualizzatore * **/ Class myTableForm extends myTableQRY{ /** * Costruttore di classe Ottimizzato per mysql * @access public * @param ADONewConnection $conn E' connessione ADODB * @param string $qry E' la query da lanciare * @param string $parsTable Opzionale è il nome della classe css da associare al tag TABLE * @param string $parsTR Opzionale è il nome della classe css da associare al tag TR * @param string $parsTD Opzionale è il nome della classe css da associare al tag TD * @param string $parsTH Opzionale sono i parametri da associare al tag TH **/ function myTableForm(&$conn,$qry,$parsTable='',$parsTR='',$parsTD='',$parsTH='') { parent::myTableQRY($conn,$qry,true,$parsTable,$parsTR,$parsTD,$parsTH); // if (is_array($this->intestazioni)) foreach ($this->intestazioni as $id=>$nome) $this->chiavi[strtoupper($nome)]=$id; // foreach ($chiavi as $K) if (isset($int[strtoupper($K)])) $this->chiavi[$K]=$int[strtoupper($K)]; } } /**#@+ @ignore */ include_once(dirname(__FILE__).'/myDeprecated/myTables.php'); //include_once(dirname(__FILE__).'/myExtras/myTables.php'); /**#@-*/ ?>