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; }