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

5 discussions

  • Rah désolée zerax mais j’ai pas compris un traitre mot de ce que tu as dit...

    Je suis débutante sous SPIP....

    D’autres ont trouvé un moyen « simple » d’adapter pour spip 2.0 ???

    Merci,

    Cordialement, Estelle.

    Répondre à ce message

  • 1

    Bonjour,

    J’utilise une version de spip 2.0 et j’aimerai savoir comment rendre cette contrib compatible ? J’ai vraiment besoin de ce système pour mon site, et c’est plutôt urgent.

    Si quelqu’un qui s’y connait ca serait cool de m’aider.

    Merci,

    Cordialement, Estelle.

    • Salut, pour ma part j’ai un peu abandonner cette idée du tout article et que les rubriques ne servent que de contenant. Pour la bonne raison que je pense (maintenant) que d’avoir cela est anti-ergonomique (dans les cas que je gère). Maintenant il se peut que ce soit utile pour certains...

      Concernant la mise en place sur SPIP2 : il faut installer le plugin champ extra / interface champ extra pour ne pas avoir a surcharger le core et pour avoir l’interface.

      Dans le cas de cette contrib, j’avais surchargé le fichier inc/rubriques.php et du coup j’avais une liste des articles ... Mais ce n’est pas forcement utile (ca facilite c’est tout).

      Ensuite le squelette (a quelques choses près) doit être fonctionnel. Il suffit d’adapter le filtre id_article_defaut en fonction de la méthode de stockage de l’identifiant de l’article référent de la rubrique.

      Enfin c’est comme ca que je ferai

    Répondre à ce message

  • 2

    Effectivement cette idée de contribution est géniale, un plugin serait parfait car avec la version 1.9.2c cette methode ne marche pas. Domage .... ça m’aurrais sauvé la vie pour le site que je suis en train de faire...
    Ou le projet en est il ??? quelqu’un bosse dessus pour le passer en plugin ou c’est mort ?

    En tout ca merci encore à tous ceux qui donne de leur temps pour faire avancer le devellopement des outils spip

    • Salut,
      alors concernant cette contrib, j’ai abandonné ce principe que je n’ai utilisé que sur un seul site...

      Ceci dit elle fonctionne quand même sur 192d, mais il faut installer le plugin champ homonymes.

      tu as bien suivi le process de modification des fichiers ?

      je pourrais éventuellement le porter en plugin, c’est pas pour le temps que ca prend, mais le principe de modifier le core ( le surcharger en l’occurence, j’aime pas ca ( j’ai fait cette contrib a mes débuts ) ) donc faudrait vraiment arranger tout ca pour le rendre fonctionnel ...

      ca pourrait le faire mais c’est pas dans mes priorités et je doute le faire avant un bon petit moment...

    • Yes super la réponse rapide !

      eh bien j’ai suivi ta méthode à la lettre « pas à pas » et ça me créé des erreurs dans tous les sens.
      J’ai bien intallé et modifier le plug in champs homonyme et j’ai bien créé le champs supplementaire dans la base de données.

      Déjà par exemple j’ai remarqué une erreur dans le code du fichier « mes_fonctions.php »

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

      A priori il manque un " a la fin devant TEXT ??

      sinon après il me met un message d’erreur pour le fichier « Rubrique.php » a la ligne 19 quand j’essaye de creer une nouvelle rubrique...

      Je ne suis malheureusement pas développeur et mes connaissance en php sont trés maigres . Donc pour moi et bcp d’autres sans doute la création d’un plugin est une délivrance, lol :-p

      J’aurrais très souvent besoin de mettre un article par défault dans un rubrique, et j’ai 2/3 amis qui sont à la recherche de la même chose.
      Y’aurrait t’il un moyen d’avoir les fichiers déjà modifiés pour etre sur que ce ne soit pas moi qui est fait des bétises lors de mes copier/coller ?

      En tout cas merci encore de porter un interet à ma demande zerax, c’est sympa :)

    Répondre à ce message

  • 1
    Tonton BP

    Suite à une discussion sur le serveur de news, j’ai proposé la solution que j’utilise.
    J’ai reçu ce message :


    salut Bernard
    je suggère que tu reporte ton message dans le forum de cette contrib
    qui est maintenant publiée ici :

    « http://www.spip-contrib.net/Rubriques-remplacees-par-les »

    cela enrichira le débat et facilitera le suivi pour qui s’intéresse au
    probleme

    @+ NicolasR


    Dont acte


    Cette contrib est intéressante mais un peu compliquée à mon goût. Il pourrait être envisageable de profiter d’un plugin.
    Mais personnellement s’il existe une alternative à un plugin je préfère.

    Voici les boucles que j’utilise, le tout est adapté d’une contribution assez ancienne qui utilisait des bouts de codes PHP qui sont désormais inutiles grâce à la notion de balise non ambiguë.

    J’utilise ce code dans le cadre de formations que j’anime, car il permet de cumuler :

    • Notion de boucle conditionnelle
    • Compréhension de la notion de contexte SPIP
    • Utilisation des balises non ambiguës.
      A noter la balise #EDIT que tu peut retirer si tu n’a pas l’intention d’utiliser le plugin crayon. Cela dit je te conseille de la laisser - tu en aura probablement besoin pour SPIP 2.0
    <!--  Affichage du titre de la rubrique en cours -->
    <BOUCLE_rubrique1(RUBRIQUES) {id_rubrique}>
            <h1 class="#EDIT{titre} titre">[(#TITRE|supprimer_numero)]</h1>
    </BOUCLE_rubrique1>
    <!-- **************************************************** -->
    <!-- Affichage des sous-rubriques de la rubrique -->
    <!-- si dans une rubrique, il n'y a qu'un seul article -->
    <!-- on va directement à ce dernier en cliquant sur le titre de la rubrique -->
    <BOUCLE_sous_rubriques1(RUBRIQUES) {id_parent} {par num titre}>
    <!-- on teste s'il existe un deuxième article dans la rubrique -->
         <BOUCLE_articles_plusdun(ARTICLES) {id_rubrique} {1,1}>
    <!-- si oui on affiche le titre de la rubrique qui pointe vers la rubrique (comme normal) -->
    <!-- Utilisation de la notion de balise non ambiguë pour afficher le titre de la rubrique qui pointe vers la rubrique -->
            <a href="[(#URL_RUBRIQUE)]" title="[(#_sous_rubriques1:DESCRIPTIF|textebrut|entites_html)]"> [(#_sous_rubriques1:TITRE|supprimer_numero)]</a>
    <!-- On est dans le contexte de l'article, pour afficher le descriptif de la rubrique-->
    <!-- Il faut remonter au contexte de la rubrique -->
                <BOUCLE_rubart1(RUBRIQUES) {id_rubrique}>
                <ul class="#EDIT{descriptif} descriptif"> [(#DESCRIPTIF)]</ul>
                </BOUCLE_rubart1>
        </BOUCLE_articles_plusdun>
    <!-- **************************************************** -->
    <!-- si non on teste s'il y a au moins un article -->   
           <BOUCLE_articles_unseul(ARTICLES) {id_rubrique} {0,1}>
    <!-- Utilisation de la notion de balise non ambiguë pour afficher le titre de la rubrique qui pointe vers l'article -->
               <a href="[(#URL_ARTICLE)]" title="[(#_sous_rubriques1:DESCRIPTIF|textebrut|entites_html)]"> [(#_sous_rubriques1:TITRE|supprimer_numero)]</a> |
                [(#TITRE|supprimer_numero)]
                <ul> [(#DESCRIPTIF)] </ul>
        </BOUCLE_articles_unseul>  
    <!-- s'il n'y a aucun article on affiche le titre de la rubrique qui pointe vers la rubrique (comme normal) -->
    <!-- Utilisation de la notion de balise non ambiguë pour afficher le titre de la rubrique qui pointe vers la rubrique -->
            <a href="[(#URL_RUBRIQUE)]" title="[(#_sous_rubriques1:DESCRIPTIF|textebrut|entites_html)]"> [(#_sous_rubriques1:TITRE|supprimer_numero)]</a>
            <ul class="#EDIT{descriptif} descriptif"> [(#DESCRIPTIF)]</ul>
        <//B_articles_unseul>
    <//B_articles_plusdun>
    
    </BOUCLE_sous_rubriques1>   
    <!-- ******************************************** -->
    
    <!--  Affichage des articles de la rubrique en cours s'il y en a -->
    <BOUCLE_articles(ARTICLES) {id_rubrique} {par num titre}>
    <a href="#URL_ARTICLE" title="[(#DESCRIPTIF|textebrut|entites_html)]">
                [(#TITRE|supprimer_numero)]</a>
                <ul class="#EDIT{descriptif} descriptif">[(#DESCRIPTIF)] </ul>
    </BOUCLE_articles>
    • Salut,
      effectivement ce code convient dans la pluspart des cas. Mais a aucun moment tu te donne le choix de l’article qui sera affiché par défaut. A mon sens (d’aprés ce que je viens de lire, et si j’ai bien compris), cela ne rajoute pas grand chose a la contrib

      Je ne pense pas utile le fait d’avoir cette fonctionnalité dans le core. Ceci dit le fait de l’avoir en plugin serait a mon avis interessant.

      Par contre il faudrait que je refasse le squelette rubrique.html,dans le cas d’une mise a jour avec ce plugin, pour ne pas perdre le référencement sur ces rubriques, car dans mon cas je n’ai jamais de lien vers les rubriques. Dans mon cas ce n’est pas génant vu que le site n’est pas encore en production, donc pas encore indéxé.

    Répondre à ce message

  • 5

    Le plus souvent l’utilisation du descriptif de la rubrique devrait suffire pour donner un contenu au contenant. Non ?

    • effectivement l’utilisation du descritif , ou éventuellement la liste des articles de la rubrique ( ou des sous rubriques ) permet d’avoir du contenu ...
      Mais mon but n’était pas d’avoir un contenu de type descriptif mais de type article.

      Voila tout :)
      c’est simplement une question d’organisation, j’avais besoin de l’avoir comme ca.

    • Et dieu sait qu’on est beaucoup à en avoir besoin...

    • et bien c’est le but de cette contrib ... par contre j’insiste sur le point qu’il faudrait le porter en plugin donc les bonnes volontés sont les bienvenues pour faire cela.

      En ce qui me concerne ce ne pourra pas se faire de suite, mais je veux bien aider :)

      le but c’est aussi et surtout que ca fonctionne sur une 1.9.2 et plus si possible ...

      autre chose j’attends aussi vos retours d’expériences, pour voir si ca marche pour vous, si vous avez eu des soucis a l’installation, bref essayez le et dites moi ce que vous en pensez

    • Pieropaolo

      Il est possible aussi d’utiliser les mots clés et un squelette approprié pour avoir un article qui est assigné au contenu de la page rubrique.
      J’ai expérimenté cela. C’est assez facile et ne nécessite aucun « code ».

      Si ça n’est pas posté ailleurs, je peux faire un post sur cette technique.

    • comme c’est indiqué dans la contrib, il est effectivement possible de gérer cela avec les mots clefs, ca fait partie des remarques faites avant la publication de cet article.

      Mais un des « inconvénients » de spip est que les mots clefs servent a faire un peu tout... du coup pour le rédacteur, c’est un peu confu.

      Donc gérer cela de la sorte lui facilite la vie.
      C’est quand même plus simple a appréhender comme ca qu’avec des mots clefs...

    Répondre à ce message

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