function balise_FOREACH($p) { $_tableau = interprete_argument_balise(1,$p); $_tableau = str_replace("'", "", strtoupper($_tableau)); $_tableau = sinon($_tableau, 'ENV'); $f = 'balise_'.$_tableau; $balise = function_exists($f) ? $f : (function_exists($g = $f.'_dist') ? $g : ''); if($balise) { $_modele = interprete_argument_balise(2,$p); $_modele = str_replace("'", "", strtolower($_modele)); $__modele = 'foreach_'.strtolower($_tableau); $_modele = (!$_modele AND find_in_path('modeles/'.$__modele.'.html')) ? $__modele : ($_modele ? $_modele : 'foreach'); $p->param = @array_shift(@array_shift($p->param)); $p = $balise($p); $filtre = chercher_filtre('foreach'); $p->code = $filtre . "(unserialize(" . $p->code . "), '" . $_modele . "')"; } //On a pas trouve la balise correspondant au tableau a traiter else { erreur_squelette( _L(/*zbug*/'erreur #FOREACH: la balise #'.$_tableau.' n\'existe pas'), $p->id_boucle ); $p->code = "''"; } return $p; }
function balise_FORMULAIRE_SIGNATURE_stat($args, $context_compil) { // pas d'id_article => erreur de contexte if (!$args[0]) { $msg = array('zbug_champ_hors_motif', array ('champ' => 'FORMULAIRE_SIGNATURE', 'motif' => 'ARTICLES')); erreur_squelette($msg, $context_compil); return ''; } // article sans petition => pas de balise else if (!$args[1]) return ''; else { // aller chercher dans la base la petition associee if ($r = sql_fetsel("texte, site_obli, message", 'spip_petitions', "id_article = ".intval($args[0]))) { $args[2] = $r['texte']; // le signataire doit-il donner un site ? $args[3] = ($r['site_obli'] == 'oui') ? ' ':''; // le signataire peut-il proposer un commentaire $args[4] = ($r['message'] == 'oui') ? ' ':''; } return $args; } }
function balise_SET__dist($p) { $champ = $p->nom_champ; preg_match(",^SET_([A-Z_]+)?$,i", $champ, $filtre); $filtre = strtolower($filtre[1]); $filtre2 = chercher_filtre($filtre); if (!$filtre2) { $err_b_s_a = array('zbug_erreur_filtre', array('filtre' => $filtre)); erreur_squelette($err_b_s_a, $p); } else { $nom = interprete_argument_balise(1,$p); if (!$nom) { $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => $champ)); erreur_squelette($err_b_s_a, $p); } else { $i = 1; $args = array(); while(($a = interprete_argument_balise(++$i,$p)) != NULL) $args[] = $a; $get = function_exists('balise_GET') ? 'balise_GET' : 'balise_GET_dist'; $q = $p; $q->param[0] = array($q->param[0][0], $q->param[0][1]); $get = $get($q); $filtre2 .= '('.$get->code.','.join(",", $args).')'; $p->code = "vide(\$Pile['vars'][$nom] = $filtre2)"; } } $p->interdire_scripts = false; // la balise ne renvoie rien return $p; }
/** * Calculs de paramètres de contexte automatiques pour la balise FORMULAIRE_ECRIRE_AUTEUR * * Retourne le contexte du formulaire uniquement si l'email de l'auteur * est valide, sinon rien (pas d'exécution/affichage du formulaire) * * @param array $args * Liste des arguments demandés obtenus du contexte (id_auteur, id_article, email) * @param array $context_compil * Tableau d'informations sur la compilation * @return array|string * - Liste (id_auteur, id_article, email) des paramètres du formulaire CVT * - chaîne vide sinon (erreur ou non affichage). */ function balise_FORMULAIRE_ECRIRE_AUTEUR_stat($args, $context_compil) { include_spip('inc/filtres'); // Pas d'id_auteur ni d'id_article ? Erreur de contexte $id = intval($args[1]); if (!$args[0] and !$id) { $msg = array('zbug_champ_hors_motif', array('champ' => 'FORMULAIRE_ECRIRE_AUTEUR', 'motif' => 'AUTEURS/ARTICLES')); erreur_squelette($msg, $context_compil); return ''; } // Si on est dans un contexte article, // sortir tous les mails des auteurs de l'article if (!$args[0] and $id) { $r = ''; $s = sql_allfetsel('email', 'spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON (A.id_auteur=L.id_auteur AND L.objet=\'article\')', "A.email != '' AND L.id_objet={$id}"); foreach ($s as $row) { if (email_valide($row['email'])) { $r .= ', ' . $row['email']; } } $args[2] = substr($r, 2); } // On ne peut pas ecrire a un auteur dont le mail n'est pas valide if (!$args[2] or !email_valide($args[2])) { return ''; } // OK return $args; }
function trace_query_end($query, $start, $result, $erreur, $serveur=''){ if ($start) trace_query_chrono($start, microtime(), $query, $result, $serveur); // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql if ($erreur AND !preg_match('/^select\b/i', $query)) erreur_squelette(array(sql_errno($serveur), $erreur, $query)); return $result; }
/** * Composer le code d'execution d'un filtre * * @param string $fonc * @param string $code * @param string $arglist * @param Object $p * @return string */ function sandbox_composer_filtre($fonc, $code, $arglist, &$p) { if (isset($GLOBALS['spip_matrice'][$fonc])) { $code = "filtrer('{$fonc}',{$code}{$arglist})"; } elseif ($f = chercher_filtre($fonc)) { $code = "{$f}({$code}{$arglist})"; } else { erreur_squelette(array('zbug_erreur_filtre', array('filtre' => texte_script($fonc))), $p); } return $code; }
function balise_FORMULAIRE_SITE_stat($args, $context_compil) { // Pas d'id_rubrique ? Erreur de contexte if (!$args[0]) { $msg = array('zbug_champ_hors_motif', array('champ' => 'FORMULAIRE_SITE', 'motif' => 'RUBRIQUES')); erreur_squelette($msg, $context_compil); return ''; } // Verifier que les visisteurs sont autorises a proposer un site return $GLOBALS['meta']["proposer_sites"] != 2 ? '' : $args; }
function balise_AVANCEMENT_CAMPAGNE_dist($p) { if ($p->type_requete != "souscription_campagnes") { $msg = array('zbug_champ_hors_boucle', array('champ' => '#AVANCEMENT_CAMPAGNE')); erreur_squelette($msg, $p); } else { $_campagne = champ_sql('id_souscription_campagne', $p); $_type_objectif = champ_sql('type_objectif', $p); $_objectif_initial = champ_sql('objectif_initial', $p); $p->code = "calcul_avancement_campagne({$_campagne}, {$_type_objectif}, {$_objectif_initial})"; $p->interdire_scripts = false; } return $p; }
function balise_FORMULAIRE_SIGNATURE_stat($args, $context_compil) { // pas d'id_article => erreur de contexte if (!$args[0]) { $msg = array('zbug_champ_hors_motif', array('champ' => 'FORMULAIRE_SIGNATURE', 'motif' => 'ARTICLES')); erreur_squelette($msg, $context_compil); return ''; } else { if (!$args[1]) { return ''; } } // on envoie pas cet argument dans le CVT unset($args[1]); return $args; }
/** * Generer n'importe quel info pour un objet : #INFO_TITRE{article, #ENV{id_article}} * Utilise la fonction generer_info_entite() de inc/filtres * se reporter a sa documentation * */ function balise_INFO__dist($p) { $info = $p->nom_champ; $type_objet = interprete_argument_balise(1, $p); $id_objet = interprete_argument_balise(2, $p); if ($info === 'INFO_' or !$type_objet or !$id_objet) { $msg = _T('zbug_balise_sans_argument', array('balise' => ' INFO_')); erreur_squelette($msg, $p); $p->interdire_scripts = true; return $p; } else { $info_sql = strtolower(substr($info, 5)); $code = "generer_info_entite({$id_objet}, {$type_objet}, '{$info_sql}'" . ($p->etoile ? "," . _q($p->etoile) : "") . ")"; $p->code = champ_sql($info, $p, $code); $p->interdire_scripts = true; return $p; } }
/** * Composer le code d'execution d'un filtre * * @param string $fonc * @param string $code * @param string $arglist * @param Object $p * @return string */ function sandbox_composer_filtre($fonc, $code, $arglist, &$p) { if (isset($GLOBALS['spip_matrice'][$fonc])) { $code = "filtrer('{$fonc}',{$code}{$arglist})"; } elseif ($f = chercher_filtre($fonc)) { // cas particulier : le filtre |set doit acceder a la $Pile // proto: filtre_set(&$Pile, $val, $args...) $refl = new ReflectionFunction($f); $refs = $refl->getParameters(); if (isset($refs[0]) and $refs[0]->name == 'Pile') { $code = "{$f}(\$Pile,{$code}{$arglist})"; } else { $code = "{$f}({$code}{$arglist})"; } } else { erreur_squelette(array('zbug_erreur_filtre', array('filtre' => texte_script($fonc))), $p); } return $code; }
/** * {agendafull ..} variante etendue du crietre agenda du core * qui accepte une date de debut et une date de fin * * {agendafull date_debut, date_fin, jour, #ENV{annee}, #ENV{mois}, #ENV{jour}} * {agendafull date_debut, date_fin, semaine, #ENV{annee}, #ENV{mois}, #ENV{jour}} * {agendafull date_debut, date_fin, mois, #ENV{annee}, #ENV{mois}} * {agendafull date_debut, date_fin, periode, #ENV{annee}, #ENV{mois}, #ENV{jour}, * #ENV{annee_fin}, #ENV{mois_fin}, #ENV{jour_fin}} * * @param string $idb * @param object $boucles * @param object $crit */ function critere_agendafull_dist($idb, &$boucles, $crit) { $params = $crit->param; if (count($params) < 1) { erreur_squelette(_T('zbug_info_erreur_squelette'), "{agenda ?} BOUCLE{$idb}"); } $parent = $boucles[$idb]->id_parent; // les valeurs $date et $type doivent etre connus a la compilation // autrement dit ne pas etre des champs $date_deb = array_shift($params); $date_deb = $date_deb[0]->texte; $date_fin = array_shift($params); $date_fin = $date_fin[0]->texte; $type = array_shift($params); $type = $type[0]->texte; $annee = $params ? array_shift($params) : ""; $annee = "\n" . 'sprintf("%04d", ($x = ' . calculer_liste($annee, array(), $boucles, $parent) . ') ? $x : date("Y"))'; $mois = $params ? array_shift($params) : ""; $mois = "\n" . 'sprintf("%02d", ($x = ' . calculer_liste($mois, array(), $boucles, $parent) . ') ? $x : date("m"))'; $jour = $params ? array_shift($params) : ""; $jour = "\n" . 'sprintf("%02d", ($x = ' . calculer_liste($jour, array(), $boucles, $parent) . ') ? $x : date("d"))'; $annee2 = $params ? array_shift($params) : ""; $annee2 = "\n" . 'sprintf("%04d", ($x = ' . calculer_liste($annee2, array(), $boucles, $parent) . ') ? $x : date("Y"))'; $mois2 = $params ? array_shift($params) : ""; $mois2 = "\n" . 'sprintf("%02d", ($x = ' . calculer_liste($mois2, array(), $boucles, $parent) . ') ? $x : date("m"))'; $jour2 = $params ? array_shift($params) : ""; $jour2 = "\n" . 'sprintf("%02d", ($x = ' . calculer_liste($jour2, array(), $boucles, $parent) . ') ? $x : date("d"))'; $boucle =& $boucles[$idb]; $date = $boucle->id_table . ".{$date}"; $quote_end = ",'" . $boucle->sql_serveur . "','text'"; if ($type == 'jour') { $boucle->where[] = array("'AND'", array("'<='", "'DATE_FORMAT({$date_deb}, \\'%Y%m%d\\')'", "sql_quote({$annee} . {$mois} . {$jour}{$quote_end})"), array("'>='", "'DATE_FORMAT({$date_fin}, \\'%Y%m%d\\')'", "sql_quote({$annee} . {$mois} . {$jour}{$quote_end})")); } elseif ($type == 'mois') { $boucle->where[] = array("'AND'", array("'<='", "'DATE_FORMAT({$date_deb}, \\'%Y%m\\')'", "sql_quote({$annee} . {$mois}{$quote_end})"), array("'>='", "'DATE_FORMAT({$date_fin}, \\'%Y%m\\')'", "sql_quote({$annee} . {$mois}{$quote_end})")); } elseif ($type == 'semaine') { $boucle->where[] = array("'AND'", array("'>='", "'DATE_FORMAT({$date_fin}, \\'%Y%m%d\\')'", "date_debut_semaine({$annee}, {$mois}, {$jour})"), array("'<='", "'DATE_FORMAT({$date_deb}, \\'%Y%m%d\\')'", "date_fin_semaine({$annee}, {$mois}, {$jour})")); } elseif (count($crit->param) > 3) { $boucle->where[] = array("'AND'", array("'>='", "'DATE_FORMAT({$date_fin}, \\'%Y%m%d\\')'", "sql_quote({$annee} . {$mois} . {$jour}{$quote_end})"), array("'<='", "'DATE_FORMAT({$date_deb}, \\'%Y%m%d\\')'", "sql_quote({$annee2} . {$mois2} . {$jour2}{$quote_end})")); } // sinon on prend tout }
function balise_URL__dist($p) { $nom = $p->nom_champ; if ($nom === 'URL_') { $msg = array('zbug_balise_sans_argument', array('balise' => ' URL_')); erreur_squelette($msg, $p); $p->interdire_scripts = false; return $p; } elseif ($f = charger_fonction($nom, 'balise', true)) { return $f($p); } else { $nom = strtolower($nom); $code = generer_generer_url(substr($nom, 4), $p); $code = champ_sql($nom, $p, $code); $p->code = $code; if (!$p->etoile) { $p->code = "vider_url({$code})"; } $p->interdire_scripts = false; return $p; } }
/** * Compiler des styles inline LESS en CSS * * @param string $style * contenu du .less * @param array $contexte * file : chemin du fichier compile * utilise en cas de message d'erreur, et pour le repertoire de reference des @import * @return string */ function lesscss_compile($style, $contexte = array()) { static $import_dirs = null; require_once 'less.php/Less.php'; if (is_null($import_dirs)) { $path = _chemin(); $import_dirs = array(); foreach ($path as $p) { $import_dirs[$p] = protocole_implicite(url_absolue($p ? $p : "./")); } } $parser = new Less_Parser(); include_spip('inc/config'); $parser->setOption('sourceMap', lire_config('lesscss/activer_sourcemaps', false) == "on" ? true : false); $parser->setImportDirs($import_dirs); $parser->relativeUrls = true; try { $url_absolue = $contexte['file'] ? protocole_implicite(url_absolue($contexte['file'])) : null; $parser->parse($style, $url_absolue); $out = $parser->getCss(); if ($files = Less_Parser::AllParsedFiles() and count($files)) { $l = strlen(_DIR_RACINE); foreach ($files as $k => $file) { if (strncmp($file, _DIR_RACINE, $l) == 0) { $files[$k] = substr($file, $l); } } $out = "/*\n#@" . implode("\n#@", $files) . "\n*" . "/\n" . $out; } return $out; } catch (exception $ex) { spip_log('less.php fatal error:' . $ex->getMessage(), 'less' . _LOG_ERREUR); erreur_squelette("LESS : Echec compilation" . (isset($contexte['file']) ? " fichier " . $contexte['file'] : "") . "<br />" . $ex->getMessage()); return ''; } }
/** * Fonction de formatage du contenu renvoye en ajax * * http://doc.spip.org/@ajax_retour * * @param string $corps * @param string $content_type * permet de definir le type de contenu renvoye. * Si rien de précisé, ou si true c'est "text/html" avec un entete xml en plus. * La valeur speciale false fournit text/html sans entete xml. Elle equivaut a * passer "text/html" comme $content_type */ function ajax_retour($corps, $content_type = null) { $xml = false; if (is_null($content_type) or $content_type === true) { $xml = true; $content_type = 'text/html'; } elseif (!$content_type or !is_string($content_type) or strpos($content_type, '/') === false) { $content_type = 'text/html'; } $e = ""; if (isset($_COOKIE['spip_admin']) and (_request('var_mode') == 'debug' or !empty($GLOBALS['tableau_des_temps']))) { $e = erreur_squelette(); } if (isset($GLOBALS['transformer_xml']) or isset($GLOBALS['exec']) and $GLOBALS['exec'] == 'valider_xml') { $debut = _DOCTYPE_ECRIRE . "<html><head><title>Debug Spip Ajax</title></head>" . "<body><div>\n\n" . "<!-- %%%%%%%%%%%%%%%%%%% Ajax %%%%%%%%%%%%%%%%%%% -->\n"; $fin = '</div></body></html>'; } else { $c = $GLOBALS['meta']["charset"]; header('Content-Type: ' . $content_type . '; charset=' . $c); $debut = ($xml and strlen(trim($corps))) ? '<' . "?xml version='1.0' encoding='" . $c . "'?" . ">\n" : ''; $fin = ""; } echo $debut, $corps, $fin, $e; }
function filtrer($filtre) { if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) { find_in_path($f, '', true); $GLOBALS['spip_matrice'][$filtre] = true; } $tous = func_get_args(); if (substr($filtre, 0, 6) == 'image_' && $GLOBALS['spip_matrice'][$filtre]) { return image_filtrer($tous); } elseif ($f = chercher_filtre($filtre)) { array_shift($tous); return call_user_func_array($f, $tous); } else { // le filtre n'existe pas, on provoque une erreur $msg = array('zbug_erreur_filtre', array('filtre' => texte_script($filtre))); erreur_squelette($msg); return ''; } }
/** * Effectue une requête de selection * * Fonction de selection (SELECT), retournant la ressource interrogeable par sql_fetch. * * @api * @see sql_fetch() Pour boucler sur les resultats de cette fonction * * @param array|string $select * Liste des champs a recuperer (Select) * @param array|string $from * Tables a consulter (From) * @param array|string $where * Conditions a remplir (Where) * @param array|string $groupby * Critere de regroupement (Group by) * @param array|string $orderby * Tableau de classement (Order By) * @param string $limit * Critere de limite (Limit) * @param array $having * Tableau des des post-conditions a remplir (Having) * @param string $serveur * Le serveur sollicite (pour retrouver la connexion) * @param bool|string $option * Peut avoir 3 valeurs : * * - false -> ne pas l'exécuter mais la retourner, * - continue -> ne pas echouer en cas de serveur sql indisponible, * - true|array -> executer la requête. * Le cas array est, pour une requete produite par le compilateur, * un tableau donnnant le contexte afin d'indiquer le lieu de l'erreur au besoin * * * @return mixed * Ressource SQL * * - Ressource SQL pour sql_fetch, si la requete est correcte * - false en cas d'erreur * - Chaine contenant la requete avec $option=false * * Retourne false en cas d'erreur, apres l'avoir denoncee. * Les portages doivent retourner la requete elle-meme en cas d'erreur, * afin de disposer du texte brut. * **/ function sql_select($select = array(), $from = array(), $where = array(), $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur = '', $option = true) { $f = sql_serveur('select', $serveur, $option === 'continue' or $option === false); if (!is_string($f) or !$f) { return false; } $debug = (defined('_VAR_MODE') and _VAR_MODE == 'debug'); if ($option !== false and !$debug) { $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, is_array($option) ? true : $option); } else { $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); if (!$option) { return $query; } // le debug, c'est pour ce qui a ete produit par le compilateur if (isset($GLOBALS['debug']['aucasou'])) { list($table, $id, ) = $GLOBALS['debug']['aucasou']; $nom = $GLOBALS['debug_objets']['courant'] . $id; $GLOBALS['debug_objets']['requete'][$nom] = $query; } $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, true); } // en cas d'erreur if (!is_string($res)) { return $res; } // denoncer l'erreur SQL dans sa version brute spip_sql_erreur($serveur); // idem dans sa version squelette (prefixe des tables non substitue) $contexte_compil = sql_error_backtrace(true); erreur_squelette(array(sql_errno($serveur), sql_error($serveur), $res), $contexte_compil); return false; }
/** * Resoudre et inliner les @import * ceux-ci ne peuvent etre presents qu'en debut de CSS et on ne veut pas changer l'ordre des directives * * @param string $contenu * @param string $url_base * @return string */ function css_resolve_atimport($contenu, $url_base) { // vite si rien a faire if (strpos($contenu, "@import") === false) { return $contenu; } $imports_non_resolvables = array(); preg_match_all(",@import ([^;]*);,UmsS", $contenu, $matches, PREG_SET_ORDER); if ($matches and count($matches)) { foreach ($matches as $m) { $url = $media = $erreur = ""; if (preg_match(",^\\s*url\\s*\\(\\s*['\"]?([^'\"]*)['\"]?\\s*\\),Ums", $m[1], $r)) { $url = $r[1]; $media = trim(substr($m[1], strlen($r[0]))); } elseif (preg_match(",^\\s*['\"]([^'\"]+)['\"],Ums", $m[1], $r)) { $url = $r[1]; $media = trim(substr($m[1], strlen($r[0]))); } if (!$url) { $erreur = "Compresseur : <tt>" . $m[0] . ";</tt> non resolu dans <tt>{$url_base}</tt>"; } else { $url = suivre_lien($url_base, $url); // url relative ? $root = protocole_implicite($GLOBALS['meta']['adresse_site'] . "/"); if (strncmp($url, $root, strlen($root)) == 0) { $url = _DIR_RACINE . substr($url, strlen($root)); } else { // si l'url a un protocole http(s):// on ne considère qu'on ne peut pas // résoudre le stockage. Par exemple // @import url(https://fonts.googleapis.com/css?family=Ubuntu); // retournant un contenu différent en fonction navigateur // tous les @import restant seront remontes en tete de CSS en fin de concatenation if (preg_match(',^https?://,', $url)) { $url = ""; } else { // protocole implicite // $url = "http:{$url}"; } } if ($url) { // on renvoit dans la boucle pour que le fichier inclus // soit aussi processe (@import, url absolue etc...) $css = compresseur_callback_prepare_css($url); if ($css == $url or !lire_fichier($css, $contenu_imported)) { $erreur = "Compresseur : url {$url} de <tt>" . $m[0] . ";</tt> non resolu dans <tt>{$url_base}</tt>"; } else { if ($media) { $contenu_imported = "@media {$media}{\n{$contenu_imported}\n}\n"; } $contenu = str_replace($m[0], $contenu_imported, $contenu); } } } if ($erreur) { $contenu = str_replace($m[0], "/* erreur @ import " . $m[1] . "*/", $contenu); erreur_squelette($erreur); } } } return $contenu; }
/** * Generer n'importe quel info pour un objet : #INFO_TITRE{article, #ENV{id_article}} * Utilise la fonction generer_info_entite(), se reporter a sa documentation */ function balise_INFO__dist($p){ $info = $p->nom_champ; $type_objet = interprete_argument_balise(1,$p); $id_objet = interprete_argument_balise(2,$p); if ($info === 'INFO_' or !$type_objet or !$id_objet) { $msg = _T('zbug_balise_sans_argument', array('balise' => ' INFO_')); erreur_squelette($msg, $p); $p->interdire_scripts = false; return $p; } elseif ($f = charger_fonction($nom, 'balise', true)) { return $f($p); }else { $p->code = champ_sql($info, $p); if (strpos($p->code, '@$Pile[0]') !== false) { $info = strtolower(substr($info,5)); $p->code = "generer_info_entite($id_objet, $type_objet, '$info')"; } $p->interdire_scripts = false; return $p; } }
/** * Crée une image depuis un fichier ou une URL (au format gif) * * Utilise les fonctions spécifiques GD. * * @param string $filename * Le path vers l'image à traiter (par exemple : IMG/distant/gif/image.gif * ou local/cache-vignettes/L180xH51/image.gif). * @return ressource * Une ressource de type Image GD. */ function _imagecreatefromgif($filename) { $img = @imagecreatefromgif($filename); if (!$img) { spip_log("Erreur lecture imagecreatefromgif {$filename}", _LOG_CRITIQUE); erreur_squelette("Erreur lecture imagecreatefromgif {$filename}"); $img = imagecreate(10, 10); } return $img; }
function public_phraser_html_dist($texte, $id_parent, &$boucles, $descr, $ligne = 1) { $all_res = array(); while (($pos_boucle = strpos($texte, BALISE_BOUCLE)) !== false) { $err_b = ''; // indiquera s'il y a eu une erreur $result = new Boucle(); $result->id_parent = $id_parent; $result->descr = $descr; # attention: reperer la premiere des 2 balises: pre_boucle ou boucle if (!preg_match("," . BALISE_PRE_BOUCLE . '[0-9_],', $texte, $r) or ($n = strpos($texte, $r[0])) === false or $n > $pos_boucle) { $debut = substr($texte, 0, $pos_boucle); $milieu = substr($texte, $pos_boucle); $k = strpos($milieu, '('); $id_boucle = trim(substr($milieu, strlen(BALISE_BOUCLE), $k - strlen(BALISE_BOUCLE))); $milieu = substr($milieu, $k); } else { $debut = substr($texte, 0, $n); $milieu = substr($texte, $n); $k = strpos($milieu, '>'); $id_boucle = substr($milieu, strlen(BALISE_PRE_BOUCLE), $k - strlen(BALISE_PRE_BOUCLE)); if (!preg_match("," . BALISE_BOUCLE . $id_boucle . "[[:space:]]*\\(,", $milieu, $r)) { $err_b = array('zbug_erreur_boucle_syntaxe', array('id' => $id_boucle)); erreur_squelette($err_b, $result); $texte = substr($texte, $n + 1); continue; } else { $pos_boucle = $n; $n = strpos($milieu, $r[0]); $result->avant = substr($milieu, $k + 1, $n - $k - 1); $milieu = substr($milieu, $n + strlen($id_boucle) + strlen(BALISE_BOUCLE)); } } $result->id_boucle = $id_boucle; preg_match(SPEC_BOUCLE, $milieu, $match); $result->type_requete = $match[0]; $milieu = substr($milieu, strlen($match[0])); $type = $match[1]; $jointures = trim($match[2]); $table_optionnelle = $match[3]; if ($jointures) { // on affecte pas ici les jointures explicites, mais dans la compilation // ou elles seront completees des jointures declarees $result->jointures_explicites = $jointures; } if ($table_optionnelle) { $result->table_optionnelle = $type; } // 1ere passe sur les criteres, vu comme des arguments sans fct // Resultat mis dans result->param phraser_args($milieu, "/>", "", $all_res, $result); // En 2e passe result->criteres contiendra un tableau // pour l'instant on met le source (chaine) : // si elle reste ici au final, c'est qu'elle contient une erreur $result->criteres = substr($milieu, 0, @strpos($milieu, $result->apres)); $milieu = $result->apres; $result->apres = ""; // // Recuperer la fin : // if ($milieu[0] === '/') { $suite = substr($milieu, 2); $milieu = ''; } else { $milieu = substr($milieu, 1); $s = BALISE_FIN_BOUCLE . $id_boucle . ">"; $p = strpos($milieu, $s); if ($p === false) { $err_b = array('zbug_erreur_boucle_fermant', array('id' => $id_boucle)); erreur_squelette($err_b, $result); } $suite = substr($milieu, $p + strlen($s)); $milieu = substr($milieu, 0, $p); } $result->milieu = $milieu; // // 1. Recuperer la partie conditionnelle apres // $s = BALISE_POST_BOUCLE . $id_boucle . ">"; $p = strpos($suite, $s); if ($p !== false) { $result->apres = substr($suite, 0, $p); $suite = substr($suite, $p + strlen($s)); } // // 2. Recuperer la partie alternative // $s = BALISE_ALT_BOUCLE . $id_boucle . ">"; $p = strpos($suite, $s); if ($p !== false) { $result->altern = substr($suite, 0, $p); $suite = substr($suite, $p + strlen($s)); } $result->ligne = $ligne + substr_count($debut, "\n"); $m = substr_count($milieu, "\n"); $b = substr_count($result->avant, "\n"); $a = substr_count($result->apres, "\n"); if ($p = strpos($type, ':')) { $result->sql_serveur = substr($type, 0, $p); $type = substr($type, $p + 1); } $soustype = strtolower($type); if (!isset($GLOBALS["table_des_tables"][$soustype])) { $soustype = $type; } $result->type_requete = $soustype; // Lancer la 2e passe sur les criteres si la 1ere etait bonne if (!is_array($result->param)) { $err_b = true; } else { phraser_criteres($result->param, $result); if (strncasecmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) { $result->type_requete = TYPE_RECURSIF; $args = $result->param; array_unshift($args, substr($type, strlen(TYPE_RECURSIF))); $result->param = $args; } } $result->avant = public_phraser_html_dist($result->avant, $id_parent, $boucles, $descr, $result->ligne); $result->apres = public_phraser_html_dist($result->apres, $id_parent, $boucles, $descr, $result->ligne + $b + $m); $result->altern = public_phraser_html_dist($result->altern, $id_parent, $boucles, $descr, $result->ligne + $a + $m + $b); $result->milieu = public_phraser_html_dist($milieu, $id_boucle, $boucles, $descr, $result->ligne + $b); // Prevenir le generateur de code que le squelette est faux if ($err_b) { $result->type_requete = false; } // Verifier qu'il n'y a pas double definition // apres analyse des sous-parties (pas avant). if (isset($boucles[$id_boucle])) { $err_b_d = array('zbug_erreur_boucle_double', array('id' => $id_boucle)); erreur_squelette($err_b_d, $result); // Prevenir le generateur de code que le squelette est faux $boucles[$id_boucle]->type_requete = false; } else { $boucles[$id_boucle] = $result; } $all_res = phraser_champs_etendus($debut, $ligne, $all_res); $all_res[] =& $boucles[$id_boucle]; if (!empty($suite)) { $ligne += substr_count(substr($texte, 0, strpos($texte, $suite)), "\n"); } $texte = $suite; } return phraser_champs_etendus($texte, $ligne, $all_res); }
/** * balise #CSS * */ function balise_CSS_dist($p) { $_css = interprete_argument_balise(1, $p); if (!$_css) { $msg = array('zbug_balise_sans_argument', array('balise' => ' CSS')); erreur_squelette($msg, $p); } else { $p->code = "timestamp(direction_css(trouver_fond({$_css})?produire_fond_statique({$_css},array('format'=>'css')):find_in_path({$_css})))"; } $p->interdire_scripts = false; return $p; }
// cf. public/assembler.php) echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']); if ($lang) { lang_select(); } // l'affichage de la page a pu lever des erreurs (inclusion manquante) // il faut tester a nouveau $debug = (_request('var_mode') == 'debug' or $tableau_des_temps) ? array(1) : array(); // Appel au debusqueur en cas d'erreurs ou de demande de trace // at last if ($debug) { // en cas d'erreur, retester l'affichage if ($html and ($affiche_boutons_admin or $debug)) { $var_mode_affiche = _request('var_mode_affiche'); $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = $var_mode_affiche == 'validation' ? $page['texte'] : ""; echo erreur_squelette(false); } } else { if (isset($GLOBALS['meta']['date_prochain_postdate']) and $GLOBALS['meta']['date_prochain_postdate'] <= time()) { include_spip('inc/rubriques'); calculer_prochain_postdate(true); } // Effectuer une tache de fond ? // si _DIRECT_CRON_FORCE est present, on force l'appel if (defined('_DIRECT_CRON_FORCE')) { cron(); } // sauver le cache chemin si necessaire save_path_cache(); } }
/** * Compile le critère {noeud} * * Trouver tous les objets qui ont des enfants (les noeuds de l'arbre) * {noeud} * {!noeud} retourne les feuilles * * @global array $exceptions_des_tables * * @param string $idb Identifiant de la boucle * @param array $boucles AST du squelette * @param Critere $crit Paramètres du critère dans cette boucle */ function critere_noeud_dist($idb, &$boucles, $crit) { global $exceptions_des_tables; $not = $crit->not; $boucle =& $boucles[$idb]; $primary = $boucle->primary; if (!$primary or strpos($primary, ',')) { erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle); return; } $table = $boucle->type_requete; $table_sql = table_objet_sql(objet_type($table)); $id_parent = isset($exceptions_des_tables[$boucle->id_table]['id_parent']) ? $exceptions_des_tables[$boucle->id_table]['id_parent'] : 'id_parent'; $in = "IN"; $where = array("'IN'", "'{$boucle->id_table}." . "{$primary}'", "'('.sql_get_select('{$id_parent}', '{$table_sql}').')'"); if ($not) { $where = array("'NOT'", $where); } $boucle->where[] = $where; }
function executer_balise_dynamique($nom, $args, $context_compil) { $p = strpos($nom, "_"); $nomfonction = $nom; $nomfonction_generique = substr($nom, 0, $p + 1); if (!($file = include_spip("balise/" . strtolower($nomfonction)))) { // pas de fichier associe, passer au traitement generique $file = include_spip("balise/" . strtolower($nomfonction_generique)); if ($file) { // et injecter en premier arg le nom de la balise array_unshift($args, $nom); // et passer sur la fonction generique pour la suite $nomfonction = $nomfonction_generique; } else { $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom)); erreur_squelette($msg, $context_compil); return ''; } } // Y a-t-il une fonction de traitement des arguments ? $f = 'balise_' . $nomfonction . '_stat'; $r = !function_exists($f) ? $args : $f($args, $context_compil); if (!is_array($r)) { return $r; } // verifier que la fonction dyn est la, // sinon se replier sur la generique si elle existe if (!function_exists('balise_' . $nomfonction . '_dyn')) { $file = include_spip("balise/" . strtolower($nomfonction_generique)); if (function_exists('balise_' . $nomfonction_generique . '_dyn')) { // et lui injecter en premier arg le nom de la balise array_unshift($r, $nom); $nomfonction = $nomfonction_generique; } else { $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom)); erreur_squelette($msg, $context_compil); return ''; } } if (!_DIR_RESTREINT) { $file = _DIR_RESTREINT_ABS . $file; } return synthetiser_balise_dynamique($nomfonction, $r, $file, $context_compil); }
/** * Aller chercher les donnees de la boucle DATA * depuis une source * {source format, [URL], [arg2]...} */ protected function select_source() { # un peu crado : avant de charger le cache il faut charger # les class indispensables, sinon PHP ne saura pas gerer # l'objet en cache ; cf plugins/icalendar # perf : pas de fonction table_to_array ! (table est deja un array) if (isset($this->command['sourcemode']) and !in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) { charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true); } # le premier argument peut etre un array, une URL etc. $src = $this->command['source'][0]; # avons-nous un cache dispo ? $cle = null; if (is_string($src)) { $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true)); } $cache = $this->cache_get($cle); if (isset($this->command['datacache'])) { $ttl = intval($this->command['datacache']); } if ($cache and $cache['time'] + (isset($ttl) ? $ttl : $cache['ttl']) > time() and !(_request('var_mode') === 'recalcul' and include_spip('inc/autoriser') and autoriser('recalcul'))) { $this->tableau = $cache['data']; } else { try { # dommage que ca ne soit pas une option de yql_to_array... if ($this->command['sourcemode'] == 'yql') { if (!isset($ttl)) { $ttl = 3600; } } if (isset($this->command['sourcemode']) and in_array($this->command['sourcemode'], array('table', 'array', 'tableau'))) { if (is_array($a = $src) or is_string($a) and $a = str_replace('"', '"', $a) and is_array($a = @unserialize($a))) { $this->tableau = $a; } } else { if (preg_match(',^https?://,', $src)) { include_spip('inc/distant'); $u = recuperer_page($src, false, false, _DATA_SOURCE_MAX_SIZE); if (!$u) { throw new Exception("404"); } if (!isset($ttl)) { $ttl = 24 * 3600; } } else { if (@is_dir($src)) { $u = $src; if (!isset($ttl)) { $ttl = 10; } } else { if (@is_readable($src) && @is_file($src)) { $u = spip_file_get_contents($src); if (!isset($ttl)) { $ttl = 10; } } else { $u = $src; if (!isset($ttl)) { $ttl = 10; } } } } if (!$this->err and $g = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)) { $args = $this->command['source']; $args[0] = $u; if (is_array($a = call_user_func_array($g, $args))) { $this->tableau = $a; } } } if (!is_array($this->tableau)) { $this->err = true; } if (!$this->err and isset($ttl) and $ttl > 0) { $this->cache_set($cle, $ttl); } } catch (Exception $e) { $e = $e->getMessage(); $err = sprintf("[%s, %s] {$e}", $src, $this->command['sourcemode']); erreur_squelette(array($err, array())); $this->err = true; } } # en cas d'erreur, utiliser le cache si encore dispo if ($this->err and $cache) { $this->tableau = $cache['data']; $this->err = false; } }
/** * Calcule et retourne le code PHP retourné par l'exécution d'une balise * dynamique. * * Vérifier les arguments et filtres et calcule le code PHP à inclure. * * - charge le fichier PHP de la balise dynamique dans le répertoire * `balise/`, soit du nom complet de la balise, soit d'un nom générique * (comme 'formulaire_.php'). Dans ce dernier cas, le nom de la balise * est ajouté en premier argument. * - appelle une éventuelle fonction de traitement des arguments `balise_NOM_stat()` * - crée le code PHP de la balise si une fonction `balise_NOM_dyn()` (ou variantes) * est effectivement trouvée. * * @uses synthetiser_balise_dynamique() * Pour calculer le code PHP d'inclusion produit * * @param string $nom * Nom de la balise dynamique * @param array $args * Liste des arguments calculés de la balise * @param array $context_compil * Tableau d'informations sur la compilation * @return string * Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique **/ function executer_balise_dynamique($nom, $args, $context_compil) { $nomfonction = $nom; $nomfonction_generique = ""; // Calculer un nom générique (ie. 'formulaire_' dans 'formulaire_editer_article') if (false !== ($p = strpos($nom, "_"))) { $nomfonction_generique = substr($nom, 0, $p + 1); } if (!($fonction_balise = charger_fonction($nomfonction, 'balise', true))) { if ($nomfonction_generique and $fonction_balise = charger_fonction($nomfonction_generique, 'balise', true)) { // et injecter en premier arg le nom de la balise array_unshift($args, $nom); $nomfonction = $nomfonction_generique; } } if (!$fonction_balise) { $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom)); erreur_squelette($msg, $context_compil); return ''; } // retrouver le fichier qui a déclaré la fonction // même si la fonction dynamique est déclarée dans un fichier de fonctions. // Attention sous windows, getFileName() retourne un antislash. $reflector = new ReflectionFunction($fonction_balise); $file = str_replace('\\', '/', $reflector->getFileName()); if (strncmp($file, str_replace('\\', '/', _ROOT_RACINE), strlen(_ROOT_RACINE)) === 0) { $file = substr($file, strlen(_ROOT_RACINE)); } // Y a-t-il une fonction de traitement des arguments ? $f = 'balise_' . $nomfonction . '_stat'; $r = !function_exists($f) ? $args : $f($args, $context_compil); if (!is_array($r)) { return $r; } // verifier que la fonction dyn est la, // sinon se replier sur la generique si elle existe if (!function_exists('balise_' . $nomfonction . '_dyn')) { if ($nomfonction_generique and $file = include_spip("balise/" . strtolower($nomfonction_generique)) and function_exists('balise_' . $nomfonction_generique . '_dyn')) { // et lui injecter en premier arg le nom de la balise array_unshift($r, $nom); $nomfonction = $nomfonction_generique; if (!_DIR_RESTREINT) { $file = _DIR_RESTREINT_ABS . $file; } } else { $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom)); erreur_squelette($msg, $context_compil); return ''; } } return synthetiser_balise_dynamique($nomfonction, $r, $file, $context_compil); }
function public_parametrer_dist($fond, $contexte = '', $cache = '', $connect = '') { static $composer, $styliser, $notes = null; $page = tester_redirection($fond, $contexte, $connect); if ($page) { return $page; } if (isset($contexte['lang'])) { $lang = $contexte['lang']; } elseif (!isset($lang)) { $lang = $GLOBALS['meta']['langue_site']; } $select = ((!isset($GLOBALS['forcer_lang']) or !$GLOBALS['forcer_lang']) and $lang != $GLOBALS['spip_lang']); if ($select) { $select = lang_select($lang); } $debug = defined('_VAR_MODE') && _VAR_MODE == 'debug'; if (!$styliser) { $styliser = charger_fonction('styliser', 'public'); } list($skel, $mime_type, $gram, $sourcefile) = $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect); if ($skel) { // sauver le nom de l'eventuel squelette en cours d'execution // (recursion possible a cause des modeles) if ($debug) { $courant = @$GLOBALS['debug_objets']['courant']; $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte; } // charger le squelette en specifiant les langages cibles et source // au cas il faudrait le compiler (source posterieure au resultat) if (!$composer) { $composer = charger_fonction('composer', 'public'); } $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect); } else { $fonc = ''; } if (!$fonc) { // squelette inconnu (==='') ou faux (===false) $page = $fonc; } else { // Preparer l'appel de la fonction principale du squelette spip_timer($a = 'calcul page ' . rand(0, 1000)); // On cree un marqueur de notes unique lie a cette composition // et on enregistre l'etat courant des globales de notes... if (is_null($notes)) { $notes = charger_fonction('notes', 'inc', true); } if ($notes) { $notes('', 'empiler'); } // Rajouter d'office ces deux parametres // (mais vaudrait mieux que le compilateur sache le simuler // car ca interdit l'usage de criteres conditionnels dessus). if (!isset($contexte['date'])) { $contexte['date'] = date("Y-m-d H:i:s"); $contexte['date_default'] = true; } else { $contexte['date'] = normaliser_date($contexte['date'], true); } if (!isset($contexte['date_redac'])) { $contexte['date_redac'] = date("Y-m-d H:i:s"); $contexte['date_redac_default'] = true; } else { $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true); } // Passer le nom du cache pour produire sa destruction automatique $page = $fonc(array('cache' => $cache), array($contexte)); // Restituer les globales de notes telles qu'elles etaient avant l'appel // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent* // etre dans son resultat, autrement elles ne seraient pas prises en // compte a chaque calcul d'un texte contenant un modele, mais seulement // quand le modele serait calcule, et on aurait des resultats incoherents) if ($notes) { $notes('', 'depiler'); } // reinjecter en dynamique la pile des notes // si il y a des inclure dynamiques // si la pile n'est pas vide // la generalisation de cette injection permettrait de corriger le point juste au dessus // en faisant remonter les notes a l'incluant (A tester et valider avant application) if ($notes) { $page['notes'] = $notes('', 'sauver_etat'); } // spip_log: un joli contexte $infos = array(); foreach (array_filter($contexte) as $var => $val) { if (is_array($val)) { $val = serialize($val); } if (strlen("{$val}") > 30) { $val = substr("{$val}", 0, 27) . '..'; } if (strstr($val, ' ')) { $val = "'{$val}'"; } $infos[] = $var . '=' . $val; } $profile = spip_timer($a); spip_log("calcul ({$profile}) [{$skel}] " . join(', ', $infos) . ' (' . strlen($page['texte']) . ' octets)'); if (defined('_CALCUL_PROFILER') and intval($profile) > _CALCUL_PROFILER) { spip_log("calcul ({$profile}) [{$skel}] " . join(', ', $infos) . ' (' . strlen($page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI'], "profiler" . _LOG_AVERTISSEMENT); } if ($debug) { // si c'est ce que demande le debusqueur, lui passer la main $t = strlen($page['texte']) ? $page['texte'] : " "; $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t; $GLOBALS['debug_objets']['courant'] = $courant; $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile; if ($GLOBALS['debug_objets']['sourcefile'] and _request('var_mode_objet') == $fonc and _request('var_mode_affiche') == 'resultat') { erreur_squelette(); } } // Si #CACHE{} n'etait pas la, le mettre a $delais if (!isset($page['entetes']['X-Spip-Cache'])) { // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut // si aucun #CACHE{} spécifié // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme // entre public et prive if (test_espace_prive() or strncmp($fond, 'modeles/', 8) == 0) { $page['entetes']['X-Spip-Cache'] = 0; } else { $page['entetes']['X-Spip-Cache'] = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : 36000; } } $page['contexte'] = $contexte; // faire remonter le fichier source static $js_inclus = false; if (defined('_VAR_INCLURE') and _VAR_INCLURE) { $page['sourcefile'] = $sourcefile; $page['texte'] = "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . "</h6>" . $page['texte'] . "</div>" . ($js_inclus ? "" : "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>"); $js_inclus = true; } // Si un modele contenait #SESSION, on note l'info dans $page if (isset($GLOBALS['cache_utilise_session'])) { $page['invalideurs']['session'] = $GLOBALS['cache_utilise_session']; unset($GLOBALS['cache_utilise_session']); } } if ($select) { lang_select(); } return $page; }
/** * Calcule un squelette avec un contexte et retourne son contenu * * La fonction de base de SPIP : un squelette + un contexte => une page. * $fond peut etre un nom de squelette, ou une liste de squelette au format array. * Dans ce dernier cas, les squelettes sont tous evalues et mis bout a bout * $options permet de selectionner les options suivantes : * * - trim => true (valeur par defaut) permet de ne rien renvoyer si le fond ne produit que des espaces ; * - raw => true permet de recuperer la strucure $page complete avec entetes et invalideurs * pour chaque $fond fourni. * * @api * @param string/array $fond * - Le ou les squelettes à utiliser, sans l'extension, {@example prive/liste/auteurs} * - Le fichier sera retrouvé dans la liste des chemins connus de SPIP (squelettes, plugins, spip) * @param array $contexte * - Informations de contexte envoyées au squelette, {@example array('id_rubrique' => 8)} * - La langue est transmise automatiquement (sauf option étoile). * @param array $options * Options complémentaires : * * - trim : applique un trim sur le résultat (true par défaut) * - raw : retourne un tableau d'information sur le squelette (false par défaut) * - etoile : ne pas transmettre la langue au contexte automatiquement (false par défaut), * équivalent de INCLURE* * - ajax : gere les liens internes du squelette en ajax (équivalent du paramètre {ajax}) * @param string $connect * Non du connecteur de bdd a utiliser * @return string|array * - Contenu du squelette calculé * - ou tableau d'information sur le squelette. */ function recuperer_fond($fond, $contexte = array(), $options = array(), $connect = '') { if (!function_exists('evaluer_fond')) { include_spip('public/assembler'); } // assurer la compat avec l'ancienne syntaxe // (trim etait le 3eme argument, par defaut a true) if (!is_array($options)) { $options = array('trim' => $options); } if (!isset($options['trim'])) { $options['trim'] = true; } if (isset($contexte['connect'])) { $connect = $connect ? $connect : $contexte['connect']; unset($contexte['connect']); } $texte = ""; $pages = array(); $lang_select = ''; if (!isset($options['etoile']) or !$options['etoile']) { // Si on a inclus sans fixer le critere de lang, on prend la langue courante if (!isset($contexte['lang'])) { $contexte['lang'] = $GLOBALS['spip_lang']; } if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) { $lang_select = lang_select($contexte['lang']); } } if (!isset($GLOBALS['_INC_PUBLIC'])) { $GLOBALS['_INC_PUBLIC'] = 0; } $GLOBALS['_INC_PUBLIC']++; foreach (is_array($fond) ? $fond : array($fond) as $f) { $page = evaluer_fond($f, $contexte, $connect); if ($page === '') { $c = isset($options['compil']) ? $options['compil'] : ''; $a = array('fichier' => $fond); $erreur = _T('info_erreur_squelette2', $a); // squelette introuvable erreur_squelette($erreur, $c); // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 $page = array('texte' => '', 'erreur' => $erreur); } $page = pipeline('recuperer_fond', array('args' => array('fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect), 'data' => $page)); if (isset($options['ajax']) and $options['ajax']) { if (!function_exists('encoder_contexte_ajax')) { include_spip('inc/filtres'); } $page['texte'] = encoder_contexte_ajax(array_merge($contexte, array('fond' => $f)), '', $page['texte'], $options['ajax']); } if (isset($options['raw']) and $options['raw']) { $pages[] = $page; } else { $texte .= $options['trim'] ? rtrim($page['texte']) : $page['texte']; } } $GLOBALS['_INC_PUBLIC']--; if ($lang_select) { lang_select(); } if (isset($options['raw']) and $options['raw']) { return is_array($fond) ? $pages : reset($pages); } else { return $options['trim'] ? ltrim($texte) : $texte; } }
include_spip('action/converser'); action_converser_post($GLOBALS['visiteur_session']['lang'],true); } // Passer la main aux outils XML a la demande (meme les redac s'ils veulent). // mais seulement si on a bien ete auhentifie if ($var_f = _request('transformer_xml')) { set_request('var_url', $exec); $exec = $var_f; } if ($var_f = tester_url_ecrire($exec)) { $var_f = charger_fonction ($var_f); $var_f(); // at last } else { // Rien de connu: rerouter vers exec=404 au lieu d'echouer // ce qui permet de laisser la main a un plugin $var_f = charger_fonction('404'); $var_f($exec); } $debug = ((_request('var_mode') == 'debug') OR !empty($tableau_des_temps)) ? array(1) : array(); if ($debug) { $var_mode_affiche = _request('var_mode_affiche'); $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche== 'validation' ? $page['texte'] :""); echo erreur_squelette(); } ?>