示例#1
0
/**
 * Calcule un squelette avec un contexte et retourne son contenu
 *
 * La fonction de base de SPIP : un squelette + un contexte => une page.
 * $fond peut etre un nom de squelette, ou une liste de squelette au format array.
 * Dans ce dernier cas, les squelettes sont tous evalues et mis bout a bout
 * $options permet de selectionner les options suivantes :
 *
 * - trim => true (valeur par defaut) permet de ne rien renvoyer si le fond ne produit que des espaces ;
 * - raw  => true permet de recuperer la strucure $page complete avec entetes et invalideurs
 *          pour chaque $fond fourni.
 *
 * @api
 * @param string/array $fond
 *     - Le ou les squelettes à utiliser, sans l'extension, {@example prive/liste/auteurs}
 *     - Le fichier sera retrouvé dans la liste des chemins connus de SPIP (squelettes, plugins, spip)
 * @param array $contexte
 *     - Informations de contexte envoyées au squelette, {@example array('id_rubrique' => 8)}
 *     - La langue est transmise automatiquement (sauf option étoile).
 * @param array $options
 *     Options complémentaires :
 *
 *     - trim   : applique un trim sur le résultat (true par défaut)
 *     - raw    : retourne un tableau d'information sur le squelette (false par défaut)
 *     - etoile : ne pas transmettre la langue au contexte automatiquement (false par défaut),
 *                équivalent de INCLURE*
 *     - ajax   : gere les liens internes du squelette en ajax (équivalent du paramètre {ajax})
 * @param string $connect
 *     Non du connecteur de bdd a utiliser
 * @return string|array
 *     - Contenu du squelette calculé
 *     - ou tableau d'information sur le squelette.
 */
