Page d'accueil | Contact | Plan | Droits d'auteur | Login membres

Visitez quelques sites des membres d'Eklesia.net

Niveau expert
Étendre les possibilités de SPIP avec de nouveaux champs

Introduction

SPIP a prévu un certain nombre de champs qu’on peut utiliser en standard, comme dans la catégorie articles le titre, sous-titre, texte, post-scriptum etc.

Une fonctionnalité non documentée permet de créer de nouveaux champs qui pourront alors être utilisés sur vos sites.

La procédure suivante est EXPÉRIMENTALE, c.à.d. qu’elle fonctionne, mais n’est pas dans la liste des fonctionnalités officielles de SPIP. On court le risque que cela ne marche plus lors d’une mise à jour.

Déclarer les nouveaux champs

Il faut d’abord créer un fichier du nom de mes_options.php3 et le placer dans le répertoire /ecrire de SPIP.

Dans ce fichier on va définir les nouveaux champs. Sur notre site, nous avons rajouté quelques champs dans le secteur des auteurs de la manière suivante :


<?php
$GLOBALS['champs_extra'] = Array (
   'auteurs' => Array (
       "site1_nom" => "ligne|propre|Nom du site 1",
       "site1_url" => "ligne|propre|Url du site 1",
       "site2_nom" => "ligne|propre|Nom du site 2",
       "site2_url" => "ligne|propre|Url du site 2",
       "site3_nom" => "ligne|propre|Nom du site 3",
       "site3_url" => "ligne|propre|Url du site 3"
   )
);
?>

Ceci provoque l’affichage de ces six nouveaux champs dans la modification d’un auteur.

Vous pouvez ajouter des champs dans les catégories articles, brèves, auteurs, rubriques et mots-clé.

Je n’ai pas pu trouver jusqu’à présent à quoi correspond exactement le terme "propre", mais en laissant comme ceci, cela fonctionne.

La sauvegarde des informations

Les informations des champs seront sauvegardées dans la table correspondante dans le champ "extra" de manière sérialisée. Peu importe donc le nom et le nombre de vos nouveaux champs.

Si un jour cette fonctionnalité serait enlevée par les auteurs de SPIP, on peut toujours dé-sérialiser les informations pour les récupérer.

L’exploitation des champs dans une boucle

Les informations sont alors exploitables dans une boucle avec


[(#EXTRA|extra{site1_nom})]

A noter qu’un tri SPIP ne sera pas possible et que les infos ne seront pas indexées par le moteur de recherche.

Pour le tri on peut récupérer les infos dans un array PHP et le trier avant d’afficher.

L’application sur ce site

Et voici comment une liste de 20 sites pris au hasard est sortie pour afficher dans la colonne de gauche.

Dans notre cas, nous allons lire les 3 couples de champs (nom et url) dans un array. Ensuite ces arrays sont ajoutés dans un array qui comprend tous les sites.

Comme plusieurs membres peuvent avoir indiqués le même site, il y a un petit test pour voir si un site existe déjà dans l’array avant de le rajouter.

Le code est volontairement laissé dans une forme basique pour faciliter la compréhension.


<BOUCLE_auteur(AUTEURS){tous}>
<?php

unset($site_tmp);
$site_tmp[] = "[(#EXTRA|extra{site1_nom})]";
$site_tmp[] = "[(#EXTRA|extra{site1_url})]";
if($site_tmp[0] != "") {
  $existe = 0;
  if(isset($array_sites)) {
     foreach($array_sites as $no => $url) {
        if($site_tmp[1] == $url[1]) { $existe = 1;}
     }
  }
  if($existe == 0) { $array_sites[] = $site_tmp; }
}

unset($site_tmp);
$site_tmp[] = "[(#EXTRA|extra{site2_nom})]";
$site_tmp[] = "[(#EXTRA|extra{site2_url})]";
if($site_tmp[1] != "") {
  $existe = 0;
  if(isset($array_sites)) {
     foreach($array_sites as $no => $url) {
        if($site_tmp[1] == $url[1]) { $existe = 1;}
     }
  }
  if($existe == 0) { $array_sites[] = $site_tmp; }
}

unset($site_tmp);
$site_tmp[] = "[(#EXTRA|extra{site3_nom})]";
$site_tmp[] = "[(#EXTRA|extra{site3_url})]";
if($site_tmp[1] != "") {
  $existe = 0;
  if(isset($array_sites)) {
     foreach($array_sites as $no => $url) {
        if($site_tmp[1] == $url[1]) { $existe = 1;}
     }
  }
  if($existe == 0) { $array_sites[] = $site_tmp; }
}

?>
</BOUCLE_auteur>

Nous avons maintenant notre array qui contient les arrays des sites. Reste à trouver 20 sites au hasard et de les afficher.


<?php
$nb_sites = 20;
$rand_cle = array_rand($array_sites,$nb_sites);
$i=0;
while($i < $nb_sites) {
echo("
  <div class='sommaire_sitenom'>
     <a class='menu_site'
        href='http://".$array_sites[$rand_cle[$i]][1]."'>"
        .$array_sites[$rand_cle[$i]][0]."
     </a>
  </div>");
  $i++;
}
?>