Pages uniques

Allez, avouez... il ne vous est jamais arrivé d’avoir besoin d’articles qui ne sont rattachés à aucun rubriquage particulier ? Des articles uniques, n’ayant ni de thème, ni de rapport avec aucun autre ? Ou encore des articles pour lesquels vous avez besoin de faire un squelette particulier mais dont le contenu doit rester modifiable classiquement dans l’interface privée ?

Des pages, en quelque sorte. Des pages uniques rattachées à rien.

On a tous utilisé des bidouilles devenues des habitudes, que ce soit en se basant sur des mots-clés « techniques » ou bien en créant une rubrique « fourre-tout » que l’on devait ensuite rendre invisible dans tous nos squelettes en mettant {id_rubrique!=1}, par exemple.

Ce plugin propose de faire tout cela de manière plus propre et plus pratique.
On peut alors l’utiliser pour créer des pages de notice légale, d’à-propos, ou encore de contact.

Créer des pages

Le plugin ajoute une entrée « Pages uniques » dans le menu « Édition ».

On arrive sur une liste des pages déjà créées. Accolée à une boite permettant d’en ajouter de nouvelles.

Le formulaire de création d’une page est le même que celui d’un article. Sauf qu’on n’a pas à choisir de rubrique. À la place, on désigne un nom de page (qui peut être, par exemple, le nom d’un squelette).

Afficher les pages sur son site

C’est très simple, puisque les pages sont des articles comme les autres, ils n’ont juste pas de rubrique [1] .

Vous pouvez donc :

  • Utiliser une boucle classique <BOUCLE_art(ARTICLES){id_article=38}>#URL_ARTICLE</BOUCLE_art>
  • Utiliser les raccourcis dans les textes [->art38]
  • Cela utilisera donc le squelette normal « article.html »

Mais les pages uniques ont aussi un champ « page » ! Qui peut être utilisé de plusieurs manières pour récupérer habilement ses pages.

Imaginons que l’on ait créé une page « Notice légale » avec le mot « legal » dans le champ « page ». On peut alors :

  • Faire une boucle <BOUCLE_legal(ARTICLES){page=legal}>#TEXTE</BOUCLE_legal>
  • Et mieux encore, avoir un squelette « legal.html » dédié, dans lequel on n’a plus qu’à faire <BOUCLE_legal(ARTICLES){page}>

Lorsqu’on veut juste l’URL, il existe aussi la balise #URL_PAGE_UNIQUE{identifiant} qui permet de retourner l’#URL_ARTICLE mais depuis l’identifiant textuel donné à la page.

Notes

[1Chaque page unique a un id_rubrique=-1 : on peut les filtrer/éliminer d’une boucle article par le critère {id_rubrique>0} ou plus simplement {page=''}

Dernière modification de cette page le 13 février 2019

Discussion

88 discussions

  • Bonjour

    Merci beaucoup pour ce plugin très pratique !

    Je voulais savoir s’il était possible de modifier les url d’appel des pages uniques pour avec de belles urls avec le titre de la page plutôt qu’une variable ?page=legal (par exemple)

    Avec les urls qs lorsque j’appelle monsite.fr/ ?mentions-legales je tombe sur une erreur 404 alors que c’est bien le nom de mon article (et que pour les autres articles cela marche).
    Doit-on forcément appeler le squelette via l’url même si on l’appelle dans la boucle de l’article ?

    Bonne continuation

    Répondre à ce message

  • 2

    Les pages uniques n’apparaissent pas dans le sitemap.xml généré automatiquement par spip et que l’on trouve par http://mondomaine/sitemap.xml

    Le sitemap.xml étant important pour le SEO depuis les Google Webmasters Tools, l’absences des pages uniques est franchement gênant.

    Une idée de comment améliorer les choses et notamment en sachant quel(s) fichier(s) modifier pour que le sitemap généré soit complet ?

    Merci d’avance,

    Hervé

    • Bah en surchargeant le squelette du sitemap.

    • Merci de ta réponse.

      en fait, j’ai trouvé tout seul qu’il fallait modifier /squelettes/sitemap.xml.html, mais je n’avais pas eu l’indiquer en répondant à ma propre réponse.

    Répondre à ce message

  • 2
    stefdn

    Bonjour,

    Les contenus des pages uniques ne sont pas indexés par le plugin Fulltext :
    -  2 articles identiques, l’un en Page , l’autre « normal » dans une rubrique ;
    -  recherche Fulltext sur un bout de phrase entre guillemets ;
    -  seul l’article « normal » ressort.

    Comme je n’ai pas trouvé grand chose sur le sujet :o/ je me demande si c’est normal ? Y a-t-il un moyen de les indexer ?

    Merci pour vos lumières


    -  Apache/2.2.22 (Debian)
    -  MySQL : 5.5.47-0+deb7uw-log
    -  Extension PHP : mysqli
    -  PHP Version 5.4.45-0+deb7u2

    -  SPIP 3.1.1 [22913]
    -  Fulltext 1.1.11
    - - /.../.../pdftotext
    -  Pages 1.3.0

    • Fulltext n’indexe rien du tout, enfin pas comme tu le penses là, c’est une recherche direct dans les tables demandées.

      Ya pas de « boucle Fulltext » quoi , ce sont des boucles (ARTICLES) ou autres habituelles.

      Par contre par défaut les boucles d’articles ne sortent PAS les pages uniques, tant que tu n’as pas de critère {tout}, {page} ou {id_rubrique}. Mais pour « page » par exemple, tu peux mettre le «  ? » pour que ce ne soit pas appliqué par défaut, ça fera quand même faire apparaitre les pages à priori.

    • stefdn

      Merci !

      Sur une boucle ARTICLES {recherche}, sortie de la dist, le critère {page?} ne retourne rien

      Par contre, {tout} passe :o)

    Répondre à ce message

  • Pour info : deux notices sous SPIP 3.1.1 lorsque l’on est en edition d’article dans le B.O.

    Notice : Undefined index : champ_page in plugins/auto/pages/v1.3.0/pages_pipelines.php on line 187

    Notice : Undefined index : champ_page in plugins/auto/pages/v1.3.0/pages_pipelines.php on line 192

    Répondre à ce message

  • À la place (de rubrique), on désigne un nom de page (qui peut être, par exemple, le nom d’un squelette).

    Je ne comprends pas très bien ce qu’il faut mettre… je peux mettre le nom d’une rubrique quelconque ?

    Répondre à ce message

  • 4

    Merci pour ce plugin qui fait partie des « incontournables »

    Sur un site 3.0.17 + plugin pages à jour (svn) sur lequel je viens d’installer ce plugin, je constate un dysfonctionnement : lorsque je veux créer une page, après avoir saisi l’article + cliqué sur Entegistrer, j’ai le message d’erreur ci-dessous

    Accès interdit

    Vous n’avez pas le droit d’accéder à la page article_edit.

    Et l’article ne se créé pas

    C’est grave, docteur ? Où dois-je chercher ? Un bug quelque part ?

    • Résolu : L’erreur observée semblait liée à l’absence de l’écran de sécurité (machine locale). En le mettant en place, c’est OK.
      Pour comprendre ce qu’il se passe, quelle est l’interaction entre l’écran de sécurité et cette création de pages uniques ?

    • Euh aucune idée, je ne vois pas le rapport. :)

    • En fait, c’est une recherche google sur "accès interdit vous n’avez pas accès etc…) qui m’a fait aboutir à
      https://www.mail-archive.com/spip-zone@rezo.net/msg34888.html

      Dans le fil, le 3è message parle de cette histoire d’écran de sécurité.

      Du coup, pas plus persuadé que ça que ça puisse avoir un rapport, juste pour voir, j’ai mis en place l’écran. Et là, paf !, plus de message d’erreur et la page est bien créée….

      Il semble donc qu’il y ait tout de même une interférence.

    • Après essai et observation, le message s’affiche quand aucune rubrique n’existe dans la base.
      Après avoir installé un spip 3.0.20 tout neuf, installé le plugin « Pages », si on se rend dans le menu « Edition » puis « Pages uniques » on trouve le message

      Il n’y a aucune page pour l’instant

      Un clic sur « Créer une nouvelle page » et là on a le message :

      Vous n’avez pas le droit d’accéder à la page article_edit.

      .
      Il faut après les installation, créer réellement une rubrique pour pouvoir créer une page unique, voir même aller jusque dans la table spip_rubriques pour lui affecté l’ID -1.

    Répondre à ce message

  • 4

    Bonjour,

    En squellette sommaire.html, j’ai une boucle qui liste les articles d’un mot-clé « carreau »,
    mais je ne comprend pas pourquoi il ne liste pas les pages uniques portant ce même mot-clé « carreau ».

    voici ma boucle :

    <BOUCLE_carreaux(ARTICLES) {titre_mot=carreau}> 
     
    #TITRE<br>
    [(#LOGO_ARTICLE{#URL_ARTICLE})]
     
    </BOUCLE_carreaux>

    Une idée ?

    Merci d’avance.

    • parce que le principe des pages uniques est d’etre exclus des boucles articles, sauf si on demande explicitement un id_article précis ou une page précise.

      Actuellement je ne vois pas de solution « propre » pour obtenir ton comportement. Il y a bien {id_article?} mais c’est risqué, car si tu a un id_article passé en environnement, ca pète.

      Donc il faudrait améliorer le plugin. Rastapopoulos, que pense tu d’un critère {page_peu_importe} ?

    • Euh, il suffit juste d’utiliser le critère {tout}.

    • a oui, j’ai loupé cela en relisant le code. donc j’ai rien dit ;-) donc Fennec72 tu a ta réponse.

    • c’était bien cela :

      <BOUCLE_carreaux(ARTICLES) {tout}{titre_mot=carreau}> 
       
      #TITRE<br>
      [(#LOGO_ARTICLE{#URL_ARTICLE})]
       
      </BOUCLE_carreaux>

      Merci

    Répondre à ce message

  • 1

    Bonjour,

    Voici une petite astuce (mais il y en a certainement d’autres...) pour appliquer automatiquement une composition à tous vos articles uniques.

    Déterminer une composition d’article « article_unique » héritée d’une composition de rubrique, n’est pas possible puisque par définition les articles uniques n’ont pas de rubrique. La composition « article_unique » doit donc être appliquée individuellement à tous les articles uniques, ou alors être appliquée globalement à tous les articles qui n’ont pas de rubrique si on modifie légèrement la boucle article Z d’origine...

    La boucle article Z d’origine ...

    <BOUCLE_principale_article(ARTICLES){id_article}>
    <INCLURE{fond=structure,env,id_rubrique=#ENV{id_rubrique,#ID_RUBRIQUE},id_secteur=#ID_SECTEUR,type-page=article,composition=#COMPOSITION} ></INCLURE>
    </BOUCLE_principale_article>

    ...produit pour un article unique le code html suivant :

    <html class="page_article ltr fr no-js" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">

    La boucle article modifiée incluant un test sur l’id_rubrique...

    <BOUCLE_principale_article(ARTICLES){id_article}>[(#ID_RUBRIQUE|>{0}|?{#SET{composition,#COMPOSITION},#SET{composition,page_unique}})]
    <INCLURE{fond=structure,env,id_rubrique=#ENV{id_rubrique,#ID_RUBRIQUE},id_secteur=#ID_SECTEUR,type-page=article,composition=#GET{composition}} ></INCLURE>
    </BOUCLE_principale_article>

    ...produit le code html suivant avec les class qui vont bien :

    <html class="page_article article_page_unique composition_page_unique ltr fr no-js" xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr" dir="ltr">

    Bonne utilisation ;-)
    Cyril

    • Merci, je cherchais à résoudre ce problème de composition avec sarkaspipr, et c’est la bonne et unique solution
      ++

    Répondre à ce message

  • 7

    Mais les pages uniques ont aussi un champ « page » ! Qui peut être utilisé de plusieurs manières pour récupérer habilement ses pages.

    Imaginons que l’on ait créé une page « Notice légale » avec le mot « legal » dans le champ « page ». On peut alors :

    • Faire une boucle <BOUCLE_legal(ARTICLES){page=legal}>#TEXTE</BOUCLE_legal>
    • Et mieux encore, avoir un squelette « legal.html » dédié, dans lequel on n’a plus qu’à faire <BOUCLE_legal(ARTICLES){page}>

    Simplement bluffant ! Je me demandais s’il n’y avait pas une erreur dans le dernier code et par quelle magie... Bah oui, c’est bien rusé d’avoir choisi « page » pour ce champ car le squelette est appelé par l’adresse spip.php?page=legal et du coup on a #ENV{page} qui vaut justement « legal » et la seconde boucle dans ce contexte vaut la première ;-)

    • Ouais, sauf que cette partie va sûrement changer dans une prochaine version, car le nom de ce champ est justement trop problématique. Le nom « page » est utilisé dans plein d’endroits comme variable d’environnement de SPIP et du coup ça fait des conflits dans plusieurs contextes, notamment pour des formulaires.

      On changera sûrement pour « identifiant », ce qui uniformisera avec Menus, Formidable, etc. Et dans le même temps j’ajouterais le choix automatique du squelette du même nom que l’identifiant s’il existe. Du coup pas besoin d’utiliser des URLs super-moches « page=truc » mais la belles URL propre de l’article, et ça sélectionnera legal.html s’il existe, sinon article.html comme d’hab.

    • puisqu’il s’agit justement d’appel automatique du squelette du même nom, pourquoi ne pas l’appeler justement « squelette » au lieu de « identifiant » ? :) ça me semble aussi transparent que « page » ...(en espérant qu’il ne pose pas de souci lui)

    • Non non il n’y a aucun appel automatique, même si plus tard il pourrait y en avoir, et cet identifiant peut servir à bien d’autres choses.

    • ah d’accord. j’ai rêvé à plus tard :)

    • On changera sûrement pour « identifiant », ce qui uniformisera avec Menus, Formidable, etc. Et dans le même temps j’ajouterais le choix automatique du squelette du même nom que l’identifiant s’il existe.

      J’ai testé et l’appel d’une page avec identifiant téléscope celui du plugin menu quand c’est sur la même page et passé via #ENV , du coup j’ai du opté pour ’page-uid’…

      mais ptet j’my prends a l’envers ....

    • Pas tout compris. Si t’appelles un menu t’es censé lui passer son identifiant voulu pendant l’appel, donc je vois pas comment ça pourrait se télescoper.

    • Pendant mes essais en passant par l’url le le param &identifiant=_ma_page, la variable récupéré avec #ENVidentifiant était : _ma_page

      L’inclusion de ma noisette qui affiche les menus est ainsi :
      [(#INCLURE{fond=inclure/menu,identifiant=#ENV{identifiant,navprimary},env})]

      d’ou le problème, mais c’est plus de mon fait, si je passe le meme paramètre a mes inclusions c’est normal que ça agisse ainsi.

    Répondre à ce message

  • 7

    Salut,

    merci pour ce plugin que j’utilise sur la quasi totalité de mes sites. Très pratique !

    Une petite question : existe-t’il un moyen pour cacher le lien « Convertir en page » aux admins ?

    L’idée, c’est que je me sers des pages pour tout ce qui est « pages utiles » qui n’ont pas vocation à être dans le menu. Mais du coup, le lien porte confusion pour certains utilisateurs qui convertissent par inadvertance les articles en pages (la notion de page n’est pas évidente pour eux).

    Le top (pour moi en tout cas) serait en fait que les fonctions de création et conversion de Pages uniques soient paramétrable pour être inaccessible pour les non webmaster... Mais bon, peut-être que personne n’est dans ce cas.

    Bonne journée,

    jean marie

    • Moi aussi je les utilise pour ça (c’est le cas d’utilisation principal), mais justement, les admins complets, ce sont celleux qui ont les droits de gestion éditoriaux complets pour le site, y compris les menus du plugin Menus, etc. Donc que ce soit caché aux rédacs et admins restreints, je comprends, mais admins complets pas vraiment. Après ça pourrait être une autorisation spécifique (actuellement c’est article_modifier), ce qui permettrait de la surcharger…

    • Salut,

      merci pour ta réponse.

      Dans mon cas précis, une fois que j’ai mis en place les pages, les utilisateurs du site (rédacteurs ou admin), n’ont pas besoin d’en créer d’autres. Du coup, ça crée une confusion...
      D’ailleurs, j’installe également le plugin Autorité pour ne pas qu’ils puissent modifier la config du site et des plugins.

      Est-ce qu’il ne pourrait pas y avoir une option un peu comme ce qui existe dans Compostions ? Par ex, « Seul le webmaster peut créer et convertir des pages »... Si on la coche, le lien disparait.

      Jean Marie

    • Hop, j’ai aussi un problème équivalent sur un site où les admins restreints cliquent par erreur sur ce bouton « Convertir en page », du coup je le masque à l’arrache en passant par le pipeline boite_infos comme ceci :

      	if ($flux['args']['type'] == 'article' AND !autoriser('configurer')) {
      		$cherche = "/<span[^>]*class=('|\")icone s24 horizontale page-24.*?<\/span>/is";
      		if (preg_match($cherche,$flux['data']))
      			$flux['data'] = preg_replace($cherche,'', $flux['data']);
      	}

      Et zou :) En attendant mieux, ça fonctionne.

    • Salut b_b,

      merci pour cette « bidouille »...
      Par contre, je n’arrive pas à la faire fonctionner. En fait, je crois bien que je n’arrive pas avec les pipeline :/

      J’ai parcouru la doc ( http://programmer.spip.net/-Les-pipelines- ) et ainsi que http://aternatik.org/articles-et-ressources/bac-a-sable/article/exemple-d-utilisation-d-un et http://www.weblog.eliaz.fr/article105.html (site très intéressant d’ailleurs, tu devrais y jeter un œil ;) ) mais il me manque qqch visiblement...

      jean marie

    • Bonjour Jean-Marie,

      Même chose, confronté au problème, impossible à faire comprendre...
      Je me suis donc résolu à une solution des plus gores : changement d’icône ! voir ex en pièce jointe...
      En attendant mieux ;-)

    • En reprenant le code que je vous ai donné et en appliquant ce qui est écrit dans la documentation, on obtient ceci :

      Déclaration depuis plugins/dede/dede_pipelines.php pour un plugin avec le préfixe dede :

      // afficher le lien "Convertir en page" du plugin énponyme uniquement pour les admins complets
      function dede_ccas_boite_infos($flux){
      	if ($flux['args']['type'] == 'article' AND !autoriser('configurer')) {
      		$cherche = "/<span[^>]*class=('|\")icone s24 horizontale page-24.*?<\/span>/is";
      		if (preg_match($cherche,$flux['data']))
      			$flux['data'] = preg_replace($cherche,'', $flux['data']);
      	}
      	return $flux;
      }

      et la déclaration suivante dans plugins/dede/paquet.xml :

      1. <pipeline nom="boite_infos" inclure="skel_ccas_pipelines.php" ></pipeline>

      Déclaration sans plugin depuis config/mes_options.php :

      // afficher le lien "Convertir en page" du plugin énponyme uniquement pour les admins complets
      $GLOBALS['spip_pipeline']['boite_infos'] .= "|perso_boite_infos";
       
      function perso_boite_infos($flux){
      	if ($flux['args']['type'] == 'article' AND !autoriser('configurer')) {
      		$cherche = "/<span[^>]*class=('|\")icone s24 horizontale page-24.*?<\/span>/is";
      		if (preg_match($cherche,$flux['data']))
      			$flux['data'] = preg_replace($cherche,'', $flux['data']);
      	}
      	return $flux;
      }

      Voilà, j’espère que ça vous va, vous n’avez plus qu’à copier/coller maintenant :)

    • Ah, ben voilà pourquoi ça ne fonctionnait pas : un return $flux; s’est glissé en fin de code . C’est son absence dans les codes précédents qui nous faisait bêtement tourner en bourrique.

      Merci beaucoup d’avoir pris le temps de nous concocter une réponse aussi complète.

    Répondre à ce message

Ajouter un commentaire

Qui êtes-vous ?

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