@ -2,16 +2,18 @@
/**
* Plugin Spip-Bonux
* Le plugin qui lave plus SPIP que SPIP
* (c) 2008 Mathieu Marcillaud, Cedric Morin, Romy Tetue
* (c) 2008 Mathieu Marcillaud, Cedric Morin, Tetue
* Licence GPL
*
*/
if (!defined("_ECRIRE_INC_VERSION")) return;
include_spip('inc/core21_filtres');
/**
* une fonction pour gene rer des menus avec liens
* ou un span lorsque l'item est selectionne
* une fonction pour géné rer des menus avec liens
* ou un span lorsque l'item est sélectionné
*
* @param string $url
* @param string $libelle
@ -26,7 +28,7 @@ function aoustrong($url,$libelle,$on=false,$class="",$title="",$rel=""){
/**
* une fonction pour generer une balise img a partir d'un nom de fichier
* une fonction pour générer une balise img à partir d'un nom de fichier
*
* @param string $img
* @param string $alt
@ -49,7 +51,7 @@ function affiche_un_ou_plusieurs($nb,$chaine_un,$chaine_plusieurs,$var='nb'){
}
/**
* Ajouter un timestamp a une url de fichier
* Ajouter un timestamp à une url de fichier
*
* @param unknown_type $fichier
* @return unknown
@ -61,15 +63,15 @@ function timestamp($fichier){
}
/**
* Transformer un tableau d'entre es array("rubrique|9","article|8",...)
* en un tableau contenant uniquement les identifiants d'un type donne .
* Accepte aussi que les valeurs d'entrees soient une chai ne brute
* Transformer un tableau d'entré es array("rubrique|9","article|8",...)
* en un tableau contenant uniquement les identifiants d'un type donné .
* Accepte aussi que les valeurs d'entrées soient une chaî ne brute
* "rubrique|9,article|8,..."
*
* @param array/string $selected liste des entrees : tableau ou chaine separe e par des virgules
* @param string $type type de valeur a re cuperer ('rubrique', 'article')
* @param array/string $selected liste des entrées : tableau ou chaîne séparé e par des virgules
* @param string $type type de valeur à ré cuperer ('rubrique', 'article')
*
* @return array liste des identifiants trouve s.
* @return array liste des identifiants trouvé s.
**/
function picker_selected($selected, $type){
$select = array();
@ -103,23 +105,23 @@ function picker_identifie_id_rapide($ref,$rubriques=0,$articles=0){
}
/**
* Donner n'importe quelle information sur un objet de maniere gene rique.
* Donner n'importe quelle information sur un objet de manière géné rique.
*
* La fonction va gerer en interne deux cas particuliers les plus utilise s :
* La fonction va gérer en interne deux cas particuliers les plus utilisé s :
* l'URL et le titre (qui n'est pas forcemment la champ SQL "titre").
*
* On peut ensuite personnaliser les autres infos en cre ant une fonction
* On peut ensuite personnaliser les autres infos en cré ant une fonction
* generer_< nom_info > _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 reque te.
* $ligne correspond à la ligne SQL de tous les champs de l'objet, les fonctions
* de personnalisation n'ont donc pas à refaire de requê te.
*
* @param int $id_objet
* @param string $type_objet
* @param string $info
* @return string
*/
function generer_info_entite($id_objet, $type_objet, $info){
// On ve rifie qu'on a tout ce qu'il faut
function generer_info_entite($id_objet, $type_objet, $info, $etoile='' ){
// On vé rifie qu'on a tout ce qu'il faut
$id_objet = intval($id_objet);
if (!($id_objet and $type_objet and $info))
return '';
@ -128,7 +130,7 @@ function generer_info_entite($id_objet, $type_objet, $info){
if ($info == 'url')
return generer_url_entite($id_objet, $type_objet);
// Si on demande le titre, on le ge re en interne
// Si on demande le titre, on le gè re en interne
if ($demande_titre = ($info == 'titre')){
global $table_titre;
$champ_titre = $table_titre[table_objet($type_objet)];
@ -136,10 +138,10 @@ function generer_info_entite($id_objet, $type_objet, $info){
$champ_titre = ", $champ_titre";
}
// Sinon on va tout chercher dans la table et on garde en me moire
// Sinon on va tout chercher dans la table et on garde en mé moire
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
// On ne fait la requête que si on n'a pas déjà 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');
@ -160,13 +162,13 @@ function generer_info_entite($id_objet, $type_objet, $info){
else
$info_generee = $ligne[$info];
// On va ensuite chercher les traitements automatiques a faire
// On va ensuite chercher les traitements automatiques à faire
global $table_des_traitements;
$maj = strtoupper($info);
$traitement = $table_des_traitements[$maj];
$table_objet = table_objet($type_objet);
if (is_array($traitement)){
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;");
@ -176,8 +178,8 @@ function generer_info_entite($id_objet, $type_objet, $info){
}
/**
* Proteger les champs passes dans l'url et utiliser dans {tri ...}
* preserver l'espace pour interpre ter ensuite num xxx et multi xxx
* Protéger les champs passés dans l'url et utilisés dans {tri ...}
* préserver l'espace pour interpré ter ensuite num xxx et multi xxx
* @param string $t
* @return string
*/
@ -186,9 +188,10 @@ function tri_protege_champ($t){
}
/**
* Interpreter les multi xxx et num xxx utilise comme tri
* Interpréter les multi xxx et num xxx utilisés comme tri
* pour la clause order
* 'multi xxx' devient simplement 'multi' qui est calcule dans le select
* 'multi xxx' devient simplement 'multi' qui est calculé dans le select
* 'hasard' est calculé dans le select
* @param string $t
* @return string
*/
@ -196,7 +199,7 @@ 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.)
// Lever une ambiguïté possible si le champ 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
@ -208,7 +211,7 @@ function tri_champ_order($t,$table=NULL,$field=NULL){
}
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.)
// Lever une ambiguïté possible si le champ 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
@ -217,10 +220,11 @@ function tri_champ_order($t,$table=NULL,$field=NULL){
}
/**
* Interpreter les multi xxx et num xxx utilise comme tri
* Interpréter les multi xxx et num xxx utilisés comme tri
* pour la clause select
* 'multi xxx' devient select "...." as multi
* les autres cas ne produisent qu'une chaine vide '' en select
* les autres cas ne produisent qu'une chaîne vide '' en select
* 'hasard' devient 'rand() AS hasard' dans le select
*
* @param string $t
* @return string
@ -232,7 +236,96 @@ function tri_champ_select($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'entité 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;
}
/**
* Calculer et retourner la profondeur de la rubrique
* (dans spip3, c'est un champ de la table rubrique)
* les rubriques à la racine sont à une profondeur de 1
*
* @param string
* @return int
*/
function filtre_profondeur_dist($id_rubrique) {
$id_rubrique = intval($id_rubrique);
// sauver les calculs déjà faits
static $profs = array();
if (isset($profs[$id_rubrique])) {
return $profs[$id_rubrique];
}
// récupérer le parent.
$id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.$id_rubrique);
// pas de parent : id_rubrique n'existe pas
if (is_null($id_parent)) {
return '';
}
// parent zéro : on est tout en haut (racine)
if ($id_parent == '0') {
return $profs[$id_rubrique] = 1;
}
// sinon, on trouve la profondeur du parent
$parent = filtre_profondeur_dist($id_parent);
$profs[$id_rubrique] = ($parent + 1);
return $profs[$id_rubrique];
}
?>