Rubriques remplacées par les articles ou Article par défaut

Attention, cette contribution est EN CHANTIER : elle n’est peut-être pas fonctionnelle.

Attention ! Cette contribution modifie des fichiers du noyau de SPIP !

Même si elle a été testée par plusieurs utilisateurs nous ne pouvons garantir qu’il n’y aura pas d’effets secondaires dommageables sur votre SPIP. Conservez toujours les fichiers d’origine pour pouvoir revenir au noyau originel.

De plus, elle n’est compatible qu’avec une version précise de SPIP et sera perdue à la prochaine mise à jour : vous devrez donc recommencer.

Permet d’afficher directement des articles sans passer par la rubrique, et d’avoir par défaut un article d’accueil par rubrique. On conserve quand même l’organisation des rubriques.

Nota SPIP-Contrib

Cette contribution, bien qu’en chantier, dont l’approche peut faire débat, et présentant le défaut de modifier le coeur de SPIP (ce qui rend toujours problématique le suivi des mises à jour) est quand même publiée comme sujet d’étude et doit être appréhendée comme tel. Vous aurez été prévenu.

Avertissement

Attention cette contribution demande la modification de fichiers du core de SPIP... Ce peut-être assez dangereux pour votre site. Testez cette contrib d’abord sur un site qui n’est pas en production et qui est en version 1.9.1. Je ne l’ai pas testé sur du 1.9.2 ( la dernière actuellement.

Bon accrochez vous et lisez surtout après l’installation pour mieux comprendre.(n’oubliez pas les commentaires :) ) . y a pas mal d’opérations a faire et il serait bon de porter cette contrib en plugin ... avis aux amateurs :)

Principe

Cette contribution permet, grâce à quelque codes a rajouter et aux boucles, d’avoir lors de la navigation, et pour certaines conditions, un accès direct aux articles sans passer par leur rubrique. La rubrique existe toujours en tant que telle, mais son affichage dépend du contexte :
-  si la rubrique a un seul article ( exemple : voir le cas d’un seul article par contrib sur ce même site ), alors on affiche le lien de l’article « unique » ;
-  si la rubrique a plusieurs articles, alors on affiche le lien de la rubrique ;
-  il est aussi possible de définir un article par défaut, affiché lors de l’accès à la rubrique, qui peut ainsi servir de page d’accueil pour celle-ci.

La définition de l’article par défaut se fait dans la page d’édition de la rubrique. L’intérêt est de ne pas afficher une page habituelle de rubrique ( par exemple la liste des derniers articles) mais directement un article choisis dans les sous-rubriques.

Chaque lien du menu crée par la boucle ci-dessous donnera un lien vers un article.

À propos de la méthode utilisée

À noter qu’il est aussi possible de traiter cette problématique avec des boucles, voir par exemple des contribs en variation sur ce thème :
-  Menus contextuels
-  le menu de rubriques de SPIP-Contrib fonctionne aussi comme ça (avec des conditions en plus), cf. le code de cette noisette sur la Zone

Cependant elles ne traitent pas tout à fait ce que je voulais faire. Mon but est simple : associer un article à une rubrique, chaque lien vers cette rubrique sera le lien vers cet article par défaut.

