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
    1. <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é. Comme ce squelette sera appelé par ?page=legal, le critère {page=legal} peut se simplifier, dans ce squelette, et s’écrire simplement {page}. La boucle principale devient alors simplement : <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.

Footnotes

[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=''}

updated on 9 January 2020

Discussion

90 discussions

  • 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.

    Reply to this 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.

    Reply to this message

  • 5

    Bonjour,
    je rencontre un soucis pour créer un article unique sur un spip 3.0.10 ou 3.0.11 vide, fraîchement installé.

    Une fois le plugin installé en auto et activé, si je vais dans “Edition > Pages uniques” j’arrive sur une page titrée “Toutes les pages” suivi du texte “Il n’y a aucune page pour l’instant.” et dans la colonne de gauche “Raccourcis” suivi d’un lien “Créer une nouvelle page”.

    Si je valide ce lien, j’arrive bien sur un formulaire “article” en mode édition, je saisie mes infos et quand j’enregistre, la page reste en mode édition et rien n’est enregistré dans la base.

    Est-ce un comportement normal,
    1) faut-il commencer par créer une rubrique, puis un article ?
    2) modifier l’article en page unique puis supprimer la rubrique ?

    Merci d’avance pour vos retours.
    Cordialement

    • Oui les pages sont des articles classiques, et SPIP interdit la création d’un article s’il n’y aucun rubrique dans le site. Donc il manque encore soit un message expliquant ça (et sans les boutons de création), soit beaucoup mieux, modifier le comportement pour pouvoir créer des pages uniques même sans rubrique.

    • Autre soucis constaté assez gênant.
      Lorsque un article est converti en page, toute modification ne peut être enregistrée.
      Je suppose que SPIP interdit aussi la modification d’un article qui n’est pas dans une rubrique.

    • Désolé, je n’ai pas encore eu le temps de tenter de reproduire la même chose chez moi. Mais avant, as-tu fais tes tests en désactivé tous les plugins non nécessaires ?

    • Bonjour,
      j’ai fais un test en ne conservant que les plugins indispensables : menus 1.4.5; nospam 1.5.4; page 1.0.2; saisies pour formulaires 1.31.4; spip proprio 1.70.0; z-dist v1- 1.7.21.

      En revanche, pour un site n’ayant qu’une seule rubrique, si je converti tous les articles de cette rubrique en page unique et *sans supprimer* la rubrique, alors les articles sont modifiable à souhait. C’est ma solution de dépannage.
      cordialement

    • Bonjour

      Suite au besoin d’avoir des articles sans aucune rubrique, je viens de pousser un correctif qui va dans ce sens. Il est testé sous spip 3.0.15.
      Avec ce correctif, on peut s’affranchir de la présence de toute rubrique pour créer et/ou modifier des pages.

    Reply to this message

  • 4

    Bonjour,

    Je n’arrive plus à mettre à jour des pages uniques, alors que tout fonctionnait deux mois auparavant. J’ai par exemple une page unique ayant pour champ titre “Réalisations” (en EN “References”), pour champ Page “Références” (à la fois FR et EN). Si je modifie cette page, simplement en ajoutant un espace dans le corps du texte et que j’enregistre les modifications, j’ai le message d’erreur “Charactères alphanumériques en minuscules ou “_” uniquement” apparaissant dans le champ Page.
    J’utilise SPIP 3.0.10 [20600] et la version 1.0.5 SVN [79192] du plugin Pages.
    Merci pour votre aide,

    Cordialement,
    Jean

    Reply to this message

  • 4

    Bonjour,

    je crois que le fonctionnement a changé depuis la mise à jour, ce qui ne me paraît normal…

    j’ai pour habitude de saisir dans le champ “page” une valeur générique, par exemple “entete” pour tous les liens d’en-tête, “piedpage” pour tous les liens de bas de page etc. Chaque page dans sa série étant classée par le préfixe numéroté, exemple : “1. Contact”, “2. À propos”, …

    Or, avec la dernière version que j’ai téléchargée une erreur fait que je ne peux attribuer à plus d’une page la même valeur pour champ “page”.

    Le plugin fonctionne ainsi depuis des années, pourquoi avoir subitement modifié son fonctionnement ?

    • C’était un manque de test d’unicité qu’il y avait avant, et il a été rajouté par Tcharlss. Je sais bien effectivement que lorsqu’un chose est possible, au moins une personne l’utilise. :)

      Mais cette possibilité de regrouper des pages ensemble en utilisant l’identifiant de page n’est pas censé être gardé. En effet, ce plugin ne devrait pas avoir pour but de “ranger autrement” des pages ensembles, puisqu’à l’inverse son but est avant tout de pouvoir créer des pages rangées nulle part.
      Il faudrait donc peut-être changer le numéro de version majeure, pour signifier qu’il y a une perte de compatibilité non négligeable.

      Pour ranger ensemble, il y a des rubriques (ou des mots), mais aussi surtout il y a le plugin Menus qui correspond à ce que tu décris : générer des menus avec des pages diverses et variées.

    • Bonjour,

      Je complète le message de Rastapopoulos : c’est bien moi qui ai mis la pagaille en faisant quelques ajouts au plugin qui ont occasionné des problèmes de rétro-compatibilité dans certains cas. Concrètement j’ai rajouté des vérifications sur la saisie de l’identifiant d’une page pour empêcher les utilisations non “voulues” : l’idée est que l’identifiant doit être unique, sans caractère accentué ni espace.

      Il y a une discussion sur la liste pour savoir si c’était une bonne idée ou pas, en attendant je te conseille d’utiliser la version précédente, téléchargeable ici : http://zone.spip.org/trac/spip-zone/changeset/77174/_plugins_/pages/trunk?old_path=/&format=zip

    • merci pour le lien

    • merci pour le lien, j’étais déjà passé en version antérieure, je comprends le principe.

    Reply to this message

  • 1

    Bonjour,
    Impossible de télécharger le plug in Page pour la version 3.0 de Spip. Le lien est rompu

    • Oui pour une raison inconnu ça n’a pas été mis à jour automatiquement suite aux modifications de ZIP qu’il y a eu il y a quelques semaines. Du coup je l’ai fait à la main là. Mais c’est bizarre.

    Reply to this message

  • 1
    Stéphane Santon

    Bonjour,

    Est-ce que le plugin surcharge #URL_PAGE pour pouvoir écrire facilement #URL_PAGE{mapage} ?

    Merci

    Reply to this message

  • 1

    Bonjour,

    est il possible de lier les pages uniques à l’agenda ?

    apparemment pour le moment non, mais cette option sera t’elle bientôt disponible ?

    merci

    • Mmmh que veut dire lier les pages uniques à l’agenda ? Tu veux dire ajouter des événements d’un article de page unique ?

      Il me semblait qu’il n’y avait rien à faire normalement, à partir du moment où tu n’as pas activé l’option qui impose l’agenda seulement sur certaines rubriques.

    Reply to this message

  • 9
    pm2036

    Bonjour,

    A priori,il y a un souci si on utilise les urls arborescentes et le plugin pages.
    Les liens semblent incorrects.

    Exemple: dans l’admin c’est bien défini en “http://www.example.org/spip3/accueil” et dans les squelettes générés le lien se transforme en “http://www.example.org/accueil” et sont invalides.

    Merci

    • Chez-moi-ça-marche. ©

      Attention, si ton site est dans un sous dossier, il y a normalement un truc à déclarer dans le .htaccess (le RewriteBase, un truc comme ça).

    • pm2036

      Chez-moi-ça-marche pas. © ;)
      Mon rewrite base dans mon htaccess est ok je pense;
      Par contre, ce sont les liens directement générés qui sont incorrects
      J’essaye d’expliquer différement.
      En “gros”, ça me génère ça:

      <h3 class="h2 entry-title"><a href="rubrique1/test1" rel="bookmark">Test1</a></h3>
      			<h3 class="h2 entry-title"><a href="/accueil" rel="bookmark">Accueil</a>

      Pour rubrique1/test1, pas de souci, mais pour accueil, ça génère /accueil, j’ai aussi testé l’url directe sans le / ça ne passe pas non plus :(

    • Chez moi aussi ça génère un /contact.html par exemple. Ça marche pour un site qui n’est pas dans un sous-dossier, mais ça ne marche plus quand il y a un sous-dossier.

      Mais avant (quand ?) ça marchait !

      Il y a donc eu : soit une modif de la gestion de la base, soit une modif de la génération de l’URL. Et je ne sais plus si auparavant l’URL générée contenait un / devant ou pas.

      En tout cas je ne crois pas que ce soit dû au plugin, vu qu’il ne touche pas du tout aux URLs (les pages uniques étant des articles classiques).

    • Timestamp

      Bonjour,

      pour palier à ce problème, j’ai modifié le plugin pour qu’il donne 0 plutôt que -1 comme id_rubrique. Je ne sais pas si ça pose un problème par ailleurs, en tout cas ça évite les urls qui commencent par un slash et tout à l’air de fonctionner correctement.

      Les fichiers modifiés sont: pages_pipeline.php, prive/squelettes/contenu/page_tous.html, prive/squelettes/navigation/page_tous.html

      Qu’en penses-tu ?

    • Avant SPIP 3, SPIP supprimait les articles étant dans des rubriques inexistantes ou si id_rubrique était “false” (et 0 est false). De nos jours, SPIP 3 a été corrigé et la branche 2.1 aussi par la même occasion. On pourrait donc revoir ce “-1”.

      Mais en fait peu importe cette valeur, car on est pas censé l’utiliser, on met une valeur inexistante juste parce qu’il faut bien mettre quelque chose. Ce n’est pas pour autant que ça devrait faire planter des choses ensuite.

      Le problème vient donc plutôt du fait que d’autres parties du code (ici les URLs arbo) ne gèrent pas correctement le fait d’avoir un article n’ayant PAS de rubrique (ou ayant un numéro un peu débile). Il faudrait donc plutôt tenter de corriger le code des URLs arbo.

      C’est ici :
      http://zone.spip.org/trac/spip-zone/browser/_core_/branches/spip-3.0/plugins/urls_etendues/urls/arbo.php#L203

      Et en fait dans le “else” il faudrait tester que rtrim($url_parent,'/') soit non-vide avant de concaténer l’ensemble avec le slash au milieu. Car s’il est totalement vide, alors on devrait renvoyer pareil que lorsque parent=0.

    • Timestamp

      Merci pour l’éclairage historique.

      Effectivement j’avais d’abord pensé modifier le code qui génère les urls arbo. En même temps, si il n’est pas possible par défaut de créer des articles sans rubrique (ce qui me semble dommage) c’est parce que pour l’instant, SPIP est conçu dans l’idée qu’un article dépend toujours d’une rubrique, d’où le fait que ça ne soit pas pris en compte dans la génération des URLs, j’imagine. D’un kludge à l’autre, on s’y retrouve...

      Bref, pour l’instant je conserverais ce plugin patché, et si j’ai le temps, je me pencherais sur ce qui me semble mieux: que SPIP permette les articles sans rubrique.

    • Timestamp

      Bon, en fait gros bug, si id_rubrique est à zéro on ne peut plus modifier les articles... Je patcherais donc le fichier qui génère les urls arbo...

    • Timestamp

      Et merci beaucoup pour le patch !

    Reply to this message

  • 5

    Fait étrange : lorsque j’essaie d’afficher la page que j’ai créée (A-propos), spip utilise le squelette par défaut (article.html).

    Le seul moyen d’afficher le squelette dédié semble être de l’appeler dans l’URL (spip.php?id_article=3&page=a-propos&var_mode=recalcul).

    SPIP 3.0.4 [19781] est installé dans un sous répertoire, sur un serveur mutualisé OVH. Dans l’HTACCESS, j’ai laissé la valeur par défaut de rewrite base. Je peux afficher d’autres articles avec urls réécrites sans souci.

    J’ai raté un truc ?

    • Je précise que j’ai bien renseigné le champ page dans le back office : a-propos.

    • Il n’a jamais été question de ça dans la doc. Ce n’est qu’un identifiant, pas le nom d’un squelette. Si on fait un squelette “a-propos” faut l’appeler avec page=a-propos, et dedans on peut appeler l’article ayant cet identifiant. Dans la todo je dois changer le champ “page” en “identifiant” (comme dans Menus, Formidable, etc) pour moins de confusion.

      Pour avoir un squelette différent pour un article précis, il y a déjà le plugin Compositions, et donc je préfère ne pas mélanger les genres, ya déjà un truc qui fait ça.

    • Ah ok, aux temps pour moi.
      Je vais installer compositions pour voir s’il est possible d’appeler la page unique avec une URL réécrite et un squelette donné.

      Merci,
      Julien

    • Bon visiblement on ne peut pas utiliser le plugin compositions sur une page. Ca me donne une page 404 (alors que ça fonctionne pour les articles auxquels j’ai attaché une composition).

    • Mmmh bizarre, parce que ce sont vraiment des articles comme les autres. Ya que id_rubrique=-1. Peut-être que ce dernier truc plante la recherche de compositions.

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom