Comment je me suis créé une boucle ARTICLES_RUBRIQUES
Publi� le 13 octobre 2005

MAJ : Le problème a été résolu par une nouvelle contrib mais un petit soucis subsiste au niveau de l'ordre. Cet article est donc à prendre comme un tutoriel pour créer une boucle basée sur une nouvelle table.

J'avais la problématique suivante :

Sur un site construit avec SPIP, j'avais besoin d'afficher par ordre de création, les articles et les sous rubriques d'une rubrique donnée, de sorte que, l'ordre de l'union des articles et des sous rubriques soit cohérent (ordre par date croissante). Déjà, exit les boucles ARTICLES et RUBRIQUES à la suite. Il me fallait créer une nouvelle boucle, ce qui n'est pas une mince affaire.

D'abord, je devais créer une nouvelle table qui est l'union entre les tables spip_articles et spip_rubriques, enfin, je voulait dire une vue car je souhaitais que ma nouvelle table reflète en temps réel le contenu des tables sources. Seulement, les vues ne sont implémentées que dans MySQL5. Alors il ne me reste plus qu'à remplir la nouvelle table "à la main".

Pour la procédure, il faut commencer par créer la table spip_articles_rubriques. Ensuite, on définit la boucle ARTICLES_RUBRIQUES et la variable #URL_ARTICLE_RUBRIQUE.

A mettre dans mes_fonctions.php3 :

<?php
//balluche:11/10/2005:Création d'une boucle ARTICLES_RUBRIQUES
/* CREATE TABLE spip_articles_rubriques (
id_article_rubrique bigint(21) NOT NULL auto_increment,
type enum('article','rubrique') NOT NULL default 'article',
id_origine bigint(21) NOT NULL default '0',
id_rubrique bigint(21) NOT NULL default '0',
titre text NOT NULL,
descriptif text NOT NULL,
texte longblob NOT NULL,
date datetime NOT NULL default '0000-00-00 00:00:00',
statut varchar(10) NOT NULL default '0',
id_secteur bigint(21) NOT NULL default '0',
maj timestamp(14) NOT NULL,
lang varchar(10) NOT NULL default '',
langue_choisie char(3) default 'non',
extra longblob,
url_propre varchar(255) NOT NULL default '',
PRIMARY KEY (id_article_rubrique),
KEY id_rubrique (id_rubrique),
KEY id_secteur (id_secteur),
KEY lang (lang),
KEY statut (statut,date),
KEY url_propre (url_propre),
KEY id_origine (id_origine),
KEY type (type)
) ENGINE=MyISAM;
*/
spip_get_lock('spip_articles_rubriques', 10 );
spip_query("TRUNCATE TABLE spip_articles_rubriques" );
spip_query("INSERT INTO spip_articles_rubriques SELECT NULL, 'article', id_article, id_rubrique, titre, descriptif, texte, date, statut, id_secteur, maj, lang, langue_choisie, extra, url_propre from spip_articles" );
spip_query("INSERT INTO spip_articles_rubriques SELECT NULL, 'rubrique', id_rubrique, id_parent, titre, descriptif, texte, date, statut, id_secteur, maj, lang, langue_choisie, extra, url_propre from spip_rubriques" );
spip_release_lock('spip_articles_rubriques' );

//inc_serial_base
include_ecrire ('inc_serialbase.php3');
global
$tables_principales;
$spip_articles_rubriques = array(
"id_article_rubrique" => "bigint(21) NOT NULL",
"type" => "enum('article', 'rubrique')",
"id_origine" => "bigint(21) NOT NULL",
"id_rubrique" => "bigint(21) NOT NULL",
"titre" => "text NOT NULL",
"descriptif" => "text NOT NULL",
"texte" => "longblob NOT NULL",
"date" => "datetime NOT NULL",
"statut" => "varchar(10) NOT NULL",
"id_secteur" => "bigint(21) NOT NULL",
"maj" => "timestamp(14) NOT NULL",
"lang" => "varchar(10) NOT NULL",
"langue_choisie" => "char(3)",
"extra" => "longblob",
"url_propre" => "varchar(255) NOT NULL");

$spip_articles_rubriques_key = array(
"PRIMARY KEY" => "id_article_rubrique",
"KEY type" => "type",
"KEY id_origine" => "id_origine",
"KEY id_rubrique" => "id_rubrique",
"KEY id_secteur" => "id_secteur",
"KEY lang" => "lang",
"KEY statut" => "statut, date",
"KEY url_propre" => "url_propre");

$tables_principales['articles_rubriques']=array('field' => &$spip_articles_rubriques, 'key' => &$spip_articles_rubriques_key);

//Récupération de la balise URL_ARTICLE_RUBRIQUE
function balise_URL_ARTICLE_RUBRIQUE($p) {
if (
champ_sql('type',$p) == 'article')
$p->code = "generer_url_article(" . champ_sql('id_origine',$p) . ")" ;
else
$p->code = "generer_url_rubrique(" . champ_sql('id_origine',$p) . ")" ;
if (
$p->boucles[$p->nom_boucle ? $p->nom_boucle : $p->id_boucle]->hash)
$p->code = "url_var_recherche(" . $p->code . ")";

$p->statut = 'html';
return
$p;
}

Forum de l'article

# 60 Comment je me suis créé une boucle ARTICLES_RUBRIQUES 14 octobre 2005
Ca doit ramer un max, non ?
# 61 Comment je me suis créé une boucle ARTICLES_RUBRIQUES 14 octobre 2005, par Frédéric
L'insertion dans la table spip_articles_rubriques peut se faire une fois pour toutes, ou à intervales réguliers. Cà s'rait plus simple avec MySQL5 ou autre SGBD plus performant.
# 65 Comment je me suis créé une boucle ARTICLES_RUBRIQUES 22 octobre 2005, par Frédéric
Je t'ai reconnu mortimer ...
# 437 Comment je me suis créé une boucle ARTICLES_RUBRIQUES 15 août 2007, par Cyril

Salut, Merci pour ton exemple. Est-ce que à ton avis c'est possible d'utiliser comme balise SPIP dans une boucle, des champs calculés à partir d'une requete ? Dans ton exemple la balise #URL_ARTICLE_RUBRIQUE serait calculée à partir de la requete mysql...

Merci d'avance, A+ Cyril

# 444 Comment je me suis créé une boucle ARTICLES_RUBRIQUES 28 août 2007, par Frédéric
Pour cela il suffit de créer une vue [1]. C'est d'ailleurs ce que j'aurais fait si j'avais eu MySQL5 à l'époque.
Poster un message

[1] à partir de MySQL5. Cela ne devrait poser aucun problème à partir des hébergeurs actuels