X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fecrire%2Finc%2Fmodifier.php;fp=www%2Fecrire%2Finc%2Fmodifier.php;h=cca62aeab1a591b58d428ed07dc3601135a1b9af;hb=a33c2ba9d919664b3bb0f565f8e9a8b9d8530cdb;hp=0000000000000000000000000000000000000000;hpb=8945248b3d948385798d9aa355c70e7089aca2b3;p=lhc%2Fweb%2Fclavette_www.git diff --git a/www/ecrire/inc/modifier.php b/www/ecrire/inc/modifier.php new file mode 100644 index 0000000..cca62ae --- /dev/null +++ b/www/ecrire/inc/modifier.php @@ -0,0 +1,318 @@ + $sinon) { + if ($c[$champ] === '') { + $c[$champ] = $sinon; + } + } + } + + + // N'accepter que les champs qui existent + // TODO: ici aussi on peut valider les contenus + // en fonction du type + $champs = array(); + foreach($desc['field'] as $champ => $ignore) + if (isset($c[$champ])) + $champs[$champ] = $c[$champ]; + + // Nettoyer les valeurs + $champs = array_map('corriger_caracteres', $champs); + + // Envoyer aux plugins + $champs = pipeline('pre_edition', + array( + 'args' => array( + 'table' => $spip_table_objet, // compatibilite + 'table_objet' => $table_objet, + 'spip_table_objet' => $spip_table_objet, + 'type' =>$objet, + 'id_objet' => $id_objet, + 'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] c'est quoi ? + 'serveur' => $serveur, + 'action' => 'modifier' + ), + 'data' => $champs + ) + ); + + if (!$champs) return false; + + + // marquer le fait que l'objet est travaille par toto a telle date + if ($GLOBALS['meta']['articles_modif'] != 'non') { + include_spip('inc/drapeau_edition'); + signale_edition ($id_objet, $GLOBALS['visiteur_session'], $objet); + } + + // Verifier si les mises a jour sont pertinentes, datees, en conflit etc + include_spip('inc/editer'); + $conflits = controler_md5($champs, $_POST, $objet, $id_objet, $serveur); + // cas hypothetique : normalement inc/editer verifie en amont le conflit edition + // et gere l'interface + // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme + if ($conflits) + return _T('titre_conflit_edition'); + + if ($champs) { + // cas particulier de la langue : passer par instituer_langue_objet + if (isset($champs['lang'])){ + if ($changer_lang=$champs['lang']){ + $id_rubrique = 0; + if ($desc['field']['id_rubrique']){ + $parent = ($objet=='rubrique')?'id_parent':'id_rubrique'; + $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet)); + } + $instituer_langue_objet = charger_fonction('instituer_langue_objet','action'); + $champs['lang'] = $instituer_langue_objet($objet,$id_objet, $id_rubrique, $changer_lang); + } + // on laisse 'lang' dans $champs, + // ca permet de passer dans le pipeline post_edition et de journaliser + // et ca ne gene pas qu'on refasse un sql_updateq dessus apres l'avoir + // deja pris en compte + } + + // la modif peut avoir lieu + + // faut-il ajouter date_modif ? + if (isset($options['date_modif']) AND $options['date_modif'] + AND !isset($champs[$options['date_modif']])) + $champs[$options['date_modif']] = date('Y-m-d H:i:s'); + + // allez on commit la modif + sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), $serveur); + + // on verifie si elle est bien passee + $moof = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=".intval($id_objet), array(), array(), '', array(), $serveur); + // si difference entre les champs, reperer les champs mal enregistres + if ($moof != $champs) { + $liste = array(); + foreach($moof as $k=>$v) + if ($v !== $champs[$k] + // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes + AND (!is_numeric($v) OR intval($v)!=intval($champs[$k])) + ) { + $liste[] = $k; + $conflits[$k]['post'] = $champs[$k]; + $conflits[$k]['save'] = $v; + } + // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur + // c'est un cas exceptionnel + if (count($liste)){ + spip_log("Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits,true),'modifier.'._LOG_CRITIQUE); + return _T('erreur_technique_enregistrement_champs',array('champs'=>"'".implode("','",$liste)."'")); + } + } + + // Invalider les caches + if (isset($options['invalideur']) and $options['invalideur']) { + include_spip('inc/invalideur'); + if (is_array($options['invalideur'])) + array_map('suivre_invalideur',$options['invalideur']); + else + suivre_invalideur($options['invalideur']); + } + + // Notifications, gestion des revisions... + // en standard, appelle |nouvelle_revision ci-dessous + pipeline('post_edition', + array( + 'args' => array( + 'table' => $spip_table_objet, + 'table_objet' => $table_objet, + 'spip_table_objet' => $spip_table_objet, + 'type' =>$objet, + 'id_objet' => $id_objet, + 'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] kesako ? + 'serveur' => $serveur, + 'action' => 'modifier' + ), + 'data' => $champs + ) + ); + } + + // journaliser l'affaire + // message a affiner :-) + include_spip('inc/filtres_mini'); + $qui = ((isset($GLOBALS['visiteur_session']['nom']) AND $GLOBALS['visiteur_session']['nom'])?$GLOBALS['visiteur_session']['nom']:$GLOBALS['ip']); + journal(_L($qui.' a édité l’'.$objet.' '.$id_objet.' ('.join('+',array_diff(array_keys($champs), array('date_modif'))).')'), array( + 'faire' => 'modifier', + 'quoi' => $objet, + 'id' => $id_objet + )); + + return ''; +} + +/** + * Modifie un contenu + * + * Dépreciée : + * Fonction générique pour l'API de modification de contenu + * + * @deprecated + * @param string $type + * Type d'objet + * @param int $id + * Identifiant de l'objet + * @param array $options + * Toutes les options + * @param array|null $c + * Couples champ/valeur à modifier + * @param string $serveur + * Nom du connecteur à la base de données + * @return bool + * true si quelque chose est modifié correctement + * false sinon (erreur ou aucun champ modifié) + */ +function modifier_contenu($type, $id, $options, $c=null, $serveur='') { + $res = objet_modifier_champs($type, $id, $options, $c, $serveur); + return ($res===''?true:false); +} + +/** + * Crée une modification d'un objet + * + * Wrapper pour remplacer tous les obsoletes revision_xxx + * + * @deprecated + * Utiliser objet_modifier(); + * @see objet_modifier(); + * + * @param string $objet + * Nom de l'objet + * @param int $id_objet + * Identifiant de l'objet + * @param array $c + * Couples des champs/valeurs modifiées + * @return mixed|string + */ +function revision_objet($objet,$id_objet,$c=null){ + $objet = objet_type($objet); // securite + include_spip('action/editer_objet'); + return objet_modifier($objet,$id_objet,$c); +} + + +?>