Пример #1
0
/**
 * 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;
}
Пример #2
0
function recuperer_fond($fond, $contexte=array(), $options = array(), $connect='') {
	include_spip('public/assembler');
	// assurer la compat avec l'ancienne syntaxe
	// (trim etait le 3eme argument, par defaut a true)
	if (!is_array($options)) $options = array('trim'=>$options);
	if (!isset($options['trim'])) $options['trim']=true;

	if (isset($contexte['connect'])){
		$connect = ($connect ? $connect : $contexte['connect']);
		unset($contexte['connect']);
	}

	if (isset($options['modele']))
		$contexte = creer_contexte_de_modele($contexte);

	$texte = "";
	$pages = array();
	if (isset($contexte['fond'])
	 // securite anti injection pour permettre aux plugins de faire
	 // des interfaces avec simplement recuperer_fond($fond,$_GET);
	 AND $contexte['fond']!==_request('fond'))
		$fond = $contexte['fond'];

	$lang_select = '';
	if (!isset($options['etoile']) OR !$options['etoile']){
		// Si on a inclus sans fixer le critere de lang, on prend la langue courante
		if (!isset($contexte['lang']))
			$contexte['lang'] = $GLOBALS['spip_lang'];

		if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) {
			$lang_select = lang_select($contexte['lang']);
		}
	}

	@$GLOBALS['_INC_PUBLIC']++;

	foreach(is_array($fond) ? $fond : array($fond) as $f){
		$page = evaluer_fond($f, $contexte, $connect);
		if ($page === '') {
			$c = isset($options['compil']) ? $options['compil'] :'';
			$a = array('fichier'=>$fond.'.'._EXTENSION_SQUELETTES);
			$erreur = _T('info_erreur_squelette2', $a); // squelette introuvable
			erreur_squelette($erreur, $c);
			// eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4
			$page = array('texte' => '', 'erreur' => $erreur);
		}

		if (isset($options['ajax'])AND $options['ajax']){
			include_spip('inc/filtres');
			$page['texte'] = encoder_contexte_ajax(array_merge($contexte,array('fond'=>$f)),'',$page['texte']);
		}

		$page = pipeline('recuperer_fond',array(
			'args'=>array('fond'=>$fond,'contexte'=>$contexte,'options'=>$options,'connect'=>$connect),
			'data'=>$page
		));
		if (isset($options['raw']) AND $options['raw'])
			$pages[] = $page;
		else
			$texte .= $options['trim'] ? rtrim($page['texte']) : $page['texte'];
	}

	$GLOBALS['_INC_PUBLIC']--;

	if ($lang_select) lang_select();
	if (isset($options['raw']) AND $options['raw'])
		return is_array($fond)?$pages:reset($pages);
	else
		return $options['trim'] ? ltrim($texte) : $texte;
}