$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; } ?>