Certes il serait aussi possible de traiter tout cela avec des mots clefs. Mais cette contribution découle de mes travaux pour un gros site (qui devrait avoir au minimum dans les 2000 articles en 3 mois, le temps de la saisie, et avec une arborescence assez complexe, jusqu’à une dizaine de niveau de profondeur. Je gère déjà pas mal de chose avec les mots clefs et j’ai fait cela pour le rédacteur ( ce ne sera pas moi ). Il y a déjà trop de choses réglées avec les mots clefs dans mon site. Pour mes rédacteurs/utilisateurs, presque non initiés a l’informatique, il me parait plus compréhensible de comprendre cette gestion plutôt que de conceptualiser à chaque fois le fonctionnement du site via des mots clefs.

Installation

Cette contrib est basée sur :
-  le Plugin Champs homonymes dont l’installation est nécessaire.
-  la contrib Afficher directement l’article si la rubrique n’en a qu’un

Elle a été développé sur SPIP 1.9.1. et n’a jamais été testé sur aucune autre version ... mais si le plugin « Champ homonyme » fonctionne sur 1.9.2 alors à priori cela devrait aussi fonctionner.

Modifications dans la base de données :

Il faut rajouter un champ ( faites le avec phpMyAdmin ) « article_defaut » dans la table "spip_rubriques" , ce champ est de type "TEXT"

Code PHP et Fichiers a modifier

Fichier : ecrire/inc/rubriques.php

Aprés :

if (!defined("_ECRIRE_INC_VERSION")) return;

Ajoutez :

function articles_enfants()
{
	//cette fonction va nous permettre d'avoir dans un tableau tous les articles sous jacents a une rubrique
	global $id_rubrique;
	//on prend les articles de la rubrique 	
	$temp = spip_mysql_array(spip_query("SELECT concat(id_article,concat('-',titre)) as valeur FROM spip_articles WHERE id_rubrique=".$id_rubrique));
	//on va aller chercher 
		
	foreach ($temp as $val) 
	{
		$liste_articles_tab[]=$val['valeur'];
	}
	
	$temp2=articles_sousrubriques_enfants($id_rubrique);
	$liste_articles_tab=array_merge($liste_articles_tab,$temp2);
	
	$liste_articles=implode(",",$liste_articles_tab);
	return $liste_articles;
}

function articles_sousrubriques_enfants($id_rub,$prefixeTable="")
{
	// $id_rub est l'identifiant de la rubrique passé en paramétre
	// $prefixeTable permet de gérer l'arborescence des rubriques dans l'affichage des articles quand on édite une rubrique

	
	//on récupére toutes les rubriques filles de la rubrique que l'on passe en paramétre
	$rubs = spip_mysql_array(spip_query("SELECT id_rubrique,titre,id_parent FROM spip_rubriques WHERE spip_rubriques.id_parent=".$id_rub));
	
	
	//on vas chercher pour chacune de ces rubriques , les articles que ces rubriques possédent
	foreach ($rubs as $r)
	{	//$r est l'identifiant de la rubrique
		
		$tmp = spip_mysql_array(spip_query("SELECT concat(spip_articles.id_article,concat('-',spip_articles.titre)) as valeur FROM spip_articles,spip_rubriques WHERE spip_rubriques.id_rubrique=spip_articles.id_rubrique AND spip_rubriques.id_rubrique=".$r['id_rubrique']));
		
		
		//permet de gérer le caractére séparateur au début de la chaine affichée
		$prefixeTableLocal=(($prefixeTable)?$prefixeTable." - ":"");
		
		foreach ($tmp as $v){
			$tab_temp[]=$prefixeTableLocal.$r['titre']." - ".$v['valeur'];
		}
		//permet d'avoir toutes les rubriques sous jacentes : appel récursif
		$tab_temp=array_merge($tab_temp,articles_sousrubriques_enfants($r['id_rubrique'],$prefixeTableLocal.$r['titre']));
	}
	
	return $tab_temp;
	
}

Fichier : ecrire/mes_options.php (créer le s’il n’existe pas )
Ajoutez :

vraiment pas térrible comme façon de faire

include ('ecrire/base/serial.php');
global $tables_principales;
$tables_principales['spip_rubriques']['field']['article_defaut']= TEXT";

Fichier : squelettes/mes_fonctions.php (créer le s’il n’existe pas )
ce filtre

//a partir d'un article_defaut dans les rubriques on retourne l'identifiant de l'article
function id_article_defaut($expr){
if (preg_match('/[0-9]+/', $expr,$id))
	return $id[0];
}

Fichier : plugins/champs_homonymes/inc/extra.php

Aprés :

if (!defined("_ECRIRE_INC_VERSION")) return;

Ajoutez :

include_spip('base/db_mysql');
include_spip('inc/rubriques');
include_spip('exec/rubriques_edit');

$GLOBALS['champs_extra'] = Array (
		'rubriques' => Array (
			"article_defaut" => "liste|brut|Choisir un article qui s'affichera sur cette rubrique|".articles_enfants()
		)
	);

Bon c’est presque fini maintenant :)

La gestion de l’article par défaut devrait fonctionné déjà dans la partie privée , et vous pouvez le tester avant de continuer

Squelette a utiliser

Voici un exemple de boucle que j’ai utilisé r afficher toutes les rubriques a partir de la racine :

<BOUCLE_rubriques(RUBRIQUES){racine}_rubrique!=1} {par num titre, titre}>
		<B_articles_defaut_ariane>
			<BOUCLE_articles_defaut_ariane(ARTICLES) {id_article=(#ARTICLE_DEFAUT|id_article_defaut)}>
						<a href="#URL_ARTICLE">[(#_rubriques:TITRE|couper{80})]</a>
					</BOUCLE_articles_defaut_ariane>
			</B_articles_defaut_ariane>
			
				<B_articles_plusdun_ariane>
					<BOUCLE_articles_plusdun_ariane(ARTICLES) {id_rubrique} {1,1}>
						<a href="#_rubriques:URL_RUBRIQUE" >[(#_rubriques:TITRE|couper{80})]</a>
					</BOUCLE_articles_plusdun_ariane>
				</B_articles_plusdun_ariane>
				
					<B_articles_unseul_ariane>
						<BOUCLE_articles_unseul_ariane(ARTICLES) {id_rubrique} {0,1}>
							<a href="#URL_ARTICLE" >[(#_rubriques:TITRE|couper{80})]</a>
						</BOUCLE_articles_unseul_ariane>
					</B_articles_unseul_ariane>
					<a href="#_rubriques:URL_RUBRIQUE" >[(#_rubriques:TITRE|couper{80})]</a>
					<//B_articles_unseul_ariane>
					
				<//B_articles_plusdun_ariane>
			<//B_articles_defaut_ariane>

				</td>

			</BOUCLE_rubriques>

Les boucles montrent bien le fonctionnement décrit dans les principes de la contrib. On pourrait lire de cette façon les boucles en français :

Pour chaque rubriques a partir de la racine
-  si on a un article par défaut alors on affiche le titre de la rubrique avec le lien de l’article par défaut
-  sinon si on a plusieurs articles alors on met le lien de la rubrique avec le titre de la rubrique
-  sinon si on a un seul article dans cette rubrique, cet article est considéré comme l’article par défaut ( lien de l’article avec titre de la rubrique )
-  sinon on met le lien de la rubrique avec le titre de la rubrique

et voilà :)
Voila ce que ca donne dans la partie privée :

TODO :
-  un portage sous forme de plugin, qui évitera de forker les fichiers du core. Ceci permettra de pouvoir faire des mises à jour de son SPIP.

-  l’internationalisation, je n’ai pas travaillé dessus et je l’ai même occulté car cette contrib est destiné a un public francophone.

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom