dimanche 1er avril 2012 (), par
Si le squelette fourni par défaut ne vous convient pas et qu’aucun squelette disponible sur le web ne vous plaît, vous devrez éditer vous-même le squelette et les feuilles de style de SPIP, à moins que vous ne préfériez reprendre tout depuis le début et construire votre propre squelette.
Les pages HTML utilisées par le squelette par défaut sont dans le répertoire squelettes-dist, à la racine de spip.
Outre la syntaxe du langage HTML et le fonctionnement des feuilles de style CSS (lequel est abordé ici), vous devrez apprendre à maîtriser, ou du moins comprendre, la syntaxe et le fonctionnement des boucles SPIP, instructions qui indiquent à SPIP quelles données (champs) aller chercher dans la base et afficher.
Ces boucles sont fort heureusement dans un langage simple, ce qui évite de faire soi-même des requêtes SQL complexes.
Les commentaires sont indiqués par la balise REM [(#REM) Inclusion de la page de garde, qui correspond a la rubrique 1 ]
Prenons comme exemple la boucle affichant les derniers articles, en page de garde de ce site :
<B_articles_recents>
<div id="derniers_articles" class="menu articles">
[(#ANCRE_PAGINATION)]
<h2><:derniers_articles:></h2>
<ul>
<BOUCLE_articles_recents(ARTICLES) {par date}{inverse} {pagination 10}>
<li class="hentry">
[(#LOGO_ARTICLE_RUBRIQUE{#URL_ARTICLE}|image_reduire{75,45})]
<h3 class="entry-title"><a href="#URL_ARTICLE" rel="bookmark">#TITRE</a> - <small>[(#DATE|affdate_jourcourt)]<!-- [, <:par_auteur:> (#LESAUTEURS)] --></small></h3>
<!-- [<div class="#EDIT{intro} introduction entry-content">(#DESCRIPTIF)</div>] -->
</li>
</BOUCLE_articles_recents>
</ul>
[<p class="pagination">(#PAGINATION{page_precedent_suivant_garde})</p>]
</div>
</B_articles_recents>
On peut voir :
<B_articles_recents> </B_articles_recents>
C’est une simple déclaration<BOUCLE_articles_recents(ARTICLES) {par date}{inverse} {pagination 10}></BOUCLE_articles_recents>
. Ici, on donne des paramètres à la boucle.<li class="hentry">
[(#LOGO_ARTICLE_RUBRIQUE{#URL_ARTICLE}|image_reduire{75,45})]
<h3 class="entry-title"><a href="#URL_ARTICLE" rel="bookmark">#TITRE</a> - <small>[(#DATE|affdate_jourcourt)]<!-- [, <:par_auteur:> (#LESAUTEURS)] --></small></h3>
<!-- [<div class="#EDIT{intro} introduction entry-content">(#DESCRIPTIF)</div>] -->
</li>
On affiche :
image_reduire{75,45}
afin de réduire sa largeur maximale à 75 et hauteur maximale à 45 pixels.<!-- -->
.exemple : <BOUCLE_articles_recents(ARTICLES) {par date}{inverse} {pagination 10}>
( )
d’interroger la table ARTICLES
(on aurait pu interroger la table RUBRIQUES
).{ }
plusieurs critères de filtre ou tri : {par date}{inverse}
pour trier par ordre chronologique, en partant du plus récent, {pagination 10}
pour ne prendre que les 10 premiers.Ce qui permet d’utiliser le système de pagination de SPIP un peu plus loin dans la boucle, après la fermeture de la boucle de données mais avant celle de la boucle générale :
[<p class="pagination">(#PAGINATION{page_precedent_suivant_garde})</p>]
ici, on affiche la pagination, en utilisant un modèle particulier (que j’ai spécialement créé, mais je détaillerais plus loin).
Les paramètres possibles sont, entre autres pour les ARTICLES :
{id_rubrique}
{par date}{inverse}
comme vu plus haut, tri chronologique inverse.{par titre}
par ordre alphabétique{par num titre]
alphanumérique (nombres romains et arabes){par hasard}
au hasard{par num titre, titre}
avec plusieurs critères de tri{pagination}
en précisant éventuellement le nombre (par défaut, c’est 5) {pagination 10}
Les paramètres possibles sont, entre autres pour les RUBRIQUES :
{id_parent}
Les champs possibles sont, entre autres pour les ARTICLES :
image_reduire{largeur_max_en_pixels,hauteur_max_en_pixels}
<a href="#URL_SITE" target="_blank">#NOM_SITE</a>
, le lien s’ouvrira dans une nouvelle fenêtre ou un nouvel onglet.Les champs possibles sont, entre autres pour les RUBRIQUES :
Pour filtrer un champ, on indique #NOM_CHAMP|filtre (pour faire le "|", barre verticale plus communément nommée "pipe", c’est alt gr + 6 sur les claviers azerty)
la liste des champs et de leurs filtres étant assez conséquente, je vous invite à consulter la documentation de SPIP pour plus de détails.
Il est possible d’imbriquer des boucles, par exemple pour avoir les articles ou sous rubriques d’une rubrique.
La règle d’imbrication des balises SPIP est la même que pour les balises HTML : pas de chevauchement, mais garder une structure hiérarchique.
Concrètement, si on ouvre gras puis souligné <b><u>
il faudra fermer souligné, puis gras, car la balise souligné est à l’intérieur du bloc gras </u></b>
.
C’est la même chose pour les balise d’ouverture <BOUCLE_nom(TABLE){parametre}>
et de fermeture </BOUCLE_nom>
des boucles générales et de données.
On peut créer des fichiers de squelette pour certaines rubriques et certains articles en particuliers :
Ces fichiers seront traités dans un ordre précis. Voir la documentation de spip pour plus de détails.
Afin de limiter la multiplication du code source, il est possible de déclarer un code "commun" à plusieurs pages dans un fichier, puis de l’inclure.
Par exemple, la page d’index du site charge par défaut le squelette de sommaire. Or, ici, le sommaire et la rubrique 1 (accueil) sont la même chose.
Dans le squelette sommaire, j’inclus donc simplement le squelette de la rubrique 1
[(#REM) Inclusion de la page de garde, qui correspond a la rubrique 1 ]
<INCLURE{fond=rubrique=1}>
De même, on peut remarquer dans chaque page du squelette l’inclusion de l’entête HTML, qui joint les fichiers css et javascript à la page, et déclare des méta-données.
<INCLURE{fond=inc-head}>
On peut ainsi inclure des blocs communs à toutes les pages :
<INCLURE{fond=inc-entete}>
l’entête du site avec son titre et/ou logo et/ou descriptif<INCLURE{fond=inc-rubriques}>
un menu de navigation latéral, (ici, incluant une barre de recherche)<INCLURE{fond=inc-pied}{skel=#SQUELETTE}>
le pied de page, avec les liens de connexion à l’interface privée, de contact, de lecture du squelette...Et dans certaines pages, en l’occurrence les pages articles, qui ouvrent une boucle sur l’article, inclusion d’un bloc "dans la même rubrique", auquel on passe en paramètre l’identifiant de la rubrique dans laquelle est l’article.
<INCLURE{fond=inc-extra}{id_rubrique}>
Dans le répertoire modeles du repertoire prive de spip, il y a différents...modèles de blocs, dont plusieurs styles de pagination, permettant d’afficher "précédent"/"suivant", "page précédente"/"page suivante", d’utiliser des flèches...
Le modèle particulier auquel il est fait référence répond à un besoin précis : la paginantion en page sommaire correspond en fait à celle de la rubrique 1 (Accueil).
j’ai donc inclus ce paramètre dans le modèle, afin de générer le bon lien de pagination.
#SET{urlrubrik,spip.php?rubrique1}
[<a href='[(#GET{urlrubrik}|parametre_url{#ENV{debut},''})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{premiere}|>{1}|?{'...',''})</a> #GET*{separateur}]
#SET{i,#ENV{page_courante}|moins{1}}
[(#GET{i}|>{0}|?{' ',''})[
(#SET{item, #GET{i}|moins{1}|mult{#ENV{pas}} })
][(#INCLURE{fond=modeles/paginationitem}{num=#GET{i}}{texte='<'}{separateur=#GET*{separateur}}{url=#GET{urlrubrik}|parametre_url{#ENV{debut},#GET{item}}|ancre_url{#ENV{ancre}}}{page_courante=#ENV{page_courante}}{derniere=#ENV{derniere}})]
]
...
...
...
#SET{i,#ENV{page_courante}|plus{1}}
[(#GET{i}|<{#ENV{nombre_pages}}|?{' ',''})[
(#SET{item, #GET{i}|moins{1}|mult{#ENV{pas}} })
][#GET*{separateur} (#INCLURE{fond=modeles/paginationitem}{num=#GET{i}}{texte='>'}{separateur=''}{url=#GET{urlrubrik}|parametre_url{#ENV{debut},#GET{item}}|ancre_url{#ENV{ancre}}}{page_courante=#ENV{page_courante}}{derniere=#ENV{derniere}})]
]
[#GET*{separateur} <a href='[(#GET{urlrubrik}|parametre_url{#ENV{debut},#ENV{nombre_pages}|moins{1}|mult{#ENV{pas}}})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{derniere}|<{#ENV{nombre_pages}}|?{'...',''})</a>]
Bien que dans ce cas le paramètre soit indiqué "en dur", ce qui est plus simple pour un modèle d’une pagination unique, on peut l’envoyer lors de l’appel du modèle :
[(#REM) pagination avec lien direct sur article : div h fixe ]
<B_pagination_articles>
<BOUCLE_pagination_articles(ARTICLES){id_rubrique}{par num soustitre}{pagination 1}>
#PAGINATION{page_precedent_suivant_artiste,env,urlrubrik=spip.php?rubrique#ID_RUBRIQUE}
</BOUCLE_pagination_articles>
</B_pagination_articles>
Puis récupérer l’information dans le modèle :
[<a href='[(#ENV{urlrubrik}|parametre_url{#ENV{debut},''})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{premiere}|>{1}|?{'...',''})</a> #GET*{separateur}]
#SET{i,#ENV{page_courante}|moins{1}}
[(#GET{i}|>{0}|?{' ',''})[
(#SET{item, #GET{i}|moins{1}|mult{#ENV{pas}} })
][(#INCLURE{fond=modeles/paginationitem}{num=#GET{i}}{texte='<'}{separateur=#GET*{separateur}}{url=#ENV{urlrubrik}|parametre_url{#ENV{debut},#GET{item}}|ancre_url{#ENV{ancre}}}{page_courante=#ENV{page_courante}}{derniere=#ENV{derniere}})]
]
...
...
...
#SET{i,#ENV{page_courante}|plus{1}}
[(#GET{i}|<{#ENV{nombre_pages}}|?{' ',''})[
(#SET{item, #GET{i}|moins{1}|mult{#ENV{pas}} })
][#GET*{separateur} (#INCLURE{fond=modeles/paginationitem}{num=#GET{i}}{texte='>'}{separateur=''}{url=#ENV{urlrubrik}|parametre_url{#ENV{debut},#GET{item}}|ancre_url{#ENV{ancre}}}{page_courante=#ENV{page_courante}}{derniere=#ENV{derniere}})]
]
[#GET*{separateur} <a href='[(#ENV{urlrubrik}|parametre_url{#ENV{debut},#ENV{nombre_pages}|moins{1}|mult{#ENV{pas}}})]##ENV{ancre}' class='lien_pagination' rel='nofollow'>(#GET{derniere}|<{#ENV{nombre_pages}}|?{'...',''})</a>]