Пример #1
0
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;
}
Пример #2
0
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;
	}
}
Пример #3
0
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;
}
Пример #4
0
/**
 * 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;
}
Пример #5
0
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;
}
Пример #6
0
/**
 * 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;
}
Пример #7
0
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;
}
Пример #9
0
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;
}
Пример #10
0
/**
 * 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;
    }
}
Пример #11
0
/**
 * 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;
}
Пример #12
0
/**
 * {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
}
Пример #13
0
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 '';
    }
}
Пример #15
0
/**
 * 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;
}
Пример #16
0
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 '';
    }
}
Пример #17
0
/**
 * 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;
}
Пример #18
0
/**
 * 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;
}
Пример #19
0
/**
 * 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;
}
Пример #21
0
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);
}
Пример #22
0
/**
 * 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;
}
Пример #23
0
    // 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();
    }
}
Пример #24
0
/**
 * 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;
}
Пример #25
0
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);
}
Пример #26
0
 /**
  * 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('&quot;', '"', $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;
     }
 }
Пример #27
0
/**
 * 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);
}
Пример #28
0
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;
}
Пример #29
0
/**
 * 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;
    }
}
Пример #30
0
  	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();
}
?>