Exemplo n.º 1
0
/**
 * Compile une inclusion <INCLURE> ou #INCLURE
 *
 * @param Inclure $p
 *     Description de l'inclusion (AST au niveau de l'inclure)
 * @param array $boucles
 *     AST du squelette
 * @param string $id_boucle
 *     Identifiant de la boucle contenant l'inclure
 * @return string
 *     Code PHP appelant l'inclusion
**/
function calculer_inclure($p, &$boucles, $id_boucle)
{
    $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
    if (is_string($p->texte)) {
        $fichier = $p->texte;
        $code = "\"{$fichier}\"";
    } else {
        $code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
        if ($code and preg_match("/^'([^']*)'/s", $code, $r)) {
            $fichier = $r[1];
        } else {
            $fichier = '';
        }
    }
    if (!$code or $code === '""') {
        $erreur_p_i_i = array('zbug_parametres_inclus_incorrects', array('param' => $code));
        erreur_squelette($erreur_p_i_i, $p);
        return false;
    }
    $compil = texte_script(memoriser_contexte_compil($p));
    if (is_array($_contexte)) {
        // Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
        if ($env = isset($_contexte['env']) || isset($_contexte['self'])) {
            unset($_contexte['env']);
        }
        // noter les doublons dans l'appel a public.php
        if (isset($_contexte['doublons'])) {
            $_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
        }
        if ($ajax = isset($_contexte['ajax'])) {
            $ajax = preg_replace(",=>(.*)\$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
            unset($_contexte['ajax']);
        }
        $_contexte = join(",\n\t", $_contexte);
    } else {
        return false;
    }
    // j'aurais voulu toucher le fond ...
    $contexte = 'array(' . $_contexte . ')';
    if ($env) {
        $contexte = "array_merge('.var_export(\$Pile[0],1).',{$contexte})";
    }
    // s'il y a une extension .php, ce n'est pas un squelette
    if (preg_match('/^.+[.]php$/s', $fichier)) {
        $code = sandbox_composer_inclure_php($fichier, $p, $contexte);
    } else {
        $_options[] = "\"compil\"=>array({$compil})";
        if ($ajax) {
            $_options[] = $ajax;
        }
        $code = " ' . argumenter_squelette({$code}) . '";
        $code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options), "_request(\"connect\")") . ';';
    }
    return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
}
Exemplo n.º 2
0
function calculer_inclure($p, &$boucles, $id_boucle){

	$_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true);
	if (is_string($p->texte)){
		$fichier = $p->texte;
		$code = "\"$fichier\"";

	} else {
		$code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle);
		if ($code AND preg_match("/^'([^']*)'/s", $code, $r))
			$fichier = $r[1];
		else $fichier = '';
	}
	if (!$code OR $code==='""'){
		$erreur_p_i_i = array('zbug_parametres_inclus_incorrects',
			array('param' => $code));
		erreur_squelette($erreur_p_i_i, $p);
		return false;
	}
	$compil = texte_script(memoriser_contexte_compil($p));

	if (is_array($_contexte)){
		// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
		if ($env = (isset($_contexte['env']) || isset($_contexte['self']))){
			unset($_contexte['env']);
		}

		// noter les doublons dans l'appel a public.php
		if (isset($_contexte['doublons'])){
			$_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'";
		}

		if ($ajax = isset($_contexte['ajax']))
			unset($_contexte['ajax']);

		$_contexte = join(",\n\t", $_contexte);
	}
	else
		return false; // j'aurais voulu toucher le fond ...

	$contexte = 'array(' . $_contexte . ')';

	if ($env){
		$contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)";
	}

	// s'il y a une extension .php, ce n'est pas un squelette
	if (preg_match('/^.+[.]php$/s', $fichier)){
		// si inexistant, on essaiera a l'execution
		if ($path = find_in_path($fichier))
			$path = "\"$path\"";
		else $path = "find_in_path(\"$fichier\")";

		$code = sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil);
	} else {
		$_options[] = "\"compil\"=>array($compil)";
		if ($ajax)
			$_options[] = "\"ajax\"=>true";
		$code = " ' . argumenter_squelette($code) . '";
		$code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options), "_request(\"connect\")") . ';';
	}

	return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'";
}
Exemplo n.º 3
0
/**
 * Compile la balise `#MODELE` qui inclut un résultat de squelette de modèle
 *
 * `#MODELE{nom}` insère le résultat d’un squelette contenu dans le
 * répertoire `modeles/`. L’identifiant de la boucle parente est transmis
 * par défaut avec le paramètre `id` à cette inclusion.
 *
 * Des arguments supplémentaires peuvent être transmis :
 * `[(#MODELE{nom, argument=xx, argument})]`
 *
 * @balise
 * @see balise_INCLURE_dist()
 * @example
 *     ```
 *     #MODELE{article_traductions}
 *     ```
 *
 * @param Champ $p
 *     Pile au niveau de la balise
 * @return Champ
 *     Pile complétée par le code à générer
 **/
