Newer
Older
*
* - `0` si un job est à traiter
* - `null` si la queue n'est pas encore initialisée
gilles.vincent
a validé
function queue_sleep_time_to_next_job($force = null) {
static $queue_next_job_time = -1;
cerdic
a validé
if ($force === true) {
$queue_next_job_time = -1;
cerdic
a validé
} elseif ($force) {
$queue_next_job_time = $force;
cerdic
a validé
}
cerdic
a validé
if ($queue_next_job_time == -1) {
if (!defined('_JQ_NEXT_JOB_TIME_FILENAME')) {
define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP . "job_queue_next.txt");
}
// utiliser un cache memoire si dispo
marcimat
a validé
if (function_exists("cache_get") and defined('_MEMOIZE_MEMORY') and _MEMOIZE_MEMORY) {
$queue_next_job_time = cache_get(_JQ_NEXT_JOB_TIME_FILENAME);
cerdic
a validé
} else {
$queue_next_job_time = null;
cerdic
a validé
if (lire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, $contenu)) {
$queue_next_job_time = intval($contenu);
cerdic
a validé
}
}
}
cerdic
a validé
if (is_null($queue_next_job_time)) {
return null;
cerdic
a validé
}
if (!$_SERVER['REQUEST_TIME']) {
$_SERVER['REQUEST_TIME'] = time();
cerdic
a validé
}
return $queue_next_job_time - $_SERVER['REQUEST_TIME'];
/**
* Transformation XML des `&` en `&`
*
* @pipeline post_typo
* @param string $u
* @return string
*/
function quote_amp($u) {
return preg_replace(
cerdic
a validé
"&", $u);
/**
* Produit une balise `<script>` valide
*
* @example
* ```
* echo http_script('alert("ok");');
* echo http_script('','js/jquery.js');
* ```
*
* @param string $script
* Code source du script
* @param string $src
* Permet de faire appel à un fichier javascript distant
* @param string $noscript
* Contenu de la balise `<noscript>`
* @return string
* Balise HTML `<script>` et son contenu
cerdic
a validé
**/
gilles.vincent
a validé
function http_script($script, $src = '', $noscript = '') {
cerdic
a validé
if ($src && !isset($done[$src])) {
$src = find_in_path($src, _JAVASCRIPT);
$src = " src='$src'";
cerdic
a validé
} else {
$src = '';
cerdic
a validé
if ($script) {
cerdic
a validé
preg_replace(',</([^>]*)>,', '<\/\1>', $script) .
"/*]]>*/");
}
if ($noscript) {
$noscript = "<noscript>\n\t$noscript\n</noscript>\n";
cerdic
a validé
}
marcimat
a validé
return ($src or $script or $noscript)
cerdic
a validé
? "<script type='text/javascript'$src>$script</script>$noscript"
: '';
}
/**
* Sécurise du texte à écrire dans du PHP ou du Javascript.
cerdic
a validé
*
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
* Transforme n'importe quel texte en une chaîne utilisable
* en PHP ou Javascript en toute sécurité, à l'intérieur d'apostrophes
* simples (`'` uniquement ; pas `"`)
*
* Utile particulièrement en filtre dans un squelettes
* pour écrire un contenu dans une variable JS ou PHP.
*
* Échappe les apostrophes (') du contenu transmis.
*
* @link http://www.spip.net/4281
* @example
* PHP dans un squelette
* ```
* $x = '[(#TEXTE|texte_script)]';
* ```
*
* JS dans un squelette (transmettre une chaîne de langue)
* ```
* $x = '<:afficher_calendrier|texte_script:>';
* ```
*
* @filtre
* @param string $texte
* Texte à échapper
* @return string
* Texte échappé
cerdic
a validé
**/
function texte_script($texte) {
return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte));
}
/**
* Gestion des chemins (ou path) de recherche de fichiers par SPIP
*
* Empile de nouveaux chemins (à la suite de ceux déjà présents, mais avant
* le répertoire `squelettes` ou les dossiers squelettes), si un répertoire
* (ou liste de répertoires séparés par `:`) lui est passé en paramètre.
*
* Ainsi, si l'argument est de la forme `dir1:dir2:dir3`, ces 3 chemins sont placés
* en tête du path, dans cet ordre (hormis `squelettes` & la globale
* `$dossier_squelette` si définie qui resteront devant)
*
* Retourne dans tous les cas la liste des chemins.
*
* @note
* Cette fonction est appelée à plusieurs endroits et crée une liste
* de chemins finale à peu près de la sorte :
*
* - dossiers squelettes (si globale précisée)
* - squelettes/
* - plugins (en fonction de leurs dépendances) : ceux qui dépendent
* d'un plugin sont devant eux (ils peuvent surcharger leurs fichiers)
* - racine du site
* - squelettes-dist/
* - prive/
* - ecrire/
*
* @param string $dir_path
* - Répertoire(s) à empiler au path
* - '' provoque un recalcul des chemins.
* @return array
* Liste des chemins, par ordre de priorité.
cerdic
a validé
**/
function _chemin($dir_path = null) {
static $path_base = null;
static $path_full = null;
if ($path_base == null) {
$path = defined('_SPIP_PATH') ? _SPIP_PATH :
cerdic
a validé
_DIR_RACINE . ':' .
_DIR_RACINE . 'squelettes-dist/:' .
_DIR_RACINE . 'prive/:' .
_DIR_RESTREINT;
cerdic
a validé
if (@is_dir(_DIR_RACINE . 'squelettes')) {
$path = _DIR_RACINE . 'squelettes/:' . $path;
}
marcimat
a validé
if (strlen($dir) and substr($dir, -1) != '/') {
cerdic
a validé
}
$path_base[] = $dir;
}
$path_full = $path_base;
// Et le(s) dossier(s) des squelettes nommes
cerdic
a validé
if (strlen($GLOBALS['dossier_squelettes'])) {
foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/');
cerdic
a validé
}
}
$GLOBALS['path_sig'] = md5(serialize($path_full));
cerdic
a validé
if ($dir_path === null) {
return $path_full;
}
cerdic
a validé
if (strlen($dir_path)) {
cerdic
a validé
$tete = "";
cerdic
a validé
if (reset($path_base) == _DIR_RACINE . 'squelettes/') {
cerdic
a validé
$tete = array_shift($path_base);
cerdic
a validé
}
$dirs = array_reverse(explode(':', $dir_path));
foreach ($dirs as $dir_path) {
#if ($dir_path{0}!='/')
# $dir_path = $dir_path;
if (substr($dir_path, -1) != '/') {
$dir_path .= "/";
}
if (!in_array($dir_path, $path_base)) {
array_unshift($path_base, $dir_path);
}
}
if (strlen($tete)) {
array_unshift($path_base, $tete);
}
$path_full = $path_base;
// Et le(s) dossier(s) des squelettes nommes
cerdic
a validé
if (strlen($GLOBALS['dossier_squelettes'])) {
foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) {
array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE) . $d . '/');
cerdic
a validé
}
}
$GLOBALS['path_sig'] = md5(serialize($path_full));
cerdic
a validé
return $path_full;
}
/**
* Retourne la liste des chemins connus de SPIP, dans l'ordre de priorité
*
* Recalcule la liste si le nom ou liste de dossier squelettes a changé.
*
* @uses _chemin()
*
* @return array Liste de chemins
cerdic
a validé
**/
function creer_chemin() {
$path_a = _chemin();
static $c = '';
// on calcule le chemin si le dossier skel a change
if ($c != $GLOBALS['dossier_squelettes']) {
// assurer le non plantage lors de la montee de version :
$c = $GLOBALS['dossier_squelettes'];
$path_a = _chemin(''); // forcer un recalcul du chemin
}
cerdic
a validé
return $path_a;
}
cerdic
a validé
function lister_themes_prives() {
cerdic
a validé
if (is_null($themes)) {
cerdic
a validé
if (!defined('_SPIP_THEME_PRIVE')) {
cerdic
a validé
}
// lors d'une installation neuve, prefs n'est pas definie.
if (isset($GLOBALS['visiteur_session']['prefs'])) {
$prefs = $GLOBALS['visiteur_session']['prefs'];
} else {
$prefs = array();
}
cerdic
a validé
if (is_string($prefs)) {
cerdic
a validé
}
marcimat
a validé
((isset($prefs['theme']) and $theme = $prefs['theme'])
or (isset($GLOBALS['theme_prive_defaut']) and $theme = $GLOBALS['theme_prive_defaut']))
and $theme != _SPIP_THEME_PRIVE
cerdic
a validé
) {
array_unshift($themes, $theme);
} // placer le theme choisi en tete
cerdic
a validé
cerdic
a validé
function find_in_theme($file, $subdir = '', $include = false) {
static $themefiles = array();
if (isset($themefiles["$subdir$file"])) {
return $themefiles["$subdir$file"];
}
cerdic
a validé
foreach ($themes as $theme) {
if ($f = find_in_path($file, "prive/themes/$theme/$subdir", $include)) {
return $themefiles["$subdir$file"] = $f;
cerdic
a validé
}
cerdic
a validé
spip_log("$file introuvable dans le theme prive " . reset($themes), 'theme');
return $themefiles["$subdir$file"] = "";
/**
* Cherche une image dans les dossiers d'images
*
* Cherche en priorité dans les thèmes d'image (prive/themes/X/images)
* et si la fonction n'en trouve pas, gère le renommage des icones (ex: 'supprimer' => 'del')
* de facon temporaire le temps de la migration, et cherche de nouveau.
*
* Si l'image n'est toujours pas trouvée, on la cherche dans les chemins,
* dans le répertoire défini par la constante `_NOM_IMG_PACK`
*
* @see find_in_theme()
* @see inc_icone_renommer_dist()
*
* @param string $icone
* Nom de l'icone cherchée
* @return string
* Chemin complet de l'icone depuis la racine si l'icone est trouée,
* sinon chaîne vide.
cerdic
a validé
**/
function chemin_image($icone) {
// gerer le cas d'un double appel en evitant de refaire le travail inutilement
marcimat
a validé
if (strpos($icone, "/") !== false and file_exists($icone)) {
cerdic
a validé
return $icone;
}
// si c'est un nom d'image complet (article-24.png) essayer de le renvoyer direct
marcimat
a validé
if (preg_match(',[.](png|gif|jpg)$,', $icone) and $f = find_in_theme("images/$icone")) {
cerdic
a validé
return $f;
cerdic
a validé
}
// sinon passer par le module de renommage
cerdic
a validé
if (is_null($icone_renommer)) {
$icone_renommer = charger_fonction('icone_renommer', 'inc', true);
}
if ($icone_renommer) {
list($icone, $fonction) = $icone_renommer($icone, "");
if (file_exists($icone)) {
cerdic
a validé
}
cerdic
a validé
return find_in_path($icone, _NOM_IMG_PACK);
}
//
// chercher un fichier $file dans le SPIP_PATH
// si on donne un sous-repertoire en 2e arg optionnel, il FAUT le / final
// si 3e arg vrai, on inclut si ce n'est fait.
/**
* Recherche un fichier dans les chemins de SPIP (squelettes, plugins, core)
*
* Retournera le premier fichier trouvé (ayant la plus haute priorité donc),
* suivant l'ordre des chemins connus de SPIP.
*
* @api
cerdic
a validé
* @see charger_fonction()
* @uses creer_chemin() Pour la liste des chemins.
* @example
* ```
* $f = find_in_path('css/perso.css');
* $f = find_in_path('perso.css', 'css');
* ```
*
* @param string $file
* Fichier recherché
* @param string $dirname
* Répertoire éventuel de recherche (est aussi extrait automatiquement de $file)
* @param bool|string $include
* - false : ne fait rien de plus
* - true : inclut le fichier (include_once)
* - 'require' : idem, mais tue le script avec une erreur si le fichier n'est pas trouvé.
* @return string|bool
* - string : chemin du fichier trouvé
* - false : fichier introuvable
cerdic
a validé
**/
function find_in_path($file, $dirname = '', $include = false) {
static $dirs = array();
static $inc = array(); # cf http://trac.rezo.net/trac/spip/changeset/14743
static $c = '';
// on calcule le chemin si le dossier skel a change
cerdic
a validé
if ($c != $GLOBALS['dossier_squelettes']) {
// assurer le non plantage lors de la montee de version :
$c = $GLOBALS['dossier_squelettes'];
creer_chemin(); // forcer un recalcul du chemin et la mise a jour de path_sig
}
if (isset($GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file])) {
cerdic
a validé
if (!$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]) {
cerdic
a validé
}
marcimat
a validé
if ($include and !isset($inc[$dirname][$file])) {
include_once _ROOT_CWD . $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
}
cerdic
a validé
return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file];
cerdic
a validé
$a = strrpos($file, '/');
$dirname .= substr($file, 0, ++$a);
$file = substr($file, $a);
cerdic
a validé
foreach (creer_chemin() as $dir) {
if (!isset($dirs[$a = $dir . $dirname])) {
$dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a);
}
if ($dirs[$a]) {
if (file_exists(_ROOT_CWD . ($a .= $file))) {
marcimat
a validé
if ($include and !isset($inc[$dirname][$file])) {
include_once _ROOT_CWD . $a;
$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
}
cerdic
a validé
if (!defined('_SAUVER_CHEMIN')) {
// si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
cerdic
a validé
if (is_null($GLOBALS['path_files'])) {
return $a;
}
define('_SAUVER_CHEMIN', true);
}
cerdic
a validé
return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a;
}
cerdic
a validé
if ($include) {
spip_log("include_spip $dirname$file non trouve");
cerdic
a validé
if ($include === 'required') {
echo '<pre>',
"<strong>Erreur Fatale</strong><br />";
cerdic
a validé
if (function_exists('debug_print_backtrace')) {
echo debug_print_backtrace();
cerdic
a validé
}
echo '</pre>';
die("Erreur interne: ne peut inclure $dirname$file");
}
}
cerdic
a validé
if (!defined('_SAUVER_CHEMIN')) {
// si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher
cerdic
a validé
if (is_null($GLOBALS['path_files'])) {
return false;
}
define('_SAUVER_CHEMIN', true);
}
cerdic
a validé
return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false;
cerdic
a validé
function clear_path_cache() {
$GLOBALS['path_files'] = array();
spip_unlink(_CACHE_CHEMIN);
}
cerdic
a validé
function load_path_cache() {
// charger le path des plugins
cerdic
a validé
if (@is_readable(_CACHE_PLUGINS_PATH)) {
include_once(_CACHE_PLUGINS_PATH);
}
$GLOBALS['path_files'] = array();
// si le visiteur est admin,
// on ne recharge pas le cache pour forcer sa mise a jour
if (
// la session n'est pas encore chargee a ce moment, on ne peut donc pas s'y fier
//AND (!isset($GLOBALS['visiteur_session']['statut']) OR $GLOBALS['visiteur_session']['statut']!='0minirezo')
// utiliser le cookie est un pis aller qui marche 'en general'
// on blinde par un second test au moment de la lecture de la session
// !isset($_COOKIE[$GLOBALS['cookie_prefix'].'_admin'])
cerdic
a validé
!_request('var_mode')
) {
cerdic
a validé
// on essaye de lire directement sans verrou pour aller plus vite
cerdic
a validé
if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)) {
cerdic
a validé
// mais si semble corrompu on relit avec un verrou
cerdic
a validé
if (!$GLOBALS['path_files'] = unserialize($contenu)) {
lire_fichier(_CACHE_CHEMIN, $contenu);
if (!$GLOBALS['path_files'] = unserialize($contenu)) {
cerdic
a validé
$GLOBALS['path_files'] = array();
cerdic
a validé
}
cerdic
a validé
}
}
cerdic
a validé
function save_path_cache() {
marcimat
a validé
and _SAUVER_CHEMIN
cerdic
a validé
) {
ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files']));
}
* Trouve tous les fichiers du path correspondants à un pattern
*
* Pour un nom de fichier donné, ne retourne que le premier qui sera trouvé
* par un `find_in_path()`
*
* @param string $dir
* @param string $pattern
* @param bool $recurs
* @return array
*/
cerdic
a validé
function find_all_in_path($dir, $pattern, $recurs = false) {
$liste_fichiers = array();
$maxfiles = 10000;
// cas borderline si dans mes_options on appelle redirige_par_entete qui utilise _T et charge un fichier de langue
// on a pas encore inclus flock.php
if (!function_exists('preg_files')) {
include_once _ROOT_RESTREINT . 'inc/flock.php';
}
// Parcourir le chemin
foreach (creer_chemin() as $d) {
cerdic
a validé
$f = $d . $dir;
if (@is_dir($f)) {
$liste = preg_files($f, $pattern, $maxfiles - count($liste_fichiers), $recurs === true ? array() : $recurs);
cerdic
a validé
foreach ($liste as $chemin) {
$nom = basename($chemin);
// ne prendre que les fichiers pas deja trouves
// car find_in_path prend le premier qu'il trouve,
// les autres sont donc masques
cerdic
a validé
if (!isset($liste_fichiers[$nom])) {
$liste_fichiers[$nom] = $chemin;
cerdic
a validé
}
}
}
cerdic
a validé
return $liste_fichiers;
}
/**
* Prédicat sur les scripts de ecrire qui n'authentifient pas par cookie
* @param string $nom
* @return bool
*/
cerdic
a validé
function autoriser_sans_cookie($nom) {
static $autsanscookie = array('install', 'base_repair');
$nom = preg_replace('/.php[3]?$/', '', basename($nom));
return in_array($nom, $autsanscookie);
}
* Fonction codant et décodant les URLs des objets SQL mis en page par SPIP
* @param string $id
* numero de la cle primaire si nombre, URL a decoder si pas numerique
* @param string $entite
* surnom de la table SQL (donne acces au nom de cle primaire)
* @param string $args
* query_string a placer apres cle=$id&....
* @param string $ancre
* ancre a mettre a la fin de l'URL a produire
* @param bool|string $public
* produire l'URL publique ou privee (par defaut: selon espace)
* si string : serveur de base de donnee (nom du connect)
* @param string $type
* fichier dans le repertoire ecrire/urls determinant l'apparence
* @return string|array
* url codee ou fonction de decodage
* array : derogatoire, la fonction d'url retourne (objet,id_objet) utilises par nettoyer_raccourcis_typo() pour generer un lien titre
* (cas des raccourcis personalises [->spip20] : il faut implementer une fonction generer_url_spip et une fonction generer_url_ecrire_spip)
*/
cerdic
a validé
function generer_url_entite($id = '', $entite = '', $args = '', $ancre = '', $public = null, $type = null) {
if ($public === null) {
$public = !test_espace_prive();
}
$entite = objet_type($entite); // cas particulier d'appels sur objet/id_objet...
if (!$public) {
cerdic
a validé
if (!$entite) {
return '';
}
if (!function_exists('generer_url_ecrire_objet')) {
include_spip('inc/urls');
cerdic
a validé
}
$res = generer_url_ecrire_objet($entite, $id, $args, $ancre, false);
cerdic
a validé
if ($type === null) {
$type = (isset($GLOBALS['type_urls']))
? $GLOBALS['type_urls'] // pour surcharge via fichier d'options
: ((isset($GLOBALS['meta']['type_urls'])) // sinon la config url_etendues
? ($GLOBALS['meta']['type_urls']) : "page"); // sinon type "page" par défaut
$f = charger_fonction($type, 'urls', true);
// se rabattre sur les urls page si les urls perso non dispo
cerdic
a validé
if (!$f) {
$f = charger_fonction('page', 'urls', true);
}
// si $entite='', on veut la fonction de passage URL ==> id
// sinon on veut effectuer le passage id ==> URL
cerdic
a validé
if (!$entite) {
return $f;
}
// mais d'abord il faut tester le cas des urls sur une
// base distante
if (is_string($public)
marcimat
a validé
and $g = charger_fonction('connect', 'urls', true)
cerdic
a validé
) {
$f = $g;
cerdic
a validé
}
$res = $f(intval($id), $entite, $args, $ancre, $public);
cerdic
a validé
if ($res) {
return $res;
}
// Sinon c'est un raccourci ou compat SPIP < 2
if (!function_exists($f = 'generer_url_' . $entite)) {
cerdic
a validé
if (!function_exists($f .= '_dist')) {
$f = '';
}
if ($f) {
$url = $f($id, $args, $ancre);
cerdic
a validé
if (strlen($args)) {
$url .= strstr($url, '?')
cerdic
a validé
? '&' . $args
: '?' . $args;
}
return $url;
}
// On a ete gentil mais la ....
spip_log("generer_url_entite: entite $entite ($f) inconnue $type $public");
cerdic
a validé
cerdic
a validé
function generer_url_ecrire_entite_edit($id, $entite, $args = '', $ancre = '') {
$exec = objet_info($entite, 'url_edit');
$url = generer_url_ecrire($exec, $args);
if (intval($id)) {
$url = parametre_url($url, id_table_objet($entite), $id);
} else {
$url = parametre_url($url, 'new', 'oui');
}
if ($ancre) {
$url = ancre_url($url, $ancre);
}
return $url;
}
// http://code.spip.net/@urls_connect_dist
gilles.vincent
a validé
function urls_connect_dist($i, &$entite, $args = '', $ancre = '', $public = null) {
include_spip('base/connect_sql');
cerdic
a validé
$id_type = id_table_objet($entite, $public);
return _DIR_RACINE . get_spip_script('./')
cerdic
a validé
. "?" . _SPIP_PAGE . "=$entite&$id_type=$i&connect=$public"
. (!$args ? '' : "&$args")
. (!$ancre ? '' : "#$ancre");
}
/**
* Transformer les caractères utf8 d'une URL (farsi par exemple) selon la RFC 1738
*
* @param string $url
* @return string
*/
function urlencode_1738($url) {
cerdic
a validé
if (preg_match(',[^\x00-\x7E],sS', $url)) {
$uri = '';
cerdic
a validé
for ($i = 0; $i < strlen($url); $i++) {
if (ord($a = $url[$i]) > 127) {
$a = rawurlencode($a);
cerdic
a validé
}
$uri .= $a;
}
$url = $uri;
cerdic
a validé
return quote_amp($url);
// http://code.spip.net/@generer_url_entite_absolue
cerdic
a validé
function generer_url_entite_absolue($id = '', $entite = '', $args = '', $ancre = '', $connect = null) {
if (!$connect) {
$connect = true;
}
$h = generer_url_entite($id, $entite, $args, $ancre, $connect);
if (!preg_match(',^\w+:,', $h)) {
include_spip('inc/filtres_mini');
cerdic
a validé
return $h;
/**
* Tester qu'une variable d'environnement est active
cerdic
a validé
*
* Sur certains serveurs, la valeur 'Off' tient lieu de false dans certaines
* variables d'environnement comme $_SERVER[HTTPS] ou ini_get(register_globals)
*
* @param string|bool $truc
* La valeur de la variable d'environnement
* @return bool
* true si la valeur est considérée active ; false sinon.
cerdic
a validé
**/
function test_valeur_serveur($truc) {
cerdic
a validé
if (!$truc) {
return false;
}
return (strtolower($truc) !== 'off');
//
// Fonctions de fabrication des URL des scripts de Spip
//
/**
RastaPopoulos
a validé
* Calcule l'URL de base du site, en priorité sans se fier à la méta (adresse_site) qui
* peut être fausse (sites avec plusieurs noms d’hôtes, déplacements, erreurs).
* En dernier recours, lorsqu'on ne trouve rien, on utilise adresse_site comme fallback.
cerdic
a validé
*
* @note
* La globale `$profondeur_url` doit être initialisée de manière à
* indiquer le nombre de sous-répertoires de l'url courante par rapport à la
* racine de SPIP : par exemple, sur ecrire/ elle vaut 1, sur sedna/ 1, et à
* la racine 0. Sur url/perso/ elle vaut 2
*
* @param int|boo|array $profondeur
* - si non renseignée : retourne l'url pour la profondeur $GLOBALS['profondeur_url']
* - si int : indique que l'on veut l'url pour la profondeur indiquée
* - si bool : retourne le tableau static complet
* - si array : réinitialise le tableau static complet avec la valeur fournie
* @return string|array
*/
gilles.vincent
a validé
function url_de_base($profondeur = null) {
cerdic
a validé
if (is_array($profondeur)) {
return $url = $profondeur;
}
if ($profondeur === false) {
return $url;
}
cerdic
a validé
if (is_null($profondeur)) {
$profondeur = $GLOBALS['profondeur_url'];
}
cerdic
a validé
if (isset($url[$profondeur])) {
return $url[$profondeur];
cerdic
a validé
}
$http = 'http';
if (
isset($_SERVER["SCRIPT_URI"])
and substr($_SERVER["SCRIPT_URI"], 0, 5) == 'https'
) {
$http = 'https';
} elseif (
isset($_SERVER['HTTPS'])
and test_valeur_serveur($_SERVER['HTTPS'])
) {
$http = 'https';
}
// note : HTTP_HOST contient le :port si necessaire
$host = $_SERVER['HTTP_HOST'];
// si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback
if (is_null($host) and isset($GLOBALS['meta']['adresse_site'])) {
$host = $GLOBALS['meta']['adresse_site'];
if ($scheme = parse_url($host, PHP_URL_SCHEME)) {
$http = $scheme;
$host = str_replace("{$scheme}://", '', $host);
RastaPopoulos
a validé
}
}
if (isset($_SERVER['SERVER_PORT'])
and $port = $_SERVER['SERVER_PORT']
and strpos($host, ":") == false
) {
if (!defined('_PORT_HTTP_STANDARD')) {
define('_PORT_HTTP_STANDARD', '80');
}
if (!defined('_PORT_HTTPS_STANDARD')) {
define('_PORT_HTTPS_STANDARD', '443');
}
if ($http == "http" and !in_array($port, explode(',', _PORT_HTTP_STANDARD))) {
$host .= ":$port";
}
if ($http == "https" and !in_array($port, explode(',', _PORT_HTTPS_STANDARD))) {
$host .= ":$port";
}
cerdic
a validé
if (!$GLOBALS['REQUEST_URI']) {
if (isset($_SERVER['REQUEST_URI'])) {
$GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI'];
} else {
$GLOBALS['REQUEST_URI'] = $_SERVER['PHP_SELF'];
if ($_SERVER['QUERY_STRING']
marcimat
a validé
and !strpos($_SERVER['REQUEST_URI'], '?')
cerdic
a validé
) {
$GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING'];
}
cerdic
a validé
$url[$profondeur] = url_de_($http, $host, $GLOBALS['REQUEST_URI'], $profondeur);
return $url[$profondeur];
cerdic
a validé
/**
* fonction testable de construction d'une url appelee par url_de_base()
cerdic
a validé
*
* @param string $http
* @param string $host
* @param string $request
* @param int $prof
* @return string
*/
cerdic
a validé
function url_de_($http, $host, $request, $prof = 0) {
$prof = max($prof, 0);
cerdic
a validé
$myself = ltrim($request, '/');
# supprimer la chaine de GET
list($myself) = explode('?', $myself);
// vieux mode HTTP qui envoie après le nom de la methode l'URL compléte
// protocole, "://", nom du serveur avant le path dans _SERVER["REQUEST_URI"]
if (strpos($myself,'://') !== false) {
$myself = explode('://',$myself);
array_shift($myself);
$myself = implode('://',$myself);
$myself = explode('/',$myself);
array_shift($myself);
$myself = implode('/',$myself);
}
$url = join('/', array_slice(explode('/', $myself), 0, -1 - $prof)) . '/';
cerdic
a validé
$url = $http . '://' . rtrim($host, '/') . '/' . ltrim($url, '/');
return $url;
}
// Pour une redirection, la liste des arguments doit etre separee par "&"
// Pour du code XHTML, ca doit etre &
// Bravo au W3C qui n'a pas ete capable de nous eviter ca
// faute de separer proprement langage et meta-langage
// Attention, X?y=z et "X/?y=z" sont completement differents!
// http://httpd.apache.org/docs/2.0/mod/mod_dir.html
esj
a validé
/**
* Crée une URL vers un script de l'espace privé
*
* @example
* ```
* generer_url_ecrire('admin_plugin')
* ```
*
* @param string $script
* Nom de la page privée (xx dans exec=xx)
* @param string $args
* Arguments à transmettre, tel que `arg1=yy&arg2=zz`
* @param bool $no_entities
* Si false : transforme les `&` en `&`
* @param bool|string $rel
* URL relative ?
*
* - false : l’URL sera complète et contiendra l’URL du site
* - true : l’URL sera relavive.
* - string : on transmet l'url à la fonction
* @return string URL
cerdic
a validé
**/
gilles.vincent
a validé
function generer_url_ecrire($script = '', $args = "", $no_entities = false, $rel = false) {
cerdic
a validé
if (!$rel) {
$rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT;
cerdic
a validé
} else {
if (!is_string($rel)) {
$rel = _DIR_RESTREINT ? _DIR_RESTREINT :
('./' . _SPIP_ECRIRE_SCRIPT);
}
}
list($script, $ancre) = array_pad(explode('#', $script), 2, null);
marcimat
a validé
if ($script and ($script <> 'accueil' or $rel)) {
$args = "?exec=$script" . (!$args ? '' : "&$args");
cerdic
a validé
} elseif ($args) {
$args = "?$args";
}
if ($ancre) {
$args .= "#$ancre";
}
return $rel . ($no_entities ? $args : str_replace('&', '&', $args));
}
/**
* Permet d'ajouter lien vers une page privée à un paramètre d'url (déprécié)
*
* ```
* // deprecié
* $h = generer_url_ecrire('article', "id_article=$id_article&redirect=" . generer_url_retour('articles'));
* // utiliser
* $h = generer_url_ecrire('article');
* $h = parametre_url($h, 'id_article', $id_article);
* $h = parametre_url($h, 'redirect', generer_url_ecrire('articles'));
* ```
*
* @deprecated Utiliser parametre_url() et generer_url_ecrire()
* @see parametre_url()
* @see generer_url_ecrire()
*
* @param string $script
* @param string $args
* @return string
*/
cerdic
a validé
function generer_url_retour($script, $args = "") {
return rawurlencode(generer_url_ecrire($script, $args, true, true));
}
//
// Adresse des scripts publics (a passer dans inc-urls...)
//
/**
* Retourne le nom du fichier d'exécution de SPIP
*
* @see _SPIP_SCRIPT
* @note
* Detecter le fichier de base, a la racine, comme etant spip.php ou ''
* dans le cas de '', un $default = './' peut servir (comme dans urls/page.php)
*
* @param string $default
* Script par défaut
* @return string
* Nom du fichier (constante _SPIP_SCRIPT), sinon nom par défaut
cerdic
a validé
**/
gilles.vincent
a validé
function get_spip_script($default = '') {
# cas define('_SPIP_SCRIPT', '');
cerdic
a validé
if (_SPIP_SCRIPT) {
cerdic
a validé
} else {
cerdic
a validé
}
/**
* Crée une URL vers une page publique de SPIP
*
* @example
* ```
* generer_url_public("rubrique","id_rubrique=$id_rubrique")
* ```
*
* @param string $script
* Nom de la page
* @param string|array $args
* Arguments à transmettre a l'URL,
* soit sous la forme d'un string tel que `arg1=yy&arg2=zz`
* soit sous la forme d'un array tel que array( `arg1` => `yy`, `arg2` => `zz` )
* @param bool $no_entities
* Si false : transforme les `&` en `&`
* @param bool $rel
* URL relative ?
*
* - false : l’URL sera complète et contiendra l’URL du site
* - true : l’URL sera relavive.
* @param string $action
* - Fichier d'exécution public (spip.php par défaut)
* @return string URL
cerdic
a validé
**/
gilles.vincent
a validé
function generer_url_public($script = '', $args = "", $no_entities = false, $rel = true, $action = '') {
// si le script est une action (spip_pass, spip_inscription),
cerdic
a validé
if (!$action) {
$action = get_spip_script();
}
if ($script) {
cerdic
a validé
$action = parametre_url($action, _SPIP_PAGE, $script, '&');