[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/action/ -> editer_article.php (source)

   1  <?php
   2  
   3  /***************************************************************************\
   4   *  SPIP, Systeme de publication pour l'internet                           *
   5   *                                                                         *
   6   *  Copyright (c) 2001-2007                                                *
   7   *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
   8   *                                                                         *
   9   *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
  10   *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
  11  \***************************************************************************/
  12  
  13  if (!defined("_ECRIRE_INC_VERSION")) return;
  14  
  15  
  16  // http://doc.spip.org/@action_editer_article_dist
  17  function action_editer_article_dist() {
  18  
  19      $securiser_action = charger_fonction('securiser_action', 'inc');
  20      $arg = $securiser_action();
  21  
  22      // si id_article n'est pas un nombre, c'est une creation 
  23      // mais on verifie qu'on a toutes les données qu'il faut.
  24      if (!$id_article = intval($arg)) {
  25          $id_parent = _request('id_parent');
  26          $id_auteur = $GLOBALS['auteur_session']['id_auteur'];
  27          if (!($id_parent AND $id_auteur)) redirige_par_entete('./');
  28          $id_article = insert_article($id_parent);
  29          
  30          # cf. GROS HACK ecrire/inc/getdocument
  31          # rattrapper les documents associes a cet article nouveau
  32          # ils ont un id = 0-id_auteur
  33  
  34          spip_query("UPDATE spip_documents_articles SET id_article = $id_article WHERE id_article = ".(0-$id_auteur));
  35      } 
  36  
  37      // Enregistre l'envoi dans la BD
  38      $err = articles_set($id_article);
  39  
  40      $redirect = parametre_url(urldecode(_request('redirect')),
  41          'id_article', $id_article, '&') . $err;
  42  
  43      redirige_par_entete($redirect);
  44  }
  45  
  46  // Appelle toutes les fonctions de modification d'un article
  47  // $err est de la forme '&trad_err=1'
  48  // http://doc.spip.org/@articles_set
  49  function articles_set($id_article, $c=false) {
  50      $err = '';
  51  
  52      // Edition du contenu ?
  53      $err .= revisions_articles($id_article, $c);
  54  
  55      // Modification de statut, changement de rubrique ?
  56      $err .= instituer_article($id_article, $c);
  57  
  58      // Un lien de trad a prendre en compte
  59      $err .= article_referent($id_article, $c);
  60  
  61      return $err;
  62  }
  63  
  64  // http://doc.spip.org/@insert_article
  65  function insert_article($id_rubrique) {
  66  
  67      include_spip('base/abstract_sql');
  68      include_spip('inc/rubriques');
  69  
  70      // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article
  71      // dans la premiere rubrique racine
  72      if (!$id_rubrique = intval($id_rubrique)) {
  73          $row = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 ORDER by 0+titre,titre LIMIT 1"));
  74          $id_rubrique = $row['id_rubrique'];
  75      }
  76  
  77      // La langue a la creation : si les liens de traduction sont autorises
  78      // dans les rubriques, on essaie avec la langue de l'auteur,
  79      // ou a defaut celle de la rubrique
  80      // Sinon c'est la langue de la rubrique qui est choisie + heritee
  81      if ($GLOBALS['meta']['multi_articles'] == 'oui') {
  82          lang_select($GLOBALS['auteur_session']['lang']);
  83          if (in_array($GLOBALS['spip_lang'],
  84          explode(',', $GLOBALS['meta']['langues_multilingue']))) {
  85              $lang = $GLOBALS['spip_lang'];
  86              $choisie = 'oui';
  87          }
  88      }
  89  
  90      $row = spip_fetch_array(spip_query("SELECT lang, id_secteur FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
  91  
  92      $id_secteur = $row['id_secteur'];
  93  
  94      if (!$lang) {
  95          $lang = $GLOBALS['meta']['langue_site'];
  96          $choisie = 'non';
  97          $lang = $row['lang'];
  98      }
  99  
 100      $id_article = spip_abstract_insert("spip_articles",
 101          "(id_rubrique, id_secteur, statut, date, accepter_forum, lang, langue_choisie)",
 102          "($id_rubrique, $id_secteur, 'prepa', NOW(), '"
 103              . substr($GLOBALS['meta']['forums_publics'],0,3)
 104              . "', '$lang', '$choisie')");
 105      spip_abstract_insert('spip_auteurs_articles', "(id_auteur,id_article)", "('" . $GLOBALS['auteur_session']['id_auteur'] . "','$id_article')");
 106  
 107      return $id_article;
 108  }
 109  
 110  // Enregistre une revision d'article
 111  // $c est un contenu (par defaut on prend le contenu via _request())
 112  // http://doc.spip.org/@revisions_articles
 113  function revisions_articles ($id_article, $c=false) {
 114      include_spip('inc/modifier');
 115  
 116      // unifier $texte en cas de texte trop long (sur methode POST seulement)
 117      if (!is_array($c)) trop_longs_articles();
 118  
 119      // Si l'article est publie, invalider les caches et demander sa reindexation
 120      $t = spip_fetch_array(spip_query(
 121      "SELECT statut FROM spip_articles WHERE id_article=$id_article"));
 122      if ($t['statut'] == 'publie') {
 123          $invalideur = "id='id_article/$id_article'";
 124          $indexation = true;
 125      }
 126  
 127      $r = modifier_contenu('article', $id_article,
 128          array(
 129              'champs' => array(
 130                  'surtitre', 'titre', 'soustitre', 'descriptif',
 131                  'nom_site', 'url_site', 'chapo', 'texte', 'ps',
 132                  'url_propre'
 133              ),
 134              'nonvide' => array('titre' => _T('info_sans_titre')),
 135              'invalideur' => $invalideur,
 136              'indexation' => $indexation
 137          ),
 138          $c);
 139  
 140      if ($r) {
 141          spip_query("UPDATE spip_articles SET date_modif=NOW() WHERE id_article="._q($id_article));
 142      }
 143  
 144      return ''; // pas d'erreur
 145  }
 146  
 147  
 148  // $c est un array ('statut', 'id_rubrique')
 149  //
 150  // statut et rubrique sont lies, car un admin restreint peut deplacer
 151  // un article publie vers une rubrique qu'il n'administre pas
 152  // http://doc.spip.org/@instituer_article
 153  function instituer_article($id_article, $c, $calcul_rub=true) {
 154  
 155      include_spip('inc/autoriser');
 156      include_spip('inc/rubriques');
 157      include_spip('inc/modifier');
 158  
 159      $s = spip_query("SELECT statut, id_rubrique FROM spip_articles WHERE id_article=$id_article");
 160      $row = spip_fetch_array($s);
 161      $id_rubrique = $row['id_rubrique'];
 162      $statut_ancien = $statut = $row['statut'];
 163      $champs = array();
 164  
 165      $s = _request('statut', $c);
 166      if ($s AND _request('statut', $c) != $statut) {
 167          if (autoriser('publierdans', 'rubrique', $id_rubrique))
 168              $statut = $champs['statut'] = $s;
 169          else if (autoriser('modifier', 'article', $id_article) AND $s != 'publie')
 170              $statut = $champs['statut'] = $s;
 171          else
 172              spip_log("editer_article $id_article refus " . join(' ', $c));
 173  
 174          // En cas de publication, fixer la date a "maintenant"
 175          // sauf si $c commande autre chose
 176          if ($champs['statut'] == 'publie') {
 177              if ($d = _request('date', $c))
 178                  $champs['date'] = $d;
 179              else
 180                  $champs['date'] = date('Y-m-d H:i:s');
 181          }
 182      }
 183  
 184      // Verifier que la rubrique demandee existe et est differente
 185      // de la rubrique actuelle
 186      if ($id_parent = _request('id_parent', $c)
 187      AND $id_parent != $id_rubrique
 188      AND (spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_rubrique=$id_parent")))) {
 189          $champs['id_rubrique'] = $id_parent;
 190  
 191          // si l'article etait publie
 192          // et que le demandeur n'est pas admin de la rubrique
 193          // repasser l'article en statut 'propose'.
 194          if ($statut == 'publie') {
 195              if ($GLOBALS['auteur_session']['statut'] != '0minirezo')
 196                  $champs['statut'] = 'prop';
 197              else {
 198                  include_spip('inc/auth');
 199                  $r = auth_rubrique($GLOBALS['auteur_session']['id_auteur'], $GLOBALS['auteur_session']['statut']);
 200                  if (is_array($r) AND !$r[$id_rubrique])
 201                      $champs['statut'] = 'prop';
 202              }
 203          }
 204      }
 205  
 206  
 207      // Envoyer aux plugins
 208      $champs = pipeline('pre_edition',
 209          array(
 210              'args' => array(
 211                  'table' => 'spip_articles',
 212                  'id_objet' => $id_article
 213              ),
 214              'data' => $champs
 215          )
 216      );
 217  
 218      if (!count($champs)) return;
 219  
 220      // Creer la requete SQL
 221      $update = array();
 222      foreach ($champs as $champ => $val)
 223          $update[] = $champ . '=' . _q($val);
 224  
 225      spip_query("UPDATE spip_articles SET ".join(', ',$update)." WHERE id_article=$id_article");
 226  
 227      // Si on a deplace l'article
 228      // - propager les secteurs
 229      // - changer sa langue (si heritee)
 230      if (isset($champs['id_rubrique'])) {
 231          propager_les_secteurs();
 232  
 233          $row = spip_fetch_array(spip_query("SELECT lang, langue_choisie FROM spip_articles WHERE id_article=$id_article"));
 234          $langue_old = $row['lang'];
 235          $langue_choisie_old = $row['langue_choisie'];
 236  
 237          if ($langue_choisie_old != "oui") {
 238              $row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique="._q($champs['id_rubrique'])));
 239              $langue_new = $row['lang'];
 240              if ($langue_new != $langue_old)
 241                  spip_query("UPDATE spip_articles SET lang='$langue_new' WHERE id_article=$id_article");
 242          }
 243      }
 244  
 245      // Invalider les caches
 246      include_spip('inc/invalideur');
 247      suivre_invalideur("id='id_article/$id_article'");
 248  
 249      // Recalculer les rubriques (statuts et dates) si l'on deplace
 250      // un article publie, ou si on le publie/depublie
 251      if (($statut == 'publie' AND isset($champs['id_rubrique']))
 252      OR (isset($champs['statut'])
 253          AND ($statut_ancien=='publie' OR $champs['statut']=='publie')
 254          AND $calcul_rub
 255          )
 256      )
 257          calculer_rubriques();
 258  
 259      // Pipeline
 260      pipeline('post_edition',
 261          array(
 262              'args' => array(
 263                  'table' => 'spip_articles',
 264                  'id_objet' => $id_article
 265              ),
 266              'data' => $champs
 267          )
 268      );
 269  
 270      // Notifications
 271      if ($notifications = charger_fonction('notifications', 'inc')) {
 272          $notifications('instituerarticle', $id_article,
 273              array('statut' => $statut, 'statut_ancien' => $statut_ancien)
 274          );
 275      }
 276  
 277      return ''; // pas d'erreur
 278  }
 279  
 280  
 281  //
 282  // Reunit les textes decoupes parce que trop longs
 283  //
 284  
 285  // http://doc.spip.org/@trop_longs_articles
 286  function trop_longs_articles() {
 287      if (is_array($plus = _request('texte_plus'))) {
 288          foreach ($plus as $n=>$t) {
 289              $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,","", $t);
 290          }
 291          set_request('texte', join('',$plus) . _request('texte'));
 292      }
 293  }
 294  
 295  // Poser un lien de traduction vers un article de reference
 296  // http://doc.spip.org/@article_referent
 297  function article_referent ($id_article, $c) {
 298  
 299      if (!$lier_trad = intval(_request('lier_trad', $c))) return;
 300  
 301      // selectionner l'article cible, qui doit etre different de nous-meme,
 302      // et quitter s'il n'existe pas
 303      if (!$row = spip_fetch_array(
 304      spip_query("SELECT id_trad FROM spip_articles WHERE id_article=$lier_trad AND NOT(id_article=$id_article)")))
 305      {
 306          spip_log("echec lien de trad vers article inexistant ($lier_trad)");
 307          return '&trad_err=1';
 308      }
 309  
 310      // $id_lier est le numero du groupe de traduction
 311      $id_lier = $row['id_trad'];
 312  
 313      // Si l'article vise n'est pas deja traduit, son identifiant devient
 314      // le nouvel id_trad de ce nouveau groupe et on l'affecte aux deux
 315      // articles
 316      if ($id_lier == 0) {
 317          spip_query("UPDATE spip_articles SET id_trad = $lier_trad WHERE id_article IN ($lier_trad, $id_article)");
 318      }
 319      // sinon on ajouter notre article dans le groupe
 320      else {
 321          spip_query("UPDATE spip_articles SET id_trad = $id_lier WHERE id_article = $id_article");
 322      }
 323  
 324      return ''; // pas d'erreur
 325  }
 326  
 327  
 328  ?>


Généré le : Wed Nov 21 10:20:27 2007 par Balluche grâce à PHPXref 0.7
  Clicky Web Analytics