Example #1
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);
}
Example #2
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);
}