Exemple #1
0
/**
 * Trouver le fond pour embarquer un document avec un mime_type donne
 * text_html
 * => modeles/text_html.html si il existe,
 * => modeles/text.html sinon
 * 
 * @param  $mime_type
 * @return mixed
 */
function trouver_modele_mime($mime_type)
{
    $fond = preg_replace(',\\W,', '_', $mime_type);
    if (trouve_modele($fond)) {
        return $fond;
    } else {
        return preg_replace(',\\W.*$,', '', $mime_type);
    }
}
/**
 * Trouver le fond pour embarquer un document
 * - avec une extension
 * - avec un mime_type donne
 *
 * => modeles/emb_html.html si il existe
 * => modeles/text_html.html si il existe,
 * => modeles/text.html sinon
 *
 * @param  $extension
 * @param  $mime_type
 * @return mixed
 */
function trouver_modele_emb($extension, $mime_type)
{
    if ($extension and trouve_modele($fond = "emb_" . $extension)) {
        return $fond;
    }
    $fond = preg_replace(',\\W,', '_', $mime_type);
    if (trouve_modele($fond)) {
        return $fond;
    } else {
        return preg_replace(',\\W.*$,', '', $mime_type);
    }
}
/**
 * Calcule le modele et retourne la mini-page ainsi calculee
 *
 * http://code.spip.net/@inclure_modele
 *
 * @param $type string Nom du modele
 * @param $id int
 * @param $params array Paramètres du modèle
 * @param $lien array Informations du lien entourant l'appel du modèle en base de données
 * @param $connect string
 * @param $env array
 * @staticvar string $compteur
 * @return string
 */
function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array())
{
    static $compteur;
    if (++$compteur > 10) {
        return '';
    }
    # ne pas boucler indefiniment
    $type = strtolower($type);
    $fond = $class = '';
    $params = array_filter(explode('|', $params));
    if ($params) {
        list(, $soustype) = each($params);
        $soustype = strtolower(trim($soustype));
        if (in_array($soustype, array('left', 'right', 'center', 'ajax'))) {
            list(, $soustype) = each($params);
            $soustype = strtolower($soustype);
        }
        if (preg_match(',^[a-z0-9_]+$,', $soustype)) {
            if (!trouve_modele($fond = $type . '_' . $soustype)) {
                $fond = '';
                $class = $soustype;
            }
            // enlever le sous type des params
            $params = array_diff($params, array($soustype));
        }
    }
    // Si ca marche pas en precisant le sous-type, prendre le type
    if (!$fond and !trouve_modele($fond = $type)) {
        spip_log("Modele {$type} introuvable", _LOG_INFO_IMPORTANTE);
        return false;
    }
    $fond = 'modeles/' . $fond;
    // Creer le contexte
    $contexte = $env;
    $contexte['dir_racine'] = _DIR_RACINE;
    # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte
    // Le numero du modele est mis dans l'environnement
    // d'une part sous l'identifiant "id"
    // et d'autre part sous l'identifiant de la cle primaire
    // par la fonction id_table_objet,
    // (<article1> =>> article =>> id_article =>> id_article=1)
    $_id = id_table_objet($type);
    $contexte['id'] = $contexte[$_id] = $id;
    if (isset($class)) {
        $contexte['class'] = $class;
    }
    // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url]
    if ($lien) {
        # un eventuel guillemet (") sera reechappe par #ENV
        $contexte['lien'] = str_replace("&quot;", '"', $lien['href']);
        $contexte['lien_class'] = $lien['class'];
        $contexte['lien_mime'] = $lien['mime'];
        $contexte['lien_title'] = $lien['title'];
        $contexte['lien_hreflang'] = $lien['hreflang'];
    }
    // Traiter les parametres
    // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en>
    $arg_list = creer_contexte_de_modele($params);
    $contexte['args'] = $arg_list;
    // on passe la liste des arguments du modeles dans une variable args
    $contexte = array_merge($contexte, $arg_list);
    // Appliquer le modele avec le contexte
    $retour = recuperer_fond($fond, $contexte, array(), $connect);
    // Regarder si le modele tient compte des liens (il *doit* alors indiquer
    // spip_lien_ok dans les classes de son conteneur de premier niveau ;
    // sinon, s'il y a un lien, on l'ajoute classiquement
    if (strstr(' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', 'spip_lien_ok')) {
        $retour = inserer_attribut($retour, 'class', trim(str_replace(' spip_lien_ok ', ' ', " {$classes} ")));
    } else {
        if ($lien) {
            $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . "</a>";
        }
    }
    $compteur--;
    return (isset($arg_list['ajax']) and $arg_list['ajax'] == 'ajax') ? encoder_contexte_ajax($contexte, '', $retour) : $retour;
}
Exemple #4
0
function balise_FOREACH_dist($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 trouve_modele($__modele)) ?
			$__modele :
			($_modele ? $_modele : 'foreach');

		// on passe a la balise seulement les parametres
		// mais on enleve les 2 deja utilise
		// [(#FOREACH{CONFIG,'',suivants}|filtre)]
		$p->param[0] = array_merge(array(""),array_slice($p->param[0],3));
		$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 {
		$msg = array('zbug_balise_inexistante',array('from'=>'#FOREACH','balise'=>$_tableau));
		erreur_squelette($msg, $p);
	}
	return $p;
}