Beispiel #1
0
function &Crayons_affichage_final(&$page) {

	// ne pas se fatiguer si le visiteur n'a aucun droit
	if (!(function_exists('analyse_droits_rapide')?analyse_droits_rapide():analyse_droits_rapide_dist()))
		return $page;

	// sinon regarder rapidement si la page a des classes crayon
	if (strpos($page, 'crayon')===FALSE)
		return $page;

	// voir un peu plus precisement lesquelles
	include_spip('inc/crayons');
	if (!preg_match_all(_PREG_CRAYON, $page, $regs, PREG_SET_ORDER))
		return $page;
	$wdgcfg = wdgcfg();

	// calculer les droits sur ces crayons
	include_spip('inc/autoriser');
	$droits = array();
	$droits_accordes = 0;
	foreach ($regs as $reg) {
		list(,$crayon,$type,$champ,$id) = $reg;
		if (_DEBUG_CRAYONS) spip_log("autoriser('modifier', $type, $id, NULL, array('champ'=>$champ))","crayons_distant");
		if (autoriser('modifier', $type, $id, NULL, array('champ'=>$champ))) {
			$droits['.' . $crayon]++;
			$droits_accordes ++;
		}
	}
	// et les signaler dans la page
	if ($droits_accordes == count($regs)) // tous les droits
		$page = Crayons_preparer_page($page, '*', $wdgcfg);
	else if ($droits) // seulement certains droits, preciser lesquels
		$page = Crayons_preparer_page($page, join(',',array_keys($droits)), $wdgcfg);

	return $page;
}
function crayons_store($options = array())
{
    // permettre de surcharger les fonctions de recuperation des valeurs
    // et de sauvegardes de celles-ci
    $options = array_merge(array('f_get_valeur' => 'crayons_store_get_valeur', 'f_set_modifs' => 'crayons_store_set_modifs'), $options);
    include_spip('inc/crayons');
    $wdgcfg = wdgcfg();
    $return = array('$erreur' => '');
    $postees = post_crayons();
    $modifs = $updates = array();
    if (!is_array($postees)) {
        $return['$erreur'] = _U('crayons:donnees_mal_formatees');
    } else {
        foreach ($postees as $postee) {
            if ($postee[2] !== false) {
                $name = $postee[0];
                $content = $postee[1];
                if ($content && preg_match(_PREG_CRAYON, 'crayon ' . $name, $regs)) {
                    list(, $crayon, $type, $modele, $id) = $regs;
                    $wid = $postee[3];
                    spip_log("autoriser('crayonner', {$type}, {$id}, NULL, array('modele'=>{$modele})", "crayons_distant");
                    if (!autoriser('crayonner', $type, $id, NULL, array('modele' => $modele))) {
                        $return['$erreur'] = "{$type} {$id}: " . _U('crayons:non_autorise');
                    } else {
                        // recuperer l'existant pour calculer son md5 et verifier
                        // qu'il n'a pas ete modifie entre-temps
                        $get_valeur = $options['f_get_valeur'];
                        $data = $get_valeur($content, $regs);
                        $md5 = md5(serialize($data));
                        // est-ce que le champ a ete modifie dans la base entre-temps ?
                        if ($md5 != $postee[2]) {
                            // si oui, la modif demandee correspond peut-etre
                            // a la nouvelle valeur ? dans ce cas on procede
                            // comme si "pas de modification", sinon erreur
                            if ($md5 != md5(serialize($content))) {
                                $return['$erreur'] = "{$type} {$id} {$modele}: " . _U('crayons:modifie_par_ailleurs');
                            }
                        }
                        $modifs[] = array($type, $modele, $id, $content, $wid);
                        /* aiguillage pour verification de la saisie
                        			Pour traitement ulterieur les fonctions de verifications doivent renvoyer $invalides :
                        			 $invalides[wid_champ]['msg'] -> message de saisie invalide
                        			 $invalides[wid_champ]['retour'] -> caracteres invalides */
                        $f = 'verifier_' . $type . '_' . $modele;
                        if (function_exists($f)) {
                            if (count($invalides = $f($modifs))) {
                                $return['$invalides'] = $invalides;
                            }
                        }
                    }
                }
            }
        }
    }
    if (!$modifs and !$return['$erreur']) {
        $return['$erreur'] = $wdgcfg['msgNoChange'] ? _U('crayons:pas_de_modification') : ' ';
        $return['$annuler'] = true;
    }
    // un champ invalide ... ou rien ==> on ne fait rien !
    if (isset($return['$invalides']) && $return['$invalides']) {
        return $return;
    }
    // une quelconque erreur ... ou rien ==> on ne fait rien !
    if (isset($return['$erreur']) && $return['$erreur']) {
        return $return;
    }
    // on traite toutes les modifications
    // en appelant la fonction adequate de traitement
    $set_modifs = $options['f_set_modifs'];
    $return = $set_modifs($modifs, $return);
    // une quelconque erreur ... ou rien ==> on ne fait rien !
    if ($return['$erreur']) {
        return $return;
    }
    // et maintenant refaire l'affichage des crayons modifies
    include_spip('inc/texte');
    foreach ($modifs as $m) {
        list($type, $modele, $id, $content, $wid) = $m;
        $f = charger_fonction($type . '_' . $modele, 'vues', true) or $f = charger_fonction($modele, 'vues', true) or $f = charger_fonction($type, 'vues', true) or $f = 'vues_dist';
        $return[$wid] = $f($type, $modele, $id, $content, $wid);
    }
    return $return;
}