X-Git-Url: https://git.cyclocoop.org/?a=blobdiff_plain;f=www%2Fplugins-dist%2Fmedias%2Faction%2Fediter_document.php;h=fd1f7589546340dbae853befba33969342fe75a5;hb=58abc0c37c66f23ea340ce4107246c868a2d5402;hp=6ed20fa041ac653e553e2872c92633dee241d930;hpb=0ba825df2a03dc7a895ddf43aecb2f47bcd9da4d;p=lhc%2Fweb%2Fwww.git diff --git a/www/plugins-dist/medias/action/editer_document.php b/www/plugins-dist/medias/action/editer_document.php old mode 100644 new mode 100755 index 6ed20fa0..fd1f7589 --- a/www/plugins-dist/medias/action/editer_document.php +++ b/www/plugins-dist/medias/action/editer_document.php @@ -3,14 +3,16 @@ /***************************************************************************\ * SPIP, Systeme de publication pour l'internet * * * - * Copyright (c) 2001-2016 * + * Copyright (c) 2001-2020 * * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * * * * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -19,9 +21,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return; * @param int $arg * @return array */ -function action_editer_document_dist($arg=null) { +function action_editer_document_dist($arg = null) { - if (is_null($arg)){ + if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } @@ -31,28 +33,37 @@ function action_editer_document_dist($arg=null) { $id_document = document_inserer(); } - if (!$id_document) - return array(0,''); // erreur + if (!$id_document) { + return array(0, ''); + } // erreur $err = document_modifier($id_document); - return array($id_document,$err); + return array($id_document, $err); } /** * Creer un nouveau document * + * @param int $id_parent + * inutilise, pas de parent pour les documents + * @param array|null $set * @return int */ -function document_inserer() { +function document_inserer($id_parent = null, $set = null) { $champs = array( 'statut' => 'prop', 'date' => 'NOW()', ); + if ($set) { + $champs = array_merge($champs, $set); + } + // Envoyer aux plugins - $champs = pipeline('pre_insertion', + $champs = pipeline( + 'pre_insertion', array( 'args' => array( 'table' => 'spip_documents', @@ -60,8 +71,9 @@ function document_inserer() { 'data' => $champs ) ); - $id_document = sql_insertq("spip_documents", $champs); - pipeline('post_insertion', + $id_document = sql_insertq('spip_documents', $champs); + pipeline( + 'post_insertion', array( 'args' => array( 'table' => 'spip_documents', @@ -80,17 +92,18 @@ function document_inserer() { * $set est un contenu (par defaut on prend le contenu via _request()) * * @param int $id_document - * @param array|bool $set + * @param array|null $set + * @return string|null */ -function document_modifier($id_document, $set=false) { +function document_modifier($id_document, $set = null) { include_spip('inc/modifier'); include_spip('inc/filtres'); - + // champs normaux $champs = collecter_requests( // white list - objet_info('document','champs_editables'), + objet_info('document', 'champs_editables'), // black list array('parents', 'ajout_parents'), // donnees eventuellement fournies @@ -98,52 +111,58 @@ function document_modifier($id_document, $set=false) { ); - $invalideur = ""; + $invalideur = ''; $indexation = false; // Si le document est publie, invalider les caches et demander sa reindexation - $t = sql_getfetsel("statut", "spip_documents", 'id_document='.intval($id_document)); + $t = sql_getfetsel('statut', 'spip_documents', 'id_document=' . intval($id_document)); if ($t == 'publie') { $invalideur = "id='id_document/$id_document'"; $indexation = true; } - - $ancien_fichier = ""; + + $ancien_fichier = ''; // si le fichier est modifie, noter le nom de l'ancien pour faire le menage - if (isset($champs['fichier'])){ - $ancien_fichier = sql_getfetsel('fichier','spip_documents','id_document='.intval($id_document)); + if (isset($champs['fichier'])) { + $ancien_fichier = sql_getfetsel('fichier', 'spip_documents', 'id_document=' . intval($id_document)); } - if ($err = objet_modifier_champs('document', $id_document, + if ($err = objet_modifier_champs( + 'document', + $id_document, array( + 'data' => $set, 'invalideur' => $invalideur, 'indexation' => $indexation ), - $champs)) + $champs + )) { return $err; + } // nettoyer l'ancien fichier si necessaire - if ($champs['fichier'] // un plugin a pu interdire la modif du fichier en virant le champ - AND $ancien_fichier // on avait bien note le nom du fichier avant la modif - AND $ancien_fichier!==$champs['fichier'] // et il a ete modifie - AND !tester_url_absolue($ancien_fichier) - AND @file_exists($f = get_spip_doc($ancien_fichier))) - spip_unlink($f); + if (isset($champs['fichier']) // un plugin a pu interdire la modif du fichier en virant le champ + and $champs['fichier'] + and $ancien_fichier // on avait bien note le nom du fichier avant la modif + and $ancien_fichier !== $champs['fichier'] // et il a ete modifie + and !tester_url_absolue($ancien_fichier) + and @file_exists($f = get_spip_doc($ancien_fichier)) + ) { + spip_unlink($f); + } // Changer le statut du document ? // le statut n'est jamais fixe manuellement mais decoule de celui des objets lies - $champs = collecter_requests(array('parents','ajouts_parents'),array(),$set); - if(document_instituer($id_document,$champs)) { - + $champs = collecter_requests(array('parents', 'ajouts_parents'), array(), $set); + if (document_instituer($id_document, $champs)) { // // Post-modifications // - + // Invalider les caches include_spip('inc/invalideur'); - suivre_invalideur("id='id_document/$id_document'"); + suivre_invalideur("id='id_document/$id_document'"); } - } @@ -155,66 +174,97 @@ function document_modifier($id_document, $set=false) { * @param array $champs * @return bool */ -function document_instituer($id_document,$champs=array()){ - - $statut=isset($champs['statut'])?$champs['statut']:null; - $date_publication = isset($champs['date_publication'])?$champs['date_publication']:null; - if (isset($champs['parents'])) - medias_revision_document_parents($id_document,$champs['parents']); - if (isset($champs['ajout_parents'])) - medias_revision_document_parents($id_document,$champs['ajout_parents'],true); - - $row = sql_fetsel("statut,date_publication", "spip_documents", "id_document=$id_document"); +function document_instituer($id_document, $champs = array()) { + + $statut = isset($champs['statut']) ? $champs['statut'] : null; + $date_publication = isset($champs['date_publication']) ? $champs['date_publication'] : null; + if (isset($champs['parents'])) { + medias_revision_document_parents($id_document, $champs['parents']); + } + if (isset($champs['ajout_parents'])) { + medias_revision_document_parents($id_document, $champs['ajout_parents'], true); + } + + $row = sql_fetsel('statut,date_publication', 'spip_documents', 'id_document='.intval($id_document)); $statut_ancien = $row['statut']; $date_publication_ancienne = $row['date_publication']; + $champs = array(); + /* Autodetermination du statut si non fourni */ - if (is_null($statut)){ - $statut = 'prepa'; - - $trouver_table = charger_fonction('trouver_table','base'); - $res = sql_select('id_objet,objet','spip_documents_liens',"objet!='document' AND id_document=".intval($id_document)); - // dans 10 ans, ca nous fera un bug a corriger vers 2018 - // penser a ouvrir un ticket d'ici la :p - $date_publication=time()+10*365*24*3600; - include_spip('base/objets'); - while($row = sql_fetch($res)){ - if ( - // cas particulier des rubriques qui sont publiees des qu'elles contiennent un document ! - $row['objet']=='rubrique' - // ou si objet publie selon sa declaration - OR objet_test_si_publie($row['objet'],$row['id_objet'])){ - $statut = 'publie'; - $date_publication=0; - continue; - } - // si pas publie, et article, il faut checker la date de post-publi eventuelle - elseif ($row['objet']=='article' - AND $row2 = sql_fetsel('date','spip_articles','id_article='.intval($row['id_objet'])." AND statut='publie'")){ - $statut = 'publie'; - $date_publication = min($date_publication,strtotime($row2['date'])); - } - } - $date_publication = date('Y-m-d H:i:s',$date_publication); - if ($statut=='publie' AND $statut_ancien=='publie' AND $date_publication==$date_publication_ancienne) - return false; - if ($statut!='publie' AND $statut_ancien!='publie' AND $statut_ancien!='0') + if (is_null($statut)) { + $determiner_statut_document = charger_fonction('determiner_statut_document', 'inc'); + $champs = $determiner_statut_document($id_document, $statut_ancien, $date_publication_ancienne); + + // rien a faire + if ($champs === false) { return false; + } + + } + else { + if ($statut !== $statut_ancien) { + $champs['statut'] = $statut; + } + } + + if (!is_null($date_publication) + and empty($champs['date_publication']) + and $date_publication != $date_publication_ancienne) { + $champs['date_publication'] = $date_publication; + } + + // Envoyer aux plugins + $champs = pipeline('pre_edition', + array( + 'args' => array( + 'table' => 'spip_documents', + 'id_objet' => $id_document, + 'action' => 'instituer', + 'statut_ancien' => $statut_ancien, + 'date_ancienne' => $date_publication_ancienne, + ), + 'data' => $champs + ) + ); + + if (!count($champs)) { + return false; } - if ($statut!==$statut_ancien - OR $date_publication!=$date_publication_ancienne){ - sql_updateq('spip_documents',array('statut'=>$statut,'date_publication'=>$date_publication),'id_document='.intval($id_document)); - if ($statut!==$statut_ancien){ - $publier_rubriques = sql_allfetsel('id_objet','spip_documents_liens',"objet='rubrique' AND id_document=".intval($id_document)); - if (count($publier_rubriques)){ - include_spip('inc/rubriques'); - foreach($publier_rubriques as $r) - calculer_rubriques_if($r['id_objet'],array('statut'=>$statut),$statut_ancien,false); + + sql_updateq('spip_documents', $champs, 'id_document=' . intval($id_document)); + if (!empty($champs['statut'])) { + $publier_rubriques = sql_allfetsel( + 'id_objet', + 'spip_documents_liens', + "objet='rubrique' AND id_document=" . intval($id_document) + ); + if (count($publier_rubriques)) { + include_spip('inc/rubriques'); + foreach ($publier_rubriques as $r) { + calculer_rubriques_if($r['id_objet'], array('statut' => $champs['statut']), $statut_ancien, false); } } - return true; } - return false; + + // Invalider les caches + include_spip('inc/invalideur'); + suivre_invalideur("id='document/$id_document'"); + + pipeline('post_edition', + array( + 'args' => array( + 'table' => 'spip_documents', + 'id_objet' => $id_document, + 'action' => 'instituer', + 'statut_ancien' => $statut_ancien, + 'date_ancienne' => $date_publication_ancienne, + ), + 'data' => $champs + ) + ); + + return true; } @@ -226,63 +276,107 @@ function document_instituer($id_document,$champs=array()){ * @param array $parents * @param bool $ajout */ -function medias_revision_document_parents($id_document, $parents=null, $ajout=false){ - if (!is_array($parents)) +function medias_revision_document_parents($id_document, $parents = null, $ajout = false) { + include_spip('inc/autoriser'); + + if (!is_array($parents)) { return; - + } + $insertions = array(); $objets_parents = array(); // array('article'=>array(12,23)) - + // au format objet|id_objet - foreach($parents as $p){ - $p = explode('|',$p); - if (preg_match('/^[a-z0-9_]+$/i', $objet=$p[0]) - AND $p[1]=intval($p[1])){ // securite + foreach ($parents as $p) { + $p = explode('|', $p); + if (preg_match('/^[a-z0-9_]+$/i', $objet = $p[0]) + and $p[1] = intval($p[1]) + ) { // securite $objets_parents[$p[0]][] = $p[1]; } } - + include_spip('action/editer_liens'); // les liens actuels - $liens = objet_trouver_liens(array('document'=>$id_document),'*'); + $liens = objet_trouver_liens(array('document' => $id_document), '*'); $deja_parents = array(); // si ce n'est pas un ajout, il faut supprimer les liens actuels qui ne sont pas dans $objets_parents - if (!$ajout){ - foreach($liens as $k=>$lien) - if (!isset($objets_parents[$lien['objet']]) OR !in_array($lien['id_objet'],$objets_parents[$lien['objet']])) { - if (autoriser('dissocierdocuments',$lien['objet'],$lien['id_objet'])){ - objet_dissocier(array('document'=>$id_document),array($lien['objet']=>$lien['id_objet'])); + if (!$ajout) { + foreach ($liens as $k => $lien) { + if (!isset($objets_parents[$lien['objet']]) or !in_array($lien['id_objet'], $objets_parents[$lien['objet']])) { + if (autoriser('dissocierdocuments', $lien['objet'], $lien['id_objet'])) { + objet_dissocier(array('document' => $id_document), array($lien['objet'] => $lien['id_objet'])); } unset($liens[$k]); + } else { + $deja_parents[$lien['objet']][] = $lien['id_objet']; } - else $deja_parents[$lien['objet']][] = $lien['id_objet']; + } } - // verifier les droits d'associer - foreach($objets_parents as $objet=>$ids){ - foreach($ids as $k=>$id){ - if (!autoriser('associerdocuments',$objet,$id)){ + // trier les objets à traiter : ne pas prendre en compte ceux qui sont déjà associés ou qu'on n'a pas le droit d'associer + foreach ($objets_parents as $objet => $ids) { + foreach ($ids as $k => $id) { + if (( + isset($deja_parents[$objet]) + and in_array($id, $deja_parents[$objet]) + ) + or !autoriser('associerdocuments', $objet, $id) + ) { unset($objets_parents[$objet][$k]); } } } - objet_associer(array('document'=>$id_document),$objets_parents); - + objet_associer(array('document' => $id_document), $objets_parents); } -// obsoletes +// Fonctions Dépréciées +// -------------------- + +/** + * Insertion d'un document + * + * @deprecated Utiliser document_inserer() + * @see document_inserer() + * @return int Identifiant du nouveau document + */ function insert_document() { return document_inserer(); } -function document_set($id_document, $set=false) { + +/** + * Modification d'un document + * + * @deprecated Utiliser document_modifier() + * @see document_modifier() + * @param int $id_document Identifiant du document + * @param array|bool $set + */ +function document_set($id_document, $set = false) { return document_modifier($id_document, $set); } -function instituer_document($id_document,$champs=array()){ - return document_instituer($id_document,$champs); -} -function revision_document($id_document, $c=false) { - return document_modifier($id_document,$c); + +/** + * Insituer un document + * + * @deprecated Utiliser document_instituer() + * @see document_instituer() + * @param int $id_document Identifiant du document + * @param array $champs + */ +function instituer_document($id_document, $champs = array()) { + return document_instituer($id_document, $champs); } -?> +/** + * Réviser un document + * + * @deprecated Utiliser document_modifier() + * @see document_modifier() + * @param int $id_document Identifiant du document + * @param array $c + */ +function revision_document($id_document, $c = false) { + return document_modifier($id_document, $c); +}