X-Git-Url: http://git.cyclocoop.org/?p=velocampus%2Fweb%2Fwww.git;a=blobdiff_plain;f=www%2Fplugins%2Fauto%2Fspip-bonux%2Fspip_bonux_fonctions.php;fp=www%2Fplugins%2Fauto%2Fspip-bonux%2Fspip_bonux_fonctions.php;h=c2f9d3a60f00e6f8321fc4621950976ad3afed37;hp=0000000000000000000000000000000000000000;hb=80b4d3e85f78d402ed2e73f8f5d1bf4c19962eed;hpb=aaf970bf4cdaf76689ecc10609048e18d073820c diff --git a/www/plugins/auto/spip-bonux/spip_bonux_fonctions.php b/www/plugins/auto/spip-bonux/spip_bonux_fonctions.php new file mode 100644 index 0000000..c2f9d3a --- /dev/null +++ b/www/plugins/auto/spip-bonux/spip_bonux_fonctions.php @@ -0,0 +1,295 @@ +$type,'id'=>"$type|$id",'titre'=>$titre)); +} + +/** + * Donner n'importe quelle information sur un objet de maniere generique. + * + * La fonction va gerer en interne deux cas particuliers les plus utilises : + * l'URL et le titre (qui n'est pas forcemment la champ SQL "titre"). + * + * On peut ensuite personnaliser les autres infos en creant une fonction + * generer__entite($id_objet, $type_objet, $ligne). + * $ligne correspond a la ligne SQL de tous les champs de l'objet, les fonctions + * de personnalisation n'ont donc pas a refaire de requete. + * + * @param int $id_objet + * @param string $type_objet + * @param string $info + * @return string + */ +function generer_info_entite($id_objet, $type_objet, $info, $etoile=''){ + // On verifie qu'on a tout ce qu'il faut + $id_objet = intval($id_objet); + if (!($id_objet and $type_objet and $info)) + return ''; + + // Si on demande l'url, on retourne direct la fonction + if ($info == 'url') + return generer_url_entite($id_objet, $type_objet); + + // Si on demande le titre, on le gere en interne + if ($demande_titre = ($info == 'titre')){ + global $table_titre; + $champ_titre = $table_titre[table_objet($type_objet)]; + if (!$champ_titre) $champ_titre = 'titre'; + $champ_titre = ", $champ_titre"; + } + + // Sinon on va tout chercher dans la table et on garde en memoire + static $objets; + + // On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore + if (!$objets[$type_objet][$id_objet] or ($demande_titre and !$objets[$type_objet][$id_objet]['titre'])){ + include_spip('base/abstract_sql'); + include_spip('base/connect_sql'); + $objets[$type_objet][$id_objet] = sql_fetsel( + '*'.$champ_titre, + table_objet_sql($type_objet), + id_table_objet($type_objet).' = '.intval($id_objet) + ); + } + $ligne = $objets[$type_objet][$id_objet]; + + if ($demande_titre) + $info_generee = $objets[$type_objet][$id_objet]['titre']; + // Si la fonction generer_TRUC_entite existe, on l'utilise + else if ($generer = charger_fonction("generer_${info}_entite", '', true)) + $info_generee = $generer($id_objet, $type_objet, $ligne); + // Sinon on prend le champ SQL + else + $info_generee = $ligne[$info]; + + // On va ensuite chercher les traitements automatiques a faire + global $table_des_traitements; + $maj = strtoupper($info); + $traitement = $table_des_traitements[$maj]; + $table_objet = table_objet($type_objet); + + if (!$etoile and is_array($traitement)){ + $traitement = $traitement[isset($traitement[$table_objet]) ? $table_objet : 0]; + $traitement = str_replace('%s', '"'.str_replace('"', '\\"', $info_generee).'"', $traitement); + eval("\$info_generee = $traitement;"); + } + + return $info_generee; +} + +/** + * Proteger les champs passes dans l'url et utiliser dans {tri ...} + * preserver l'espace pour interpreter ensuite num xxx et multi xxx + * @param string $t + * @return string + */ +function tri_protege_champ($t){ + return preg_replace(',[^\s\w.+],','',$t); +} + +/** + * Interpreter les multi xxx et num xxx utilise comme tri + * pour la clause order + * 'multi xxx' devient simplement 'multi' qui est calcule dans le select + * 'hasard' est calculé dans le select + * @param string $t + * @return string + */ +function tri_champ_order($t,$table=NULL,$field=NULL){ + if (strncmp($t,'num ',4)==0){ + $t = substr($t,4); + $t = preg_replace(',\s,','',$t); + // Lever une ambiguit� possible si le champs fait partie de la table (pour compatibilit� de la balise tri avec compteur, somme, etc.) + if (!is_null($table) && !is_null($field) && in_array($t,unserialize($field))) + $t = "0+$table.$t"; + else + $t = "0+$t"; + return $t; + } + elseif(strncmp($t,'multi ',6)==0){ + return "multi"; + } + else { + $t = preg_replace(',\s,','',$t); + // Lever une ambiguit� possible si le champs fait partie de la table (pour compatibilit� de la balise tri avec compteur, somme, etc.) + if (!is_null($table) && !is_null($field) && in_array($t,unserialize($field))) + return $table.'.'.$t; + else + return $t; + } +} + +/** + * Interpreter les multi xxx et num xxx utilise comme tri + * pour la clause select + * 'multi xxx' devient select "...." as multi + * les autres cas ne produisent qu'une chaine vide '' en select + * 'hasard' devient 'rand() AS hasard' dans le select + * + * @param string $t + * @return string + */ +function tri_champ_select($t){ + if(strncmp($t,'multi ',6)==0){ + $t = substr($t,6); + $t = preg_replace(',\s,','',$t); + $t = sql_multi($t,$GLOBALS['spip_lang']); + return $t; + } + if(trim($t)=='hasard'){ + return 'rand() AS hasard'; + } + return "''"; +} + +/** + * Rediriger une page suivant une autorisation, + * et ce, n'importe o� dans un squelette, m�me dans les inclusions. + * + * @param bool $ok Indique si l'on doit rediriger ou pas + * @param string $url Adresse vers laquelle rediriger + * @param int $statut Statut HTML avec lequel on redirigera + * @return string + */ +function filtre_sinon_interdire_acces_dist($ok=false, $url='', $statut=0){ + if ($ok) return ''; + + // vider tous les tampons + while (ob_get_level()) + ob_end_clean(); + + include_spip('inc/headers'); + $statut = intval($statut); + + // Si aucun argument on essaye de deviner quoi faire + if (!$url and !$statut){ + // Si on est dans l'espace priv�, on g�n�re du 403 Forbidden + if (test_espace_prive()){ + http_status(403); + $echec = charger_fonction('403','exec'); + $echec(); + } + // Sinon on redirige vers une 404 + else{ + $statut = 404; + } + } + + // Sinon on suit les directives indiqu�es dans les deux arguments + + // S'il y a un statut + if ($statut){ + // Dans tous les cas on modifie l'ent�te avec ce qui est demand� + http_status($statut); + // Si le statut est une erreur 4xx on va chercher le squelette + if ($statut >= 400) + echo recuperer_fond("$statut"); + } + + // S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302) + if ($url) redirige_par_entete($url, '', $statut); + + exit; +} + +?>