sortName = $sName;
$this->typeData = $tData;
}
/**
* Retourne un tableau avec le nom du tri et la construction du tri
*/
function recupTriParId($id) {
global $opac_default_sort;
// tri par défaut...
if($id == "default"){
//Plusieurs tris par défaut définis dans les paramètres ? On va cherche le tout premier
if (strstr($opac_default_sort,'|')) {
$tmpArray = explode(";",$opac_default_sort);
$tmpSort=explode("|",$tmpArray[0]);
$tab["nom_tri"] = $tmpSort[1];
$tab["tri_par"] = $tmpSort[0];
} else {
$tab["nom_tri"] = "";
$tab["tri_par"] = $opac_default_sort!= "" ? $opac_default_sort : "d_num_6,c_text_1";
}
return $tab;
}
switch($this->typeData) {
case 'base':
$result = mysql_query("SELECT nom_tri, tri_par FROM tris WHERE id_tri=" . $id);
if ($result) {
$tab = mysql_fetch_assoc($result);
mysql_free_result($result);
return $tab;
} else
return null;
break;
case 'session':
$tab["nom_tri"] = "";
if($_SESSION["sortname".$this->sortName.$id]){
$tab["nom_tri"] = $_SESSION["sortname".$this->sortName.$id];
}
$tab["tri_par"] = $_SESSION["sort".$this->sortName.$id];
return $tab;
break;
}
}
/**
* Pour initialiser un parcours des tris
* Retourne le nombre de tris
*/
function initParcoursTris($objSort) {
//on initialise la position du parcours
$this->posParcours = 0;
$this->nbResult=0;
$this->tabParcours=null;
switch($this->typeData) {
case 'base':
$result = mysql_query("SELECT id_tri, nom_tri, tri_par FROM tris WHERE tri_reference='" . $this->sortName . "' ORDER BY nom_tri;");
//echo "SELECT id_tri, nom_tri, tri_par FROM tris WHERE tri_reference='" . $this->sortName . "' ORDER BY nom_tri ";
if ($result) {
//on charge les tris dans un tableau
while ($this->tabParcours[$this->nbResult] = mysql_fetch_assoc($result)) {
$this->nbResult++;
}
mysql_free_result($result);
//s'il n'y a pas de tris
if ($this->nbResult==0) {
//on vide la session stockant le tri en cours
$_SESSION["tri"] = "";
}
return $this->nbResult;
} else {
$_SESSION["tri"] = "";
return 0;
}
break;
case 'session':
$this->nbResult = $_SESSION["nb_sort".$this->sortName];
//s'il n'y a pas de tris
if ($this->nbResult==0) {
//on vide la session stockant le tri en cours
$_SESSION["last_sort".$this->sortName]="";
} else {
//on charge les tris dans un tableau
for($i=0; $i<$this->nbResult; $i++) {
$this->tabParcours[$i]["id_tri"] = $i;
$this->tabParcours[$i]["nom_tri"] = $objSort->descriptionTri($_SESSION["sort".$this->sortName.$i]);
if($_SESSION["sortname".$this->sortName.$i]){
$this->tabParcours[$i]["nom_tri"] = $_SESSION["sortname".$this->sortName.$i];
}
$this->tabParcours[$i]["tri_par"] = $_SESSION["sort".$this->sortName.$i];
}
}
return $this->nbResult;
break;
}
}
/**
* Renvoi le tri suivant dans un parcours
*/
function parcoursTriSuivant() {
switch($this->typeData) {
case 'base':
$result = $this->tabParcours[$this->posParcours];
$this->posParcours++;
return $result;
break;
case 'session':
$result = $this->tabParcours[$this->posParcours];
$this->posParcours++;
return $result;
break;
}
}
/**
* Enregistre un tri
*/
function enregistreTri($id,$nomTri,$desTri) {
global $msg;
global $charset;
switch($this->typeData) {
case 'base':
//$criteres = implode(",",$desTri);
$txt_requete = "";
//modif ou insertion ?
if ($id != "") {
//on modifie le tri avec les nouveaux criteres
$txt_requete = "UPDATE tris SET nom_tri='" . addslashes($nomTri) . "', tri_par='" . $desTri . "' ";
$txt_requete .= "WHERE id_tri='" . $id . "'";
} else {
//on vérifie que le nom de tri n'existe pas
$txt_requete = "SELECT id_tri FROM tris WHERE nom_tri='" . addslashes($nomTri) . "'";
$txt_requete .= " AND tri_reference='" . $this->sortName . "'";
if (mysql_num_rows(mysql_query($txt_requete)) == 0) {
//on genere la requete d'insertion
$txt_requete = "INSERT INTO tris (id_tri, tri_reference, nom_tri, tri_par) ";
$txt_requete .= "VALUES ('','" . $this->sortName . "','" . addslashes($nomTri) . "','" . $desTri . "')";
} else {
//le nom existe : on le dit
return "";
}
}
if ($txt_requete!="") {
//execution de la requete de modif ou d'insertion
$requete = mysql_query($txt_requete);
if (!$requete) {
// il y a eu une erreur d'execution de la requete
return "Erreur mysql : " . $txt_requete . " " . mysql_error();
} else
return "";
} else
return "";
break;
case 'session':
//si nombre de tris enregistrés dans la session n'est pas null, parcours des variables de session pour l'existence tri et sauvegarde
if ($_SESSION["nb_sort".$this->sortName]<=0) {
$_SESSION["sort".$this->sortName.$_SESSION["nb_sort".$this->sortName]]=htmlentities($desTri,ENT_QUOTES,$charset);
if ($nomTri) {
$_SESSION["sortname".$this->sortName.$_SESSION["nb_sort".$this->sortName]]=htmlentities($nomTri,ENT_QUOTES,$charset);
}
$_SESSION["nb_sort".$this->sortName]++;
} else {
$bool=false;
for ($i=0;$i<$_SESSION["nb_sort".$this->sortName];$i++) {
if ($_SESSION["sort".$this->sortName.$i] == htmlentities($desTri,ENT_QUOTES,$charset)) {
$bool=true;
}
}
if ($bool==true) {
return "";
} else {
$_SESSION["sort".$this->sortName.$_SESSION["nb_sort".$this->sortName]] = htmlentities($desTri,ENT_QUOTES,$charset);
if ($nomTri) {
$_SESSION["sortname".$this->sortName.$_SESSION["nb_sort".$this->sortName]] = htmlentities($nomTri,ENT_QUOTES,$charset);
}
$_SESSION["nb_sort".$this->sortName]++;
}
}
break;
}
}
/**
* Supprime un tri
*/
function supprimeTri($sort_ids=array()) {
global $dbh;
switch($this->typeData) {
case 'base':
$q = 'delete from tris where id_tri in('.implode(',',$sort_ids).') ';
@mysql_query($q,$dbh);
break;
case 'session':
$nb_sort = $_SESSION['nb_sort'.$this->sortName];
$last_sort = $_SESSION['sort'.$this->sortName.$_SESSION['last_sort'.$this->sortName]];
//stockage des tris a conserver dans un tableau et suppression des variables session
$tab_sort = array();
$j=0;
for($i=0; $i<$nb_sort; $i++) {
if (!in_array($i,$sort_ids)) {
//ce n'est pas un tri a supprimer
//on le stocke dans le tableau
$tab_sort[$j]['descTri'] = $_SESSION["sort".$this->sortName.$i];
$tab_sort[$j]['nomTri'] = $_SESSION["sortname".$this->sortName.$i];
$j++;
}
unset($_SESSION['sort'.$this->sortName.$i]);
unset($_SESSION['sortname'.$this->sortName.$i]);
}
//reaffectation des variables session
$_SESSION['last_sort'.$this->sortName]="";
foreach($tab_sort as $k=>$v) {
$_SESSION['sort'.$this->sortName.$k]=$v['descTri'];
$_SESSION['sortname'.$this->sortName.$k]=$v['nomTri'];
if ($last_sort==$v) {
$_SESSION['last_sort'.$this->sortName]=$k;
}
}
$_SESSION['nb_sort'.$this->sortName]=count($tab_sort);
break;
}
}
}
/**
* Classe de tri des résultats de recherche dans le catalogue
* Utilise une variable de session("tri") pour stocker le tri en cours
*
*/
class sort {
//var $sort_name;
var $params;
var $error = false;
var $error_message = "";
var $table_tri_tempo = "tri_tempo"; //table temporaire à utiliser
var $table_primary_tri_tempo; //Clé primaire de la table temporaire à créer
var $limit; //limitation des enregistrements à utiliser dans la requête de tri pour le pager
var $champs_select; //champs éventuels à retourner dans la requête
var $table_select; //table éventuelle à retourner dans la requête
var $table_primary_key_select; //clé de la table éventuelle à retourner dans la requête
var $dSort; // objet d'acces aux informations
private static $nb_instance = 1;
/**
* Applique le tri donné
* @$sort_name nom du tri à appliquer
*/
function sort($sort_name, $accesTri) {
if ($sort_name) {
$sname = $sort_name;
} else {
$sname = 'notices';
}
$this->table_tri_tempo .= "_".self::$nb_instance;
self::$nb_instance++;
if ($accesTri) {
$this->dSort = new dataSort($sname,$accesTri);
} else {
$this->dSort = new dataSort($sname,'base');
}
//on charge le fichier XML
$this->parse();
//on ajoute les tris par défaut ajoutés en paramètres
$this->add_default_sort();
}
/**
* Ajoute les tris par défaut éventuellement saisis en paramètre
*/
function add_default_sort(){
global $opac_default_sort_list;
$sortArray = explode(" ",$opac_default_sort_list,2);
if ($sortArray[1] != "") {
if (strstr($sortArray[1],'|')) {
//on vérifie l'existence d'un flag : que la recherche par défaut ne revienne pas si l'utilisateur l'a supprimée par le formulaire
if(!isset($_SESSION['sort'.$this->sortName.'flag'])){
$tmpArray = explode(";",$sortArray[1]);
foreach($tmpArray as $tmpArrayElement){
//On récupère la chaine de tri, et le libellé
if(trim($tmpArrayElement)){
$tmpSort=explode("|",$tmpArrayElement);
$this->dSort->enregistreTri('',$tmpSort[1],$tmpSort[0]);
}
}
$_SESSION['sort'.$this->sortName.'flag']=1;
}
} else if (strstr($sortArray[1],';')) {
//on vérifie l'existence d'un flag : que la recherche par défaut ne revienne pas si l'utilisateur l'a supprimée par le formulaire
if(!isset($_SESSION['sort'.$this->sortName.'flag'])){
$tmpArray = explode(";",$sortArray[1]);
foreach($tmpArray as $tmpElement){
//On récupère la chaine de tri
if(trim($tmpElement)){
$this->dSort->enregistreTri('','',$tmpElement);
}
}
$_SESSION['sort'.$this->sortName.'flag']=1;
}
} else {
//on vérifie l'existence d'un flag : que la recherche par défaut ne revienne pas si l'utilisateur l'a supprimée par le formulaire
if(!isset($_SESSION['sort'.$this->sortName.'flag'])){
//On récupère la chaine de tri
if(trim($sortArray[1])){
$this->dSort->enregistreTri('','',$sortArray[1]);
}
}
$_SESSION['sort'.$this->sortName.'flag']=1;
}
}
}
/**
* Affiche l'écran de choix des tris enregistrés
*/
function show_tris_form() {
global $show_tris_form;
global $ligne_tableau_tris;
global $msg;
if ($this->dSort->initParcoursTris($this) == 0 ) {
//il n'y a pas de tris enregistrés
//on renvoie un message pour le dire
$tris = $msg['aucun_tri'];
} else {
// creation du tableau de la liste des tris enregistrés
$parity = 1;
$tris = "";
//affichage des enregistrements de tris possibles
while ($result = $this->dSort->parcoursTriSuivant()) {
//gestion du surlignage une ligne sur 2
if ($parity % 2)
$pair_impair = "even";
else
$pair_impair = "odd";
//html d'une ligne
$tristemp = str_replace("!!id_tri!!", $result['id_tri'], $ligne_tableau_tris);
$tristemp = str_replace("!!nom_tri!!", $result['nom_tri'], $tristemp);
$tristemp = str_replace("!!pair_impair!!", $pair_impair, $tristemp);
$tris .= $tristemp;
$parity += 1;
}
}
//on remplace dans le template les informations issues de la base
$tris_form = str_replace("!!sortname!!", $this->dSort->sortName, $show_tris_form);
$tris_form = str_replace("!!liste_tris!!", $tris, $tris_form);
return $tris_form;
}
/**
* affiche un selecteur des tris disponibles
*/
static function show_tris_selector() {
global $msg,$opac_default_sort_list;
$sortArray = explode(" ",$opac_default_sort_list);
//Mode Ajax
if ($sortArray[0] == 0) {
$tris_selector = "
";
} elseif ($sortArray[0] == 1) {
global $sort;
if ($sort != "") $sel_sort = $sort;
else $sel_sort = -1;
// creation du tableau de la liste des tris enregistrés
$tris_selector = "
";
} else {
$tris_selector = " ";
}
return $tris_selector;
}
/**
*
*/
function show_sel_form($id_tri=0) {
switch($this->dSort->typeData) {
case 'base':
return $this->show_sel_formAdmin($id_tri);
break;
case 'session':
return $this->show_sel_formOPAC($id_tri);
break;
}
}
/**
* Affiche l'écran de sélection des criteres de tri
*/
function show_sel_formAdmin($id_tri) {
global $show_sel_form;
global $charset;
global $msg;
//les champs de tris possible
$fields = $this->params["FIELD"];
//initialisation des variables
$liste_selectionnes = "";
$nom_du_tri = "";
//génération de la liste des criteres
$liste_criteres = "";
//si id_tri est renseigné, c'est alors une modification du tri sélectionné
if ($id_tri!=0) {
$result = $this->dSort->recupTriParId($id_tri);
//$requete = mysql_query("SELECT nom_tri, tri_par FROM tris WHERE id_tri='" . $id_tri . "'");
if ($result) {
//$result = mysql_fetch_array($requete);
$nom_du_tri = $result['nom_tri'];
//recherche et décomposition du tri
$tri_par = explode(",", $result['tri_par']);
for ($i = 0; $i < count($tri_par); $i++) {
//on decompose la description du critere de tri (c_num_2)
$tri_par1 = explode("_", $tri_par[$i]);
for ($j = 0; $j < count($fields); $j++) {
//on parcours tous les champs (pour récuperer le nom)
if ($fields[$j]["ID"] == $tri_par1[2]) {
//on est dans le bon champs
//on determine le type et le sens du tri pour l'affichage
switch ($tri_par1[1]) {
case 'num' :
if ($tri_par1[0] == "c")
$debut = "0-9 ";
else
$debut = "9-0 ";
break;
case 'text' :
if ($tri_par1[0] == "c")
$debut = "A-Z ";
else
$debut = "Z-A ";
break;
}
//la liste des champs sélectionnés
$liste_selectionnes .= "\n";
//ce champ est utilise donc on ne l'affichera pas
$fields[$j]["UTILISE"] = true;
}
}
}
//on créé la liste des criteres restants
for ($j = 0; $j < count($fields); $j++) {
// sans les champs déja utilisés
if ($fields[$j]["UTILISE"]!=true){
//si champ perso, on a déjà le libellé
if($fields[$j]['SOURCE'] == "cp") $name = $fields[$j]['LABEL'];
else $name = $msg[$fields[$j]['NAME']];
$liste_criteres .= "\n";
}
}
}
} else {
//on créé la liste des criteres
for ($j = 0; $j < count($fields); $j++) {
//si champ perso, on a déjà le libellé
if($fields[$j]['SOURCE'] == "cp") $name = $fields[$j]['LABEL'];
else $name = $msg[$fields[$j]['NAME']];
$liste_criteres .= "\n";
}
}
//on remplace toutes les variables dans le template
$sel_form = str_replace("!!id_tri!!", $id_tri, $show_sel_form);
$sel_form = str_replace("!!sortname!!", $this->dSort->sortName, $sel_form);
$sel_form = str_replace("!!nom_tri!!", $nom_du_tri, $sel_form);
$sel_form = str_replace("!!liste_criteres!!", $liste_criteres, $sel_form);
$sel_form = str_replace("!!liste_selectionnes!!", $liste_selectionnes, $sel_form);
return $sel_form;
}
function show_sel_formOPAC() {
global $show_sel_form;
global $liste_criteres_tri;
global $charset;
global $msg;
global $opac_nb_max_criteres_tri;
$fields = $this->params["FIELD"];
for ($i=0;$i".htmlentities($name,ENT_QUOTES,$charset)."\n";
}
$listes_tri = "";
for ($i=1;$i<$opac_nb_max_criteres_tri;$i++) {
$listes_tri .= str_replace("!!idLigne!!",$i,$liste_criteres_tri);
}
$sel_form = str_replace("!!liste_criteres_tri!!", $listes_tri, $show_sel_form);
$sel_form = str_replace("!!liste_criteres!!", $liste_criteres, $sel_form);
return $sel_form;
}
/**
* Enregistre les criteres de tri dans la table tris
*/
function sauvegarder($id_tri, $nom_tri, $tris_par) {
global $msg;
global $charset;
$criteres = implode(",",$tris_par);
return $this->dSort->enregistreTri($id_tri,$nom_tri,$criteres);
}
/**
* Supprime un tri sauvegarder
*/
function supprimer($sort_ids=array()) {
$this->dSort->supprimeTri($sort_ids);
}
/**
* Retourne le texte de description du tri à partir de sa description
*/
function descriptionTri($desTri) {
global $msg;
//récuperations des champs
$fields = $this->params["FIELD"];
$tris_par = explode(",",$desTri);
$trier_par_texte = "";
foreach ($tris_par as $selectValue) {
//découpage du champ (ex : c_num_2 (croissance ou décroissance (c ou d),
//type de champ (num,text,...) et id du champ)
$temp = explode("_", $selectValue);
//on genere le texte descriptif à afficher
for ($i = 0; $i < count($fields); $i++) {
if ($fields[$i]["ID"] == $temp[2]) {
if($fields[$i]['SOURCE'] == "cp"){
$trier_par_texte .= $fields[$i]['LABEL'] . " ";
}else{
$trier_par_texte .= $msg[$fields[$i]["NAME"]] . " ";
}
if ($temp[0] == "c") {
$trier_par_texte .= $msg["tri_texte_croissant"];
} else {
$trier_par_texte .= $msg["tri_texte_decroissant"];
}
$trier_par_texte .= ",";
}
}
}
//on enleve la derniere virgule et on ajoute la )
$trier_par_texte = substr($trier_par_texte, 0, strlen($trier_par_texte) - 1);
return $trier_par_texte;
}
/**
* Retourne le texte de description du tri a partir d'un id
*/
function descriptionTriParId($id_tri) {
global $msg;
if ($id_tri!="") {
//récupération de la description du tri
$result = $this->dSort->recupTriParId($id_tri);
$nom_tri = $result['nom_tri'];
$trier_par_texte = "(" . $this->descriptionTri($result['tri_par']) . ")";
//on concatene le message complet
$trier_par_texte = $nom_tri." ".$trier_par_texte;
return $trier_par_texte;
} else
return "";
}
/**
* Applique le tri sélectionner
* Renvoi la requete finale utilisant les criteres de tri
*/
function appliquer_tri($idTri, $selectTempo, $nomColonneIndex,$debLimit,$nbLimit) {
global $msg;
//récuperations des champs
$fields = $this->params["FIELD"];
$tableEnCours = $this->table_tri_tempo;
//creation de la table de tri
//$cmd_table = "DROP TABLE " . $tableEnCours;
//mysql_query ($cmd_table);
//$cmd_table = "CREATE TABLE " . $tableEnCours . " ENGINE=MyISAM (".$selectTempo.")";
$cmd_table = "CREATE TEMPORARY TABLE " . $tableEnCours . " ENGINE=MyISAM (".$selectTempo.")";
mysql_query ($cmd_table);
$cmd_table = "ALTER TABLE " . $tableEnCours . " PRIMARY KEY " . $nomColonneIndex;
mysql_query ($cmd_table);
//récupération de la description du tri
$result = $this->dSort->recupTriParId($idTri);
$trier_par = explode(",",$result['tri_par']);
//parcours des champs sur lesquels trier
for ($j = 0; $j < count($trier_par); $j++) {
//découpage du champ (ex : c_num_2 (croissance ou décroissance (c ou d),
//type de champ (num,text,...) et id du champ)
$temp = explode("_", $trier_par[$j]);
//on parcours tous les champs de tri possible
for ($i = 0; $i < count($fields); $i++) {
//afin de trouver ceux sur lesquels le tri s'applique
if ($fields[$i]["ID"] == $temp[2]) {
//on est sur un champ de tri
//suivant le type de champ
switch ($fields[$i]["TYPEFIELD"]) {
case "internal":
//c'est un champ de la requete de base
//on verifie que le champ est dans la table temporaire
$requete_fields = mysql_query("SELECT * FROM " . $tableEnCours . " LIMIT 1");
$x = 0;
while ($x < mysql_num_fields($requete_fields)) {
$ligne = mysql_fetch_field($requete_fields, $x);
if ($ligne->name == $fields[$i]["TABLEFIELD"][0][value]) {
//le champ est la donc on ajoute le champ au order
$orderby .= $this->ajoutOrder($fields[$i]["TABLEFIELD"][0][value],$temp[0]) . ",";
$x = mysql_num_fields($requete_fields);
}
$x++;
}
mysql_free_result($requete_fields);
break;
case "select":
//une requete union est nécéssaire
//le nom du champ on ajoute tb pour corriger le probleme des noms numeriques
$nomChamp = "tb".$fields[$i]["NAME"];
//on ajoute la colonne au orderby
$orderby .= $this->ajoutOrder($nomChamp,$temp[0]) . ",";
//on ajoute la colonne à la table temporaire
$this->ajoutColonneTableTempo($tableEnCours, $nomChamp, $temp[1]);
//on parcours la ou les tables pour generer les updates
for ($x = 0; $x < count($fields[$i]["TABLE"]); $x++) {
$requete = $this->genereRequeteUpdate($fields[$i]["TABLE"][$x], $tableEnCours, $nomChamp, $nomColonneIndex);
//echo("updateSort:".$requete." ");
mysql_query ($requete);
}
//on a aussi des champs persos maitenant...
if($fields[$i]['SOURCE'] == "cp"){
$requete = $this->generateRequeteCPUpdate($fields[$i], $tableEnCours, $nomChamp);
mysql_query ($requete);
}
break;
} //switch
} //if ($fields[$i]["ID"] == $temp[2]) {
} //for ($i = 0; $i < count($fields); $i++) {
} //for ($j = 0; $j < count($trier_par); $j++) {
if ($orderby!="") {
//on enleve la derniere virgule
$orderby = substr($orderby, 0, strlen($orderby) - 1);
//on va classer la table tempo suivant les criteres donnés
$requete = "ALTER TABLE " . $tableEnCours ." ORDER BY ". $orderby;
mysql_query ($requete);
}
//on retourne la requete sur la table de tri
if ($this->table_select!="") {
//c'est une requete avec des informations extérieures
$requete = "SELECT " . $nomColonneIndex . "," . $this->champs_select;
$requete .= " FROM " . $this->table_tri_tempo . "," . $this->table_select;
$requete .= " WHERE " . $this->table_select . "." . $this->table_primary_key_select;
$requete .= "=" . $this->table_tri_tempo . "." . $nomColonneIndex;
$requete .= " GROUP BY " . $nomColonneIndex;
if ($orderby!="") $requete .= " ORDER BY " . $orderby;
if ($nbLimit>0) $requete .= " LIMIT " . $debLimit . "," . $nbLimit;
} else {
if ($nbLimit>0) {
//requete de base sur la table triée avec limit
$requete = "SELECT * FROM " . $tableEnCours . " LIMIT " . $debLimit . "," . $nbLimit;
} else {
//requete de base sur la table triée
$requete = "SELECT " . $nomColonneIndex . " FROM " . $tableEnCours;
}
}
return $requete;
}
function appliquer_tri_from_tmp_table($idTri=0, $table, $nomColonneIndex,$start=0,$numbers=0){
//récuperations des champs
$fields = $this->params["FIELD"];
$this->table_tri_tempo = $table;
//récupération de la description du tri
$result = $this->dSort->recupTriParId($idTri);
$trier_par = explode(",",$result['tri_par']);
$do=false;
//parcours des champs sur lesquels trier
for ($j = 0; $j < count($trier_par); $j++) {
//découpage du champ (ex : c_num_2 (croissance ou décroissance (c ou d),
//type de champ (num,text,...) et id du champ)
$temp = explode("_", $trier_par[$j]);
//on parcours tous les champs de tri possible
for ($i = 0; $i < count($fields); $i++) {
//afin de trouver ceux sur lesquels le tri s'applique
if ($fields[$i]["ID"] == $temp[2]) {
//on est sur un champ de tri
//suivant le type de champ
switch ($fields[$i]["TYPEFIELD"]) {
case "internal":
//c'est un champ de la requete de base
$nomChamp = $fields[$i]["TABLEFIELD"][0][value];
//on verifie que le champ est dans la table temporaire
$requete_fields = mysql_query("SELECT * FROM " . $this->table_tri_tempo . " LIMIT 1");
$x = 0;
if ($requete_fields) {
while ($x < mysql_num_fields($requete_fields)) {
$ligne = mysql_fetch_field($requete_fields, $x);
if ($ligne->name == $nomChamp) {
//le champ est la donc on ajoute le champ au order
if($orderby!="") $orderby.=",";
$orderby .= $this->ajoutOrder($nomChamp,$temp[0]);
$x = mysql_num_fields($requete_fields);
}
$x++;
}
mysql_free_result($requete_fields);
}
break;
case "select":
//une requete union est nécéssaire
//le nom du champ on ajoute tb pour corriger le probleme des noms numeriques
$nomChamp = "tb".$fields[$i]["NAME"];
//on ajoute la colonne au orderby
if($orderby!="") $orderby.=",";
$orderby .= $this->ajoutOrder($nomChamp,$temp[0]);
//on ajoute la colonne à la table temporaire
$this->ajoutColonneTableTempo($this->table_tri_tempo, $nomChamp, $temp[1]);
//on parcours la ou les tables pour generer les updates
for ($x = 0; $x < count($fields[$i]["TABLE"]); $x++) {
$requete = $this->genereRequeteUpdate($fields[$i]["TABLE"][$x], $this->table_tri_tempo, $nomChamp, $nomColonneIndex);
mysql_query ($requete);
}
//on a aussi des champs persos maitenant...
if($fields[$i]['SOURCE'] == "cp"){
$requete = $this->generateRequeteCPUpdate($fields[$i], $this->table_tri_tempo, $nomChamp);
mysql_query ($requete);
}
break;
} //switch
if($numbers >0){
$this->delete_useless($nomChamp, $orderby,($start+$numbers));
}
} //if ($fields[$i]["ID"] == $temp[2]) {
} //for ($i = 0; $i < count($fields); $i++) {
} //for ($j = 0; $j < count($trier_par); $j++) {
//on retourne la requete sur la table de tri
if ($this->table_select!="") {
//c'est une requete avec des informations extérieures
$requete = "SELECT " . $nomColonneIndex . "," . $this->champs_select;
$requete .= " FROM " . $this->table_tri_tempo . "," . $this->table_select;
$requete .= " WHERE " . $this->table_select . "." . $this->table_primary_key_select;
$requete .= "=" . $this->table_tri_tempo . "." . $nomColonneIndex;
$requete .= " GROUP BY " . $nomColonneIndex;
} else {
//requete de base sur la table triée
$requete = "SELECT " . $nomColonneIndex . " FROM " . $this->table_tri_tempo;
}
if ($orderby!="") $requete .= " ORDER BY " . $orderby;
if($numbers>0){
$requete.=" limit $start,".$numbers;
}
return $requete;
}
function get_order_by($idTri){
$orderby="";
$fields = $this->params['FIELD'];
$result = $this->dSort->recupTriParId($idTri);
$trier_par = explode(",",$result['tri_par']);
for ($j = 0; $j < count($trier_par); $j++) {
$temp = explode("_", $trier_par[$j]);
//on parcours tous les champs de tri possible
for ($i = 0; $i < count($fields); $i++) {
if ($fields[$i]["ID"] == $temp[2]) {
switch ($fields[$i]["TYPEFIELD"]) {
case "internal":
$nomChamp = $fields[$i]["TABLEFIELD"][0][value];
if($orderby!="")$orderby .=",";
$orderby .= $this->ajoutOrder($nomChamp,$temp[0]);
break;
case "select":
$nomChamp = "tb".$fields[$i]["NAME"];
if($orderby!="")$orderby .=",";
$orderby .= $this->ajoutOrder($nomChamp,$temp[0]);
break;
} //switch
}
}
}
return $orderby;
}
function delete_useless($nomCol,$orderby,$need){
$query = "select ".$nomCol." as crit,count(*) as nb_elem from ".$this->table_tri_tempo." group by ".preg_replace("/ |desc|asc/i",'',$orderby)." order by $orderby";
$res = mysql_query($query);
$keep = array();
$nb_elem= 0;
if(mysql_num_rows($res)){
while($row = mysql_fetch_object($res)){
$nb_elem+=($row->nb_elem);
$keep[]=$row->crit;
if($nb_elem>$need){
$clean = "delete from ".$this->table_tri_tempo." where $nomCol not in ('".implode("','",$keep)."')";
mysql_query($clean);
break;
}
}
}
}
/**
* Ajoute une colonne à la table temporaire du nom et du type précisé
*/
function ajoutColonneTableTempo($nomTable, $nomCol,$type) {
//d'abord on ajoute la colonne
$cmd_table = "ALTER TABLE " . $nomTable . " ADD " . $nomCol . " ";
//en fonction du type on met le type mysql
switch($type) {
case "num":
$cmd_table .= "integer";
break;
case "text":
default:
$cmd_table .= "text";
break;
}
//execution de l'ajout de la colonne
mysql_query ($cmd_table);
// //ajout d'un index;
// $add_index = "alter table ".$nomTable." add index (".$nomCol.")";
// mysql_query($add_index);
}
/**
* Renvoi le nom du champ et l'ordre de tri SQL
*/
function ajoutOrder($nomChp,$typeorder) {
$tmpTxt = $nomChp;
//suivant le type de tri
switch ($typeorder) {
case "c":
$tmpTxt .= " ASC";
break;
case "d":
default:
$tmpTxt .= " DESC";
break;
}
return $tmpTxt;
}
/**
* Genere la requete select d'un element table
*/
function genereRequeteUpdate($desTable, $nomTable, $nomChp, $nomColonneTempo) {
$tables = $nomTable . "," .$this->params["REFERENCE"];
$groupby = "";
//
//SELECT de base pour la récupération des informations
//
$extractinfo_sql = "SELECT ".$this->params["REFERENCE"].'.'.$this->params["REFERENCEKEY"].", ".$this->ajoutIfNull($desTable["TABLEFIELD"][0])." AS ".$nomChp." FROM ".$nomTable.' LEFT JOIN '.$this->params["REFERENCE"].' ON ('.$this->params["REFERENCE"].'.'.$this->params["REFERENCEKEY"].' = '.$nomTable.'.'.$this->params["REFERENCEKEY"].')';
//
//On ajout les éventuelles liaisons
//
for ($x = 0; $x <= count($desTable["LINK"]); $x++) {
if($desTable["LINK"][$x]["TABLE"][0]['ALIAS']){
$alias = $desTable["LINK"][$x]["TABLE"][0]['ALIAS'];
}else{
$alias =$desTable["LINK"][$x]["TABLE"][0]['value'];
}
switch ($desTable["LINK"][$x]["TYPE"]) {
case "n1" :
if ($desTable["LINK"][$x]["TABLEKEY"][0]['value']) {
$extractinfo_sql .= " LEFT JOIN " . $desTable["LINK"][$x]["TABLE"][0]['value'].($desTable["LINK"][$x]["TABLE"][0]['value'] != $alias ? " AS ".$alias : "");
$extractinfo_sql .= " ON " . $desTable["NAME"] . "." . $desTable["LINK"][$x]["EXTERNALFIELD"][0]['value'];
$extractinfo_sql .= "=" . $alias . "." . $desTable["LINK"][$x]["TABLEKEY"][0]['value'];
} else {
$extractinfo_sql .= " LEFT JOIN " . $desTable["NAME"];
$extractinfo_sql .= " ON " . $this->params["REFERENCE"] . "." . $this->params["REFERENCEKEY"];
$extractinfo_sql .= "=" . $desTable["NAME"] . "." . $desTable["LINK"][$x]["EXTERNALFIELD"][0]['value'];
}
break;
case "1n" :
$extractinfo_sql .= " LEFT JOIN " . $desTable["NAME"];
$extractinfo_sql .= " ON (" . $desTable["NAME"] . "." . $desTable["TABLEKEY"][0]['value'];
$extractinfo_sql .= "=" . $this->params["REFERENCE"] . "." . $desTable["LINK"][$x]["REFERENCEFIELD"][0]['value'] . ") ";
break;
case "nn" :
$extractinfo_sql .= " LEFT JOIN " . $desTable["LINK"][$x]["TABLE"][0]['value'].($desTable["LINK"][$x]["TABLE"][0]['value'] != $alias ? " AS ".$alias : "");
$extractinfo_sql .= " ON (" . $nomTable . "." . $this->params["REFERENCEKEY"];
$extractinfo_sql .= "=" . $alias . "." . $desTable["LINK"][$x]["REFERENCEFIELD"][0]['value'] . ") ";
if ($desTable["LINK"][$x]["TABLEKEY"][0]['value']) {
$extractinfo_sql .= " LEFT JOIN " . $desTable["NAME"];
$extractinfo_sql .= " ON (" . $alias . "." . $desTable["LINK"][$x]["TABLEKEY"][0]['value'];
$extractinfo_sql .= "=" . $desTable["NAME"] . "." . $desTable["LINK"][$x]["EXTERNALFIELD"][0]['value'] ." ".$desTable["LINK"][$x]["LINKRESTRICT"][0]['value']. ") ";
} else {
$extractinfo_sql .= " LEFT JOIN " . $desTable["NAME"];
$extractinfo_sql .= " ON (" . $alias . "." . $desTable["LINK"][$x]["EXTERNALFIELD"][0]['value'];
$extractinfo_sql .= "=" . $desTable["NAME"] . "." . $desTable["TABLEKEY"][0]['value'] . " ".$desTable["LINK"][$x]["LINKRESTRICT"][0]['value'].") ";
}
break;
}
}
//si on a un filtre supplementaire
if (isset($desTable["FILTER"])) {
$extractinfo_sql .= " WHERE " . $desTable["FILTER"][0][value];
}
//On applique la restriction ORDER BY
//Utilisé pour les types de langues ou d'auteurs, ...
if (isset($desTable["ORDERBY"])) {
$extractinfo_sql .= " ORDER BY ".$this->ajoutIfNull($desTable["ORDERBY"][0]);
}
//Si l'on a un group by on passe par une sous-requete pour que le groupement soit fait après le tri (Cas des Auteurs : C'est l'auteur principal qui doit être utilisé pour le tri)
if (isset($desTable["GROUPBY"])) {
$extractinfo_sql = "SELECT * FROM (".$extractinfo_sql.") AS asubquery";
$extractinfo_sql .= " GROUP BY ".$desTable["GROUPBY"][0]["value"];
}
//
//On met le tout dans une table temporaire
//
$sql = "DROP TEMPORARY TABLE IF EXISTS ".$nomTable."_update";
mysql_query($sql);
$temporary2_sql = "CREATE TEMPORARY TABLE ".$nomTable."_update ENGINE=MyISAM (".$extractinfo_sql.")";
mysql_query($temporary2_sql);
mysql_query("alter table ".$nomTable."_update add index(notice_id)");
//
//Et on rempli la table tri_tempo avec les éléments de la table temporaire
//
$requete = "UPDATE " . $this->params["REFERENCE"].", ".$nomTable.", ".$nomTable."_update";
$requete .= " SET " . $nomTable.".".$nomChp . " = " . $nomTable."_update.".$nomChp;
//le lien vers la table de tri temporaire
$requete .= " WHERE " . $nomTable.".".$this->params["REFERENCEKEY"];
$requete .= "=" . $nomTable."_update.".$this->params["REFERENCEKEY"];
$requete .= " AND ".$this->params["REFERENCE"].".".$this->params["REFERENCEKEY"]."=".$nomTable.".".$this->params["REFERENCEKEY"];
$requete .= " AND ".$nomTable."_update.".$nomChp." IS NOT NULL";
$requete .= " AND ".$nomTable."_update.".$nomChp." != ''";
return $requete;
}
/**
* Ajoute le ifnull si précisé
*/
function ajoutIfNull($tableau) {
if (isset($tableau["NULLVALUE"])) {
$tmpTxt = "IFNULL(" . $tableau[value] . ",'" . $tableau["NULLVALUE"] . "')";
} else {
$tmpTxt = $tableau[value];
}
return $tmpTxt;
}
/**
* Parse les fichiers XML de parametres
* il y a un fichier par type de tris
*/
function parse() {
global $include_path;
global $$params_name;
global $charset;
global $dbh;
$params_name = $this->dSort->sortName . "_params";
$params = $$params_name;
if ($params) {
$this->params = $params;
} else {
$nomfichier = $include_path . "/sort/" . $this->dSort->sortName . "/sort.xml";
if (file_exists($include_path . "/sort/" . $this->dSort->sortName . "/sort_subst.xml")) {
$nomfichier=$include_path . "/sort/" . $this->dSort->sortName . "/sort_subst.xml";
$fp = fopen($nomfichier, "r");
} else if (file_exists($nomfichier)) {
$fp = fopen($nomfichier, "r");
}
if ($fp) {
//un fichier est ouvert donc on le lit
$xml = fread($fp, filesize($nomfichier));
//on le ferme
fclose($fp);
//on le parse pour le transformer en tableau
$params = _parser_text_no_function_($xml, "SORT");
//on le stocke dans la classe
$this->params = $params;
} else {
$this->error = true;
$this->error_message = "Can't open definition file";
}
}
//tri perso
$p_perso = new parametres_perso("notices");
foreach($p_perso->t_fields as $key => $t_field){
if($t_field['OPAC_SHOW'] && $t_field['OPAC_SORT']){
$param=_parser_text_no_function_("\n".$t_field['OPTIONS'], "OPTIONS");
switch($t_field['TYPE']){
case "comment" :
case "text":
if($param['REPETABLE'][0]['value']){
$tablefield = "group_concat(".$p_perso->prefix."_custom_".$t_field['DATATYPE']." separator ' ')";
$groupby = "group by notice_id";
}else{
$tablefield = $p_perso->prefix."_custom_".$t_field['DATATYPE'];
$groupby = "";
}
$p_tri = array(
'SOURCE' => "cp",
'TYPEFIELD' => "select",
'ID' => "cp".$key,
'TYPE' => "text",
'NAME' => $t_field['NAME'],
'LABEL' => $t_field['TITRE'],
'TABLEFIELD' => array('value'=>$tablefield),
'REQ_SUITE' => "left join ".$p_perso->prefix."_custom_values on notices.notice_id = ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_origine where ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_champ = '".$key."' ".$groupby
);
break;
case "list":
if($param['MULTIPLE'][0]['value']){
$tablefield = "group_concat(".$p_perso->prefix."_custom_list_lib separator ' ')";
$groupby = "group by notice_id";
}else{
$tablefield = $p_perso->prefix."_custom_list_lib";
$groupby = "";
}
$p_tri = array(
'SOURCE' => "cp",
'TYPEFIELD' => "select",
'ID' => "cp".$key,
'TYPE' => "text",
'NAME' => $t_field['NAME'],
'LABEL' => $t_field['TITRE'],
'TABLEFIELD' => array('value'=>$tablefield),
'REQ_SUITE' => "left join ".$p_perso->prefix."_custom_values on notices.notice_id = ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_origine
left join ".$p_perso->prefix."_custom_lists on ".$p_perso->prefix."_custom_".$t_field['DATATYPE']." = ".$p_perso->prefix."_custom_list_value
where ".$p_perso->prefix."_custom_lists.".$p_perso->prefix."_custom_champ ='".$key."' and ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_champ ='".$key."' ".$groupby
);
break;
case "date_box" :
$p_tri = array(
'SOURCE' => "cp",
'TYPEFIELD' => "select",
'ID' => "cp".$key,
'TYPE' => "text",
'NAME' => $t_field['NAME'],
'LABEL' => $t_field['TITRE'],
'TABLEFIELD' => array('value'=>$p_perso->prefix."_custom_".$t_field['DATATYPE']),
'REQ_SUITE' => "left join ".$p_perso->prefix."_custom_values on notices.notice_id = ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_origine where ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_champ = '".$key."'"
);
break;
case "query_list" :
$tableid = "";
$tablefield = "";
$tablename = "";
if($param['MULTIPLE'][0]['value']){
if($param['QUERY'][0]['value']){
$res = mysql_query($param['QUERY'][0]['value'],$dbh);
if ($res) {
$tableid = mysql_field_name($res,0);
$tablefield = "group_concat(".mysql_field_name($res,1)." separator ' ')";
$tablename = mysql_field_table($res,0);
}
}
$groupby = "group by notice_id";
} else {
if($param['QUERY'][0]['value']){
$res = mysql_query($param['QUERY'][0]['value'],$dbh);
if ($res) {
$tableid = mysql_field_name($res,0);
$tablefield = mysql_field_name($res,1);
$tablename = mysql_field_table($res,0);
}
}
$groupby = "";
}
$p_tri = array(
'SOURCE' => "cp",
'TYPEFIELD' => "select",
'ID' => "cp".$key,
'TYPE' => "text",
'NAME' => $t_field['NAME'],
'LABEL' => $t_field['TITRE'],
'TABLEFIELD' => array('value'=>$tablefield),
'REQ_SUITE' => "left join ".$p_perso->prefix."_custom_values on notices.notice_id = ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_origine
left join ".$tablename." on ".$p_perso->prefix."_custom_".$t_field['DATATYPE']." = ".$tableid."
where ".$p_perso->prefix."_custom_values.".$p_perso->prefix."_custom_champ ='".$key."' ".$groupby
);
break;
default :
$p_tri =array();
break;
}
if($p_tri)$this->params['FIELD'][]=$p_tri;
}
}
}
function generateRequeteCPUpdate($field, $nomTable, $nomChp){
$requete = "
SELECT
".$this->params['REFERENCE'].'.'.$this->params['REFERENCEKEY'].",
".$this->ajoutIfNull($field['TABLEFIELD'])." AS ".$nomChp."
FROM ".$nomTable." LEFT JOIN ".$this->params['REFERENCE']." ON (".$this->params['REFERENCE'].".".$this->params['REFERENCEKEY']." = ".$nomTable.".".$this->params['REFERENCEKEY'].")
".$field['REQ_SUITE'];
//On met le tout dans une table temporaire
$sql = "DROP TEMPORARY TABLE IF EXISTS ".$nomTable."_update";
mysql_query($sql);
$temporary2_sql = "CREATE TEMPORARY TABLE ".$nomTable."_update ENGINE=MyISAM (".$requete.")";
mysql_query($temporary2_sql);
mysql_query("alter table ".$nomTable."_update add index(notice_id)");
//
//Et on rempli la table tri_tempo avec les éléments de la table temporaire
//
$requete = "UPDATE ".$nomTable.", ".$nomTable."_update";
$requete .= " SET " . $nomTable.".".$nomChp . " = " . $nomTable."_update.".$nomChp;
//le lien vers la table de tri temporaire
$requete .= " WHERE " . $nomTable.".".$this->params["REFERENCEKEY"];
$requete .= "=" . $nomTable."_update.".$this->params["REFERENCEKEY"];
$requete .= " AND ".$nomTable."_update.".$nomChp." IS NOT NULL";
$requete .= " AND ".$nomTable."_update.".$nomChp." != ''";
return $requete;
}
}
?>