function recuperer_fond($fond, $contexte = array(), $options = array(), $connect = '')
{
    if (!function_exists('evaluer_fond')) {
        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']);
    }
    $texte = "";
    $pages = array();
    $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']);
        }
    }
    if (!isset($GLOBALS['_INC_PUBLIC'])) {
        $GLOBALS['_INC_PUBLIC'] = 0;
    }
    $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);
            $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);
        }
        $page = pipeline('recuperer_fond', array('args' => array('fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect), 'data' => $page));
        if (isset($options['ajax']) and $options['ajax']) {
            if (!function_exists('encoder_contexte_ajax')) {
                include_spip('inc/filtres');
            }
            $page['texte'] = encoder_contexte_ajax(array_merge($contexte, array('fond' => $f)), '', $page['texte'], $options['ajax']);
        }
        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;
    }
}
示例#2
0
/**
 * Sauvegarder les valeurs postees dans une variable encodee
 * pour les recuperer a la prochaine etape
 *  
 * @param string $form
 * @param bool $je_suis_poste
 * @param array $valeurs
 * @return array
 */
function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs)
{
    if (!isset($valeurs['_cvtm_prev_post'])) {
        $post = array('_etape' => $valeurs['_etape'], '_etapes' => $valeurs['_etapes']);
        foreach (array_keys($valeurs) as $champ) {
            if (substr($champ, 0, 1) !== '_') {
                if ($je_suis_poste || isset($valeurs['_forcer_request']) && $valeurs['_forcer_request']) {
                    if (($v = _request($champ)) !== NULL) {
                        $post[$champ] = $v;
                    }
                }
            }
        }
        include_spip('inc/filtres');
        $c = encoder_contexte_ajax($post, $form);
        if (!isset($valeurs['_hidden'])) {
            $valeurs['_hidden'] = '';
        }
        $valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='{$c}' />";
        // marquer comme fait, pour eviter double encodage (unipotence)
        $valeurs['_cvtm_prev_post'] = true;
    }
    return $valeurs;
}
示例#3
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;
}
示例#4
0
文件: formulaire_.php 项目: JLuc/SPIP
/**
 * Calcule le contexte à envoyer dans le squelette d'un formulaire 
 *
 * @param string $form
 *     Nom du formulaire
 * @param array $args
 *     Arguments envoyés à l'appel du formulaire
 * @return array
 *     Contexte d'environnement à envoyer au squelette
**/
function balise_FORMULAIRE__contexte($form, $args)
{
    // tester si ce formulaire vient d'etre poste (memes arguments)
    // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page
    // si poste, on recupere les erreurs
    $je_suis_poste = false;
    if ($post_form = _request('formulaire_action') and $post_form == $form and $p = _request('formulaire_action_args') and is_array($p = decoder_contexte_ajax($p, $post_form))) {
        // enlever le faux attribut de langue masque
        array_shift($p);
        if (formulaire__identifier($form, $args, $p)) {
            $je_suis_poste = true;
        }
    }
    $editable = true;
    $erreurs = $post = array();
    if ($je_suis_poste) {
        $post = traiter_formulaires_dynamiques(true);
        $e = "erreurs_{$form}";
        $erreurs = isset($post[$e]) ? $post[$e] : array();
        $editable = "editable_{$form}";
        $editable = !isset($post[$e]) || count($erreurs) || isset($post[$editable]) && $post[$editable];
    }
    $valeurs = formulaire__charger($form, $args, $je_suis_poste);
    // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable
    // C'est plus fort qu'editable qui est gere par le squelette
    // Idealement $valeur doit etre alors un message explicatif.
    if (!is_array($valeurs)) {
        return is_string($valeurs) ? $valeurs : '';
    }
    // charger peut passer une action si le formulaire ne tourne pas sur self()
    // ou une action vide si elle ne sert pas
    $action = isset($valeurs['action']) ? $valeurs['action'] : self('&amp;', true);
    // bug IEx : si action finit par /
    // IE croit que le <form ... action=../ > est autoferme
    if (substr($action, -1) == '/') {
        // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un /
        $action .= '#';
    }
    // recuperer la saisie en cours si erreurs
    // seulement si c'est ce formulaire qui est poste
    // ou si on le demande explicitement par le parametre _forcer_request = true
    $dispo = $je_suis_poste || isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'];
    foreach (array_keys($valeurs) as $champ) {
        if ($champ[0] !== '_' and !in_array($champ, array('message_ok', 'message_erreur', 'editable'))) {
            if ($dispo and ($v = _request($champ)) !== NULL) {
                $valeurs[$champ] = $v;
            }
            // nettoyer l'url des champs qui vont etre saisis
            if ($action) {
                $action = parametre_url($action, $champ, '');
            }
            // proteger les ' et les " dans les champs que l'on va injecter
            $valeurs[$champ] = protege_champ($valeurs[$champ]);
        }
    }
    if ($action) {
        // nettoyer l'url
        $action = parametre_url($action, 'formulaire_action', '');
        $action = parametre_url($action, 'formulaire_action_args', '');
    }
    if (isset($valeurs['_action'])) {
        $securiser_action = charger_fonction('securiser_action', 'inc');
        $secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1);
        $valeurs['_hidden'] = (isset($valeurs['_hidden']) ? $valeurs['_hidden'] : '') . "<input type='hidden' name='arg' value='" . $secu['arg'] . "' />" . "<input type='hidden' name='hash' value='" . $secu['hash'] . "' />";
    }
    // empiler la lang en tant que premier argument implicite du CVT
    // pour permettre de la restaurer au moment du Verifier et du Traiter
    array_unshift($args, $GLOBALS['spip_lang']);
    $valeurs['formulaire_args'] = encoder_contexte_ajax($args, $form);
    $valeurs['erreurs'] = $erreurs;
    $valeurs['action'] = $action;
    $valeurs['form'] = $form;
    if (!isset($valeurs['id'])) {
        $valeurs['id'] = 'new';
    }
    // editable peut venir de charger() ou de traiter() sinon
    if (!isset($valeurs['editable'])) {
        $valeurs['editable'] = $editable;
    }
    // dans tous les cas, renvoyer un espace ou vide (et pas un booleen)
    $valeurs['editable'] = $valeurs['editable'] ? ' ' : '';
    if ($je_suis_poste) {
        $valeurs['message_erreur'] = "";
        if (isset($erreurs['message_erreur'])) {
            $valeurs['message_erreur'] = $erreurs['message_erreur'];
        }
        $valeurs['message_ok'] = "";
        if (isset($post["message_ok_{$form}"])) {
            $valeurs['message_ok'] = $post["message_ok_{$form}"];
        } elseif (isset($erreurs['message_ok'])) {
            $valeurs['message_ok'] = $erreurs["message_ok"];
        }
    }
    return $valeurs;
}
示例#5
0
文件: utils.php 项目: rhertzog/lcs
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;
}