[ Index ]
 

Code source de SPIP 1.9.2c

Accédez au Source d'autres logiciels libres

title

Body

[fermer]

/ecrire/inc/ -> extra.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  
  14  
  15  ////////////////////////////////////////////////////////////////////////////////////
  16  // Pour utiliser les champs "extra", il faut installer dans le fichier
  17  // ecrire/mes_options un tableau definissant les champs pour chaque
  18  // type d'objet que l'on veut Žtendre (article, rubrique, breve, auteur,
  19  // site ou mot). Pour acceder aux valeurs des champs extra dans les
  20  // squelettes du site public, utiliser la notation :
  21  //                     [(#EXTRA|extra{nom_du_champ})]
  22  // Exemples :
  23  
  24  /*
  25  
  26  //
  27  // Definition de tous les extras possibles
  28  //
  29  
  30  $GLOBALS['champs_extra'] = Array (
  31      'auteurs' => Array (
  32              "alim" => "radio|brut|Pr&eacute;f&eacute;rences alimentaires|Veggie,Viande",
  33              "habitation" => "liste|brut|Lieu|Kuala Lumpur,Cape Town,Uppsala",
  34              "ml" => "case|propre|Je souhaite m'abonner &agrave; la mailinglist",
  35              "age" => "ligne|propre|&Acirc;ge du capitaine",
  36              "biblio" => "bloc|propre|Bibliographie"
  37          ),
  38  
  39      'articles' => Array (
  40              "isbn" => "ligne|typo|ISBN",
  41               "options" => "multiple|brut|Options de cet article|1,2,3,plus"
  42  
  43               
  44          )
  45      );
  46  
  47  // Note : pour les listes et les radios on peut preciser les valeurs des labels 
  48  //  Exemples
  49  //  "habitation" => "liste|brut|Lieu|San Diego,Suresnes|diego,suresnes",
  50  
  51  
  52  */
  53  
  54  
  55  /*
  56  
  57  // On peut optionnellement vouloir restreindre la portee des extras :
  58  // - pour les articles/rubriques/breves en fonction du secteur ;
  59  // - pour les auteurs en fonction du statut
  60  // - pour les mots-cles en fonction du groupe de mots
  61  // Exemples :
  62  
  63  $GLOBALS['champs_extra_proposes'] = Array (
  64      'auteurs' => Array (
  65          // tous : par defaut
  66          'tous' =>  'age|alim|ml',
  67          // les admins (statut='0minirezo') ont plus de champs que les auteurs 
  68          '0minirezo' => 'age|alim|ml|biblio|habitation'
  69          ),
  70  
  71      'articles' => Array (
  72          // tous : par defaut aucun champs extra sur les articles
  73          'tous' => '',
  74          // seul le champs extra "isbn" est proposé dans le secteur 1)
  75          '1' => 'isbn',
  76          // Dans le secteur 2 le champs "options" est proposé)
  77          '2' => 'options'
  78          )
  79      );
  80  
  81  
  82  */
  83  
  84  ////////////////////////////////////////////////////////////////////////////////////
  85  
  86  //
  87  if (!defined("_ECRIRE_INC_VERSION")) return;
  88  
  89  // a partir de la liste des champs, generer la liste des input
  90  // http://doc.spip.org/@extra_saisie
  91  function extra_saisie($extra, $type, $ensemble='') {
  92      if ($affiche = extra_form($extra, $type, $ensemble)) {
  93          return debut_cadre_enfonce('',true)
  94              . $affiche
  95              . fin_cadre_enfonce(true);
  96      }
  97  }
  98  
  99  // http://doc.spip.org/@extra_form
 100  function extra_form($extra, $type, $ensemble='') {
 101      $extra = unserialize($extra);
 102  
 103      // quels sont les extras de ce type d'objet
 104      if (!$champs = $GLOBALS['champs_extra'][$type])
 105          $champs = Array();
 106  
 107      // prendre en compte, eventuellement, les champs presents dans la base
 108      // mais oublies dans mes_options.
 109      if (is_array($extra))
 110          while (list($key,) = each($extra))
 111              if (!$champs[$key])
 112                  $champs[$key] = "masque||($key?)";
 113  
 114      // quels sont les extras proposes...
 115      // ... si l'ensemble est connu
 116      if ($ensemble && isset($GLOBALS['champs_extra_proposes'][$type][$ensemble]))
 117          $champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type][$ensemble]);
 118      // ... sinon, les champs proposes par defaut
 119      else if (isset($GLOBALS['champs_extra_proposes'][$type]['tous'])) {
 120          $champs_proposes = explode('|', $GLOBALS['champs_extra_proposes'][$type]['tous']);
 121      }
 122  
 123      // sinon tous les champs extra du type
 124      else {
 125          $champs_proposes =  Array();
 126          reset($champs);
 127          while (list($ch, ) = each($champs)) $champs_proposes[] = $ch;
 128      }
 129  
 130      // bug explode
 131      if($champs_proposes == explode('|', '')) $champs_proposes = Array();
 132  
 133      // maintenant, on affiche les formulaires pour les champs renseignes dans $extra
 134      // et pour les champs proposes
 135      reset($champs_proposes);
 136      while (list(, $champ) = each($champs_proposes)) {
 137          $desc = $champs[$champ];
 138          list($form, $filtre, $prettyname, $choix, $valeurs) = explode("|", $desc);
 139  
 140          if (!$prettyname) $prettyname = ucfirst($champ);
 141          $affiche .= "<b>$prettyname&nbsp;:</b><br />";
 142  
 143          switch($form) {
 144  
 145              // complique car la valeur n'esst pas envoyee ar le nav si unchecked
 146              case "case":
 147              case "checkbox":
 148                  $affiche = ereg_replace("<br />$", "&nbsp;", $affiche);
 149                  $affiche .= "<input type='hidden' name='suppl_$champ' value='1' /><input type='checkbox' name='suppl_{$champ}_check'";
 150                  if ($extra[$champ] == 'true')
 151                      $affiche .= " checked";
 152                      $affiche .= " />";
 153                  break;
 154  
 155              case "list":
 156              case "liste":
 157              case "select":
 158                  $choix = explode(",",$choix);
 159                  if (!is_array($choix)) {
 160                      $affiche .= "Pas de choix d&eacute;finis.\n";
 161                      break;
 162                  }
 163  
 164                  // prendre en compte les valeurs des champs
 165                  // si elles sont renseignees
 166                  $valeurs = explode(",",$valeurs);
 167                  if($valeurs == explode(",",""))
 168                      $valeurs = $choix ;
 169  
 170                  $affiche .= "<select name='suppl_$champ' ";
 171                  $affiche .= "class='forml'>\n";
 172                  $i = 0 ;
 173                  while (list(, $choix_) = each($choix)) {
 174                      $val = $valeurs[$i] ;
 175                      $affiche .= "<option value=\"$val\"";
 176                      if ($val == entites_html($extra[$champ]))
 177                          $affiche .= " selected";
 178                      $affiche .= ">$choix_</option>\n";
 179                      $i++;
 180                  }
 181                  $affiche .= "</select>";
 182                  break;
 183  
 184              case "radio":
 185                  $choix = explode(",",$choix);
 186                  if (!is_array($choix)) {
 187                      $affiche .= "Pas de choix d&eacute;finis.\n";
 188                      break;
 189                  }
 190                  $valeurs = explode(",",$valeurs);
 191                  if($valeurs == explode(",",""))
 192                      $valeurs = $choix ;
 193  
 194                  $i=0;
 195                  while (list(, $choix_) = each($choix)) {
 196                      $affiche .= "<input type='radio' name='suppl_$champ' ";
 197                      $val = $valeurs[$i] ;
 198                      if (entites_html($extra[$champ])== $val)
 199                          $affiche .= " checked";
 200  
 201                      // premiere valeur par defaut
 202                      if (!$extra[$champ] AND $i == 0)
 203                          $affiche .= " checked";
 204  
 205                      $affiche .= " value='$val'>$choix_</input>\n";
 206                      $i++;
 207                  }
 208                  break;
 209  
 210              // A refaire car on a pas besoin de renvoyer comme pour checkbox
 211              // les cases non cochees
 212              case "multiple":
 213                  $choix = explode(",",$choix);
 214                  if (!is_array($choix)) {
 215                      $affiche .= "Pas de choix d&eacute;finis.\n";
 216                      break;
 217                  }
 218                  $affiche .= "<input type='hidden' name='suppl_{$champ}' value='1' />";
 219                  for ($i=0; $i < count($choix); $i++) {
 220                      $affiche .= "<input type='checkbox' name='suppl_$champ$i'";
 221                      if (entites_html($extra[$champ][$i])=="on")
 222                          $affiche .= " checked";
 223                      $affiche .= ">\n";
 224                      $affiche .= $choix[$i];
 225                      $affiche .= "</input>\n";
 226                  }
 227                  break;
 228  
 229              case "bloc":
 230              case "block":
 231                  $affiche .= "<textarea name='suppl_$champ' class='forml' rows='5' cols='40'>".entites_html($extra[$champ])."</textarea>\n";
 232                  break;
 233  
 234              case "masque":
 235                  $affiche .= "<span style='color: #555555'>".interdire_scripts($extra[$champ])."</span>\n";
 236                  break;
 237  
 238              case "ligne":
 239              case "line":
 240              default:
 241                  $affiche .= "<input type='text' name='suppl_$champ' class='forml'\n";
 242                  $affiche .= " value=\"".entites_html($extra[$champ])."\" size='40'>\n";
 243                  break;
 244          }
 245  
 246          $affiche .= "<br />\n";
 247      }
 248  
 249      return $affiche;
 250  }
 251  
 252  // recupere les valeurs postees pour reconstituer l'extra
 253  // http://doc.spip.org/@extra_recup_saisie
 254  function extra_recup_saisie($type, $c=false) {
 255      $champs = $GLOBALS['champs_extra'][$type];
 256      if (is_array($champs)) {
 257          $extra = Array();
 258          foreach($champs as $champ => $config)
 259          if (($val = _request("suppl_$champ",$c)) !== NULL) {
 260              list($style, $filtre, , $choix,) = explode("|", $config);
 261              list(, $filtre) = explode(",", $filtre);
 262              switch ($style) {
 263              case "multiple":
 264                  $choix =  explode(",", $choix);
 265                  $multiple = array();
 266                  for ($i=0; $i < count($choix); $i++) {
 267                      $val2 = _request("suppl_$champ$i",$c);
 268                      if ($filtre && function_exists($filtre))
 269                           $multiple[$i] = $filtre($val2);
 270                      else
 271                          $multiple[$i] = $val2;
 272                  }
 273                  $extra[$champ] = $multiple;
 274                  break;
 275  
 276              case 'case':
 277              case 'checkbox':
 278                  if (_request("suppl_{$champ}_check") == 'on')
 279                      $val = 'true';
 280                  else
 281                      $val = 'false';
 282                  // pas de break; on continue
 283  
 284              default:
 285                  if ($filtre && function_exists($filtre))
 286                      $extra[$champ] = $filtre($val);
 287                  else
 288                      $extra[$champ] = $val;
 289                  break;
 290              }
 291          }
 292          return serialize($extra);
 293      } else
 294          return false;
 295  }
 296  
 297  // Retourne la liste des filtres a appliquer pour un champ extra particulier
 298  // http://doc.spip.org/@extra_filtres
 299  function extra_filtres($type, $nom_champ) {
 300      $champ = $GLOBALS['champs_extra'][$type][$nom_champ];
 301      if (!$champ) return array();
 302      list(, $filtre, ) = explode("|", $champ);
 303      list($filtre, ) = explode(",", $filtre);
 304      if ($filtre && $filtre != 'brut' && function_exists($filtre))
 305          return array($filtre);
 306      return array();
 307  }
 308  
 309  // Retourne la liste des filtres a appliquer a la recuperation
 310  // d'un champ extra particulier
 311  // http://doc.spip.org/@extra_filtres_recup
 312  function extra_filtres_recup($type, $nom_champ) {
 313      $champ = $GLOBALS['champs_extra'][$type][$nom_champ];
 314      if (!$champ) return array();
 315      list(, $filtre, ) = explode("|", $champ);
 316      list(,$filtre) = explode(",", $filtre);
 317      if ($filtre && $filtre != 'brut' && function_exists($filtre))
 318          return array($filtre);
 319      return array();
 320  }
 321  
 322  // http://doc.spip.org/@extra_champ_valide
 323  function extra_champ_valide($type, $nom_champ) {
 324      return isset($GLOBALS['champs_extra'][$type][$nom_champ]);
 325  }
 326  
 327  // a partir de la liste des champs, generer l'affichage
 328  // http://doc.spip.org/@extra_affichage
 329  function extra_affichage($extra, $type) {
 330      $extra = unserialize ($extra);
 331      if (!is_array($extra)) return;
 332      $champs = $GLOBALS['champs_extra'][$type];
 333  
 334      while (list($nom,$contenu) = each($extra)) {
 335          list ($style, $filtre, $prettyname, $choix, $valeurs) =
 336              explode("|", $champs[$nom]);
 337          list($filtre, ) = explode(",", $filtre);
 338          switch ($style) {
 339              case "checkbox":
 340              case "case":
 341                  if ($contenu=="true") $contenu = _T('item_oui');
 342                  elseif ($contenu=="false") $contenu = _T('item_non');
 343                  break;
 344  
 345              case "multiple":
 346                  $contenu_ = "";
 347                  $choix = explode (",", $choix);
 348                  if (is_array($contenu) AND is_array($choix)
 349                  AND count($choix)==count($contenu))
 350                      for ($i=0; $i < count($contenu); $i++)
 351                          if ($contenu[$i] == "on")
 352                              $contenu_ .= "$choix[$i], ";
 353                          else if ($contenu[$i] <> '')
 354                              $contenu_ = "Choix incoh&eacute;rents, "
 355                              ."v&eacute;rifiez la configuration... ";
 356                  $contenu = ereg_replace(", $", "", $contenu_);
 357                  break;
 358          }
 359          if ($filtre != 'brut' AND function_exists($filtre))
 360              $contenu = $filtre($contenu);
 361          if (!$prettyname)
 362              $prettyname = ucfirst($nom);
 363          if ($contenu)
 364              $affiche .= "<div><b>$prettyname&nbsp;:</b> "
 365              .interdire_scripts($contenu)."<br /></div>\n";
 366      }
 367  
 368      if ($affiche)
 369          return debut_cadre_enfonce('',true)
 370              . $affiche
 371              . fin_cadre_enfonce(true);
 372  }
 373  
 374  // s'il y a mise a jour des extras, mixer les champs modifies
 375  // avec les champs existants (car la mise a jour peut etre partielle)
 376  // http://doc.spip.org/@extra_update
 377  function extra_update($type, $id, $c = false) {
 378      $extra = @unserialize(extra_recup_saisie($type, $c));
 379  
 380      // pas de mise a jour, ou erreur
 381      if (!is_array($extra) OR !count($extra))
 382          return false;
 383  
 384      // passer de 'articles' a 'article' :-(
 385      $t = preg_replace(',s$,', '', $type);
 386  
 387      $orig = spip_query("SELECT extra FROM spip_".table_objet($t)." WHERE ".id_table_objet($t)."=".intval($id));
 388      $orig = spip_fetch_array($orig);
 389  
 390      if (isset($orig['extra'])
 391      AND is_array($orig = @unserialize($orig['extra']))) {
 392          $extra = array_merge($orig, $extra);
 393      }
 394  
 395      return serialize($extra);
 396  }
 397  
 398  ?>


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