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); }
/** * 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); }