/** * 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?'." . "'>'"; }
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?'." . "'>'"; }
/** * 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; }
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; }