function balise_MODELE_dist($p)
{
    $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);
    // erreur de syntaxe = fond absent
    // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
    if (!$_contexte) {
        $contexte = array();
    }
    if (!isset($_contexte[1])) {
        $msg = array('zbug_balise_sans_argument', array('balise' => ' MODELE'));
        erreur_squelette($msg, $p);
    } else {
        $nom = $_contexte[1];
        unset($_contexte[1]);
        if (preg_match("/^\\s*'[^']*'/s", $nom)) {
            $nom = "'modeles/" . substr($nom, 1);
        } else {
            $nom = "'modeles/' . {$nom}";
        }
        $flag_env = false;
        if (isset($_contexte['env'])) {
            $flag_env = true;
            unset($_contexte['env']);
        }
        // Incoherence dans la syntaxe du contexte. A revoir.
        // Reserver la cle primaire de la boucle courante si elle existe
        if (isset($p->boucles[$p->id_boucle]->primary)) {
            $primary = $p->boucles[$p->id_boucle]->primary;
            if (!strpos($primary, ',')) {
                $id = champ_sql($primary, $p);
                $_contexte[] = "'{$primary}'=>" . $id;
                $_contexte[] = "'id'=>" . $id;
            }
        }
        $_contexte[] = "'recurs'=>(++\$recurs)";
        $connect = '';
        if (isset($p->boucles[$p->id_boucle])) {
            $connect = $p->boucles[$p->id_boucle]->sql_serveur;
        }
        $_options = memoriser_contexte_compil($p);
        $_options = "'compil'=>array({$_options}), 'trim'=>true";
        if (isset($_contexte['ajax'])) {
            $_options .= ", " . preg_replace(",=>(.*)\$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']);
            unset($_contexte['ajax']);
        }
        $_l = 'array(' . join(",\n\t", $_contexte) . ')';
        if ($flag_env) {
            $_l = "array_merge(\$Pile[0],{$_l})";
        }
        $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect));
        $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t{$page})\n";
        $p->interdire_scripts = false;
        // securite assuree par le squelette
    }
    return $p;
}
Exemplo n.º 4
0
function balise_MODELE_dist($p) {

	$_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false);

	// erreur de syntaxe = fond absent
	// (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP
	if (!$_contexte) $contexte = array();

	if (!isset($_contexte[1])) {
		$msg = array('zbug_balise_sans_argument', array('balise' => ' MODELE'));
		erreur_squelette($msg, $p);
	} else {
		$nom = $_contexte[1];
		unset($_contexte[1]);

		if (preg_match("/^\s*'[^']*'/s", $nom))
			$nom = "'modeles/" . substr($nom,1);
		else $nom = "'modeles/' . $nom";

		// Incoherence dans la syntaxe du contexte. A revoir.
		// Reserver la cle primaire de la boucle courante si elle existe
		if (isset($p->boucles[$p->id_boucle]->primary)) {
			$primary = $p->boucles[$p->id_boucle]->primary;
			if (!strpos($primary,',')) {
				$id = champ_sql($primary, $p);
				$_contexte[] = "'$primary'=>".$id;
				$_contexte[] = "'id'=>".$id;
			}
		}
		$_contexte[] = "'recurs'=>(++\$recurs)";
		$connect = '';
		if (isset($p->boucles[$p->id_boucle]))
			$connect = $p->boucles[$p->id_boucle]->sql_serveur;

		$_options = memoriser_contexte_compil($p);
		$_options = "'compil'=>array($_options), 'trim'=>true"
		  . (isset($_contexte['ajax'])?", 'ajax'=>true":'');

		$page = sprintf(CODE_RECUPERER_FOND, $nom, 'array(' . join(',', $_contexte) .')', $_options, _q($connect));

		$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";

		$p->interdire_scripts = false; // securite assuree par le squelette
	}

	return $p;
}