HOME > RSS > BLOGS France > [SPIP - contrib]

R S S : [SPIP - contrib]


PageRank : 2 %

VoteRank :
(0 - 0 vote)





tagsTags: , , , , ,


Français - French

RSS FEED READER



Story (HTML5UP)

17 May, by erational[ —]

Squelette SPIP « onepage » pour intégrer le thème Story de HTML5UP
https://html5up.net/story



Ce squelette permet de réaliser très simplement des sites de type one page sans toucher une ligne de code.

Site de démonstration
https://www.phideco.com/

Installation

A l'activation, le plugin installe aussi les plugins suivants :

Configuration

La page de configuration permet quelques réglages :

  • Couleur principale du site
  • Article « hero » : l'article à la une
  • Article galerie : l'article qui sert pour placer les images en diaporama
  • Un pied de page : Texte libre

Les icônes de réseaux sociaux

En utilisant le plugin Liens vers les réseaux sociaux, vous pourrez personnaliser les icônes des réseaux à afficher.

Rédaction

Configuration du site
Dans le menu configuration du site, pensez à renseigner :

  • Le titre du site
  • Son slogan
  • Un logo de site (qui sera repris dans l'article hero)

Les articles
Rédigez vos articles le plus simplement possible :

  • Un titre
  • Un texte court
  • Ajouter un logo à l'article qui servira d'illustration. En général il est préférable d'avoir une illustration carrée. Si aucune illustration n'est trouvée, on prend des images génériques. Utiliser des logos de tailles importantes (1000 à 2000px de large) car ces logos sont affichés en mode plein écran).

Le squelette liste tous les articles du site classés par ordre de numéro en alternant automatiquement les images à gauche puis à droite.

Pensez donc à utiliser la convention suivante :

Pour que le thème fonctionne bien graphiquement, il faut éviter d'écrire de longs articles, mais il faut plutôt écrire de nombreux petits articles (1 article = 1 paragraphe).

Article Hero
On affiche :

  • Le logo du site réduit
  • Le texte
  • Le logo de l'article sert pour le fond de page

Le titre de l'article Hero n'est pas affiché.

Article galerie
Cet article sert à créer le diaporama.
Créer l'article et y déposer vos images dans le portfolio.

Personnalisation

Pour les personnes qui veulent ajouter leurs propres styles, vous pouvez créer un fichier CSS personnalisé squelettes/css/html5_story_theme.css.

Une page « patron » est aussi livrée avec le squelette à l'adresse suivante :
http://monsite.tld/spip.php?page=_patron


Configuration des traitements de Formidable

12 May, by Jacques[ —]

Une fois le formulaire et les champs créés formidable propose de « configurer les traitements »
Cet article vise à préciser ou compléter quand ça semble nécessaire certains choix présents.

Le premier choix consiste à savoir si on veut :

  • « Poster par courriel le résultat du formulaire à une liste de destinataires »,
  • « Enregistrer les résultats du formulaire dans la base de données »

Poster par courriel le résultat du formulaire à une liste de destinataires.

Une fois coché ce choix une série de champs est proposée, répartis en cinq groupes :

Destinataires du courriel

  • Sujet du courriel
  • Contenu du courriel
  • Destinataires du courriel
  • Expéditeur du courriel
  • Accusé de réception

Sujet du courriel

Il est possible de personnaliser le Sujet du courriel avec les @raccourcis@ (sinon il sera construit automatiquement) et de choisir de n'y mettre que des Valeurs brutes si le mail doit être traité par un robot et non un humain.

Contenu du courriel

Quatre possibilités de personnalisation : Champs à exclure du contenu du message, faut-il « Joindre les fichiers dans le courriel », « Masquer les liens d'administration dans le courriel » ou « Envoyer l'adresse IP de l'envoyeur aux destinataires »
Concernant les Champs à exclure du contenu du message, comme indiqué dans le placeholder les champs doivent être exclus sous la forme « input_3,selection_2 »
Depuis la révision 110166 il est possible d'exclure les champs sous la forme @raccourcis@

Destinataires du courriel

Trois choix possibles : Destinataires, Destinataires supplémentaires, Destinataires en fonction d'un champ
Le premier choix Destinataires ne pourra comprendre que des champs de type « hidden » ou « destinataires ». Le type de champ Destinataires permet de choisir parmi une liste de rédacteurs du site quels seront ceux qui sont informés du remplissage du formulaire.

Le champ Destinataires supplémentaires permet, comme son nom l'indique, d'envoyer un formulaire à un ou plusieurs destinataires en fournissant des adresses directement dans le champ.

Enfin, Destinataires en fonction d'un champ permet d'envoyer le formulaire à des interlocuteurs différents en fonction des choix. Attention toutefois pour que ça fonctionne bien il faut que soit proposé un mail pour chaque choix, ou, s'il y a des choix non définis ici, qu'un destinataire soit défini par ailleurs.

Expéditeur du courriel

Trois champs possibles Courriel de l'envoyeur, faut-il « Insérer le courriel de l'envoyeur dans le champ « From » » et le Nom de l'envoyeur
Courriel de l'envoyeur : ne pas oublier de renseigner ce champ si on utilise le message de confirmation ou accusé de réception

Accusé de réception

L'accusé de réception ne peut maintenant être demandé que si le courriel de l'envoyeur est préalablement renseigné. Alors il devient possible de cocher Envoyer aussi un courriel à l'adresse de l'envoyeur avec un message de confirmation.
Il est ensuite possible de définir le Sujet de l'accusé de réception, de préciser un Courriel de l'accusé de réception et de forcer un Nom de l'expéditeur de l'accusé de réception

Enregistrer les résultats du formulaire dans la base de données

Une fois cette case cochée un certain nombre de champs s'affichent qui permettent de :

  • Multiple : Une même personne peut répondre plusieurs fois.
  • Modifiable : Les visiteurs peuvent modifier leurs réponses après coup.
  • Résultats anonymes (ne pas garder de traces de l'identifiant des personnes ayant répondu).
  • Enregistrer les IPs (masquées après un délai de garde)

Il est également possible de décider si la modération de l'enregistrement a lieu à priori ou à posteriori.

Si on utilise l'analyse proposée par formidable définir si on souhaite exclure des champs de cette analyse.

Enfin il est possible de demander d'effacer de la table les résultats les plus anciens. Une fois la case cochée il sera possible de définir le nombre de jours pendant lesquels on garde l'enregistrement avant d'effacer.


Intégrer un calcul d'itinéraire dans une page

https://contrib.spip.net/GNU-General-Public-Licence-9-9-9-9-9-9-9-9-9-9-9play episode download
9 May, by RealET[ —]

Ce modèle SPIP permet d'intégrer un calcul d'itinéraire dans vos articles.

Attention, cet outil nécessite une clef d'API Google Maps !

Clef d'API Google Maps

Muni de votre compte gmail, rendez-vous sur Obtenir une clé/authentification.

Vous obtiendrez une clef d'API : XXXXXXXXXXXXXXXXXXXX

Usage

Dans un article, vous pouvez :

Insérer un formulaire d'itinéraire

Il faut absolument la clef d'API !

Préciser le point central initial de la carte

Il faut indiquer la latitude et la longitude.

Préciser une destination par défaut

Exemple modèle itinéraire

Pour les curieux, le code est ici : Commit 110150 sur la Zone


Rang : ordonner une liste par Drag&Drop

https://contrib.spip.net/Aide-administrationplay episode download
5 May, by nicod_, Peetdu[ —]

Dans l'espace privé, pouvoir ordonner une liste d'objets par glisser-déposer. Par exemple la liste des articles d'une rubrique.

Il devient possible d'utiliser le critère par rang dans vos squelettes.

Installation

Il s'installe comme tous les plugins.

Il nécessite le plugin Déclarer parent (installé en dépendance).

Il est fourni avec une surcharge des squelettes du core et du plugin mots, permettant de ranger les articles et les mots clés dans l'espace privé.

Configuration



Choisir les objets
…pour lesquels vous voulez activer le drag&drop.
Ici vous pouvez activer :

  • les Articles,
  • les Mots-clés,
  • les objets éditoriaux gérés par d'autres plugins.

Ranger les objets
Si cette case est cochée, les nouveaux objets créés seront rangés automatiquement à la fin de la liste, avec le rang le plus élevé +1.
TODO : proposer un deuxième choix permettant de classer les nouveaux objets au début de la liste, avec le rang 1.

Dans vos squelettes

Il est possible d'utiliser le critère par rang pour les objets activés dans la configuration.

  1. span>(ARTICLES){id_rubrique}{par rang}>
  2. #TITRE

  3. #TEXTE

Télécharger

Comment utiliser ce plugin pour faire du drag&drop sur mon objet éditorial

La première chose à faire est bien sûr de cocher l'objet (exemple : Patates) dans la configuration du plugin.

Ensuite, il faut modifier le squelette /prive/objets/liste/patates.html pour y ajouter quelques informations.
Sur la base d'un squelette généré par la Fabrique, voici les modifications à y apporter.

1- Dans le tableau ci-dessous, ajouter l'entrée rang,1

  1. [(#SET{defaut_tri,#ARRAY{
  2. rang,1
  3. titre,1,
  4. date,-1,
  5. id_patate,1,
  6. points,-1
  7. }})]

Télécharger

2- juste après ce tout premier bloc qui détermine le sens de tri, ajouter le test qui détermine si l'objet est effectivement coché dans la configuration de Rang ou pas, et stocker le résultat pour ne pas le recalculer ensuite.

  1. #SET{activer_rang, #VAL{patates}|in_array{#RANG_LISTE_OBJETS} }

Si l'objet éditorial a un objet parent (par exemple, le parent d'un article est une rubrique, le parent d'un mot est un groupe_mot), il faut aussi tester si l'identifiant du parent est bien reçu dans l'environnement.
On trie alors les objets en fonction de leurs parents.

Dans le cas d'un article par exemple, le test serait :

  1. #SET{activer_rang, #ENV{id_rubrique}|et{#VAL{articles}|in_array{#RANG_LISTE_OBJETS}} }

3- toujours pour le tri, si le rang est activé sur cet objet, on applique un tri par rang par défaut.

  1. [(#GET{activer_rang}|oui) [(#VAL{rang}|setenv{par})] #SET{tri,rang} ]

4- Pour pouvoir insérer et configurer le code javascript qui va gérer le drag&drop, il faut préciser sur quel objet il va s'appliquer.
On ajoute donc un attribut data-objets à la table :

5- Afficher le Rang

Par défaut, la Fabrique génère des squelettes qui affichent la balise #RANG à côté du #TITRE. Mais nous voulons pouvoir trier aussi bien par rang que par titre, nous allons donc séparer ces deux colonnes.

Dans le , on ajoute juste avant celle du titre une colonne pour trier par Rang :

<:rang:info_rang_abbr:>,ajax})]]>
  1. [(#GET{activer_rang}|oui)[(#TRI{rang,<:rang:lien_trier_rang|attribut_html:>><:rang:info_rang_abbr:>,ajax})]]

Et dans le , on ajoute la colonne correspondante :

  1. [(#GET{activer_rang}|oui)[(#RANG).]]

Dans le qui contient le titre, on peut donc supprimer la balise [(#RANG).]

6- Dernière étape : ajouter un attribut data-id_objet sur le de chaque objet :

  1. [(#GET{activer_rang}|oui)data-id_objet=#ID_PATATE] class=[(#COMPTEUR_BOUCLE|alterner{row_odd,row_even})]>

Le code javascript qui gère le drag&drop ajoutera automatiquement une colonne supplémentaire avec un petit picto symbolisant une poignée, qui indique que les objets peuvent être déplacés dans la liste.

Différences entre la version 1.0 et la versions 0.7

La nouvelle version 1.0 casse la compatibilité avec les squelettes conçus pour la version précédente et expérimantale (0.7).
Cette version inclut les nouveaux squelettes pour ranger les articles et les mots, mais si vous aviez des squelettes de liste d'objets personnels conçus pour la 0.7, ils doivent être adaptés.

  • les informations sur l'objet et l'id_objet (dans le ) sont maintenant transmises dans des attributs data
  • Il n'est plus nécessaire de déclarer les objets dans le pipeline rang_declarer_contexte pour qu'ils soient pris en compte, c'est maintenant automatique, basé sur la configuration.
  • le filtre de test |rang_objet_dans_config générait une erreur dans les squelettes de listes d'objets si le plugin était désactivé/désinstallé, on utilise maintenant une balise (cf explications détaillées ci dessous).
  • la colonne avec le picto draggable est ajoutée automatiquement en javascript, inutile de l'ajouter dans les squelettes.

Notes techniques

a/ La balise #RANG_LISTE_OBJETS calcule automatiquement la liste des contextes (i.e. pages /?exec=patates) sur lesquels il insère le code javascript qui gère le drag&drop.
Cette liste est calculée à partir des objets cochés dans la configuration, et des y ajoute les noms des objets parents au singulier. Si vous avez coché Articles dans la configuration, la liste des contextes contiendra articles et rubrique.
Le calcul s'appuie sur la convention que les noms des squelettes correspondent aux noms des objets, par exemple, les objets patates sont listés dans le squelette /prive/objets/liste/patates.html et affichés dans /prive/objets/contenu/patate.html
Si vous avez un cas particulier, vous pouvez utiliser le pipeline rang_declarer_contexte pour ajouter d'autres contextes à cette liste.
Cette balise offre l'avantage de ne plus être interprétée si le plugin est désactivé ou désinstallé. Les surcharges de squelettes sont donc compatible « avec et sans » le plugin Rang, et ne génèreront pas d'erreurs.

b/ Ce plugin surcharge la balise #RANG du core de SPIP.

c/ Ce plugin se base sur la notion de « Définir la relation à l‘objet parent dans la déclaration de l‘objet ». Notion introduite dans le ticket https://core.spip.net/issues/3844, et gérée dans le plugin declarerparent

d/ Lorsque vous activez un objet dans la config, le plugin va créer un champ 'rang' dans la table de l'objet sélectionné.

e/ La désinstallation supprime les champs 'rang' de tous les objets activés et les choix fait dans la configuration.


Tutoriel : Afficher sur une carte GIS des points dont on n'a que l'adresse

15 April, by jeanmarie[ —]

Le besoin

Afficher sur une carte des points dont on n'a que l'adresse.

Le cas concret

Afficher des points de ventes sur une carte à partir d'un document tableur (LibreOffice Calc, Microsoft Excel...) avec possibilité de géolocaliser le visiteur.

Le principe

Il faut géocoder les adresses, c'est à dire trouver leurs coordonnées GPS, dans un document CSV pour pouvoir les lire avec une boucle DATA et générer un fichier JSON que GIS pourra lire.

Oui, rien que ça :)

Le géocodage

Via le site adresse.data.gouv.fr/csv, on peut géocoder des adresses en fournissant un fichier CSV de ce type :

EnseigneAdresseCode postalVille
Magasin 1 Adresse 1 CP 1 Ville 1
Magasin 2 Adresse 2 CP 2 Ville 2

Il en ressort un fichier CSV avec différentes infos supplémentaires dont la latitude et la longitude de chaque enseigne.

Lire le fichier CSV et générer le JSON

Pour que le rédacteur ait la main sur la carte, on passe le CSV comme document joint de l'article dans lequel on va afficher la carte.

On récupère donc l'URL de ce document avec une boucle DOCUMENTS pour la passer dans une variable source via un #SET

- Dans json/gis_pointsdevente.html

  1. span>(DOCUMENTS){id_article}{extension=csv}{!par date}{0,1}> #SET{source,#URL_DOCUMENT}

Les critères :
{extension=csv} pour ne sélectionner que les documents .csv
{!par date} pour toujours prendre le dernier documents envoyé
{0,1} pour ne prendre qu'un document

Ensuite, avec une boucle DATA, on extrait les infos souhaitées du CSV pour construire le JSON.

La petite subtilité ici est que, si une entrée n'a pas de coordonnées (parce que le géocodage n'a pas fonctionné pour une adresse par exemple), le JSON sera inutilisable.

Pour palier à ça, on teste la présence de la longitude pour chaque entrée avant de faire le JSON. Pour ce faire, vu le mélange de syntaxe SPIP/JSON, on passe par un inclure pour que ça fonctionne.

Si vous êtes sûr de votre CSV parce que vous l'avez vérifié et corrigé, vous pouvez supprimer le test et éviter ainsi l'inclure.

  1. span>(DATA){source csv, #GET{source}}{,}{cle>0}>[(#VALEUR{4}|!={''}|oui)
  2. {fond=inclure/json_pointsdevente,
  3. id=#COMPTEUR_BOUCLE,
  4. lon=#VALEUR{5},
  5. lat=#VALEUR{4},
  6. enseigne=#VALEUR{0},
  7. adresse=#VALEUR{1},
  8. cp=#VALEUR{2},
  9. ville= #VALEUR{3}} />
  10. ]

Télécharger

Les critères :
0}>{cle>0} pour ne pas prendre en compte la 1re ligne qui correspond à l'entête du tableau avec les noms des colonnes.
{,} pour respecter la syntaxe JSON entre chaque propriétée

Note
#VALEUR{0} correspond à la valeur de la 1re colonne, #VALEUR{1}, celle de le deuxième, etc...

- Dans inclure/json_pointsdevente.html

  1. {
  2. type: Feature,
  3. geometry: {type: Point, coordinates: [[(#ENV{lon})], [(#ENV{lat})]]},
  4. id:#ENV{id},
  5. properties: {[
  6. (#SET{titre,

    #ENV{enseigne}

    })]
  7. title:[(#GET{titre}|json_encode)],[
  8. (#SET{description,#ENV{adresse}
    #ENV{cp} #ENV{ville} })]
  9. description:[(#GET{description}|json_encode)][
  10. (#CHEMIN_IMAGE{#ENV*{icone,0}}|sinon{#CHEMIN{#ENV*{icone,0}}}|gis_icon_properties)]
  11. }
  12. }

Télécharger

Afficher la carte

- Dans inclure/pointsdevente.html

On affiche un lien pour que le visiteur puisse se géolocaliser avec une url type www.domaine.net/ma_page.html?geoloc=oui

Et, en fonction de la présence, ou non, du paramètre ?geoloc=oui dans l'URL, on affiche la carte avec ou sans géolocalisation du visiteur.

  1. [(#ENV{geoloc}|=={oui}|?{
  2. [(#INCLURE{fond=modeles/carte_gis,
  3. objets=pointsdevente,
  4. id_article=#ENV{id_article},
  5. localiser_visiteur=oui})]
  6. ,
  7. [(#INCLURE{fond=modeles/carte_gis,
  8. objets=pointsdevente,
  9. id_article=#ENV{id_article},
  10. centrer_auto=oui})]
  11. })]

Télécharger

Note
Pour simplifier le code, je n'ai gardé que les paramètres indispensables à GIS dans notre cas, mais il est possible changer le zoom si le visiteur demande la géolocalisation pour afficher les points proches de lui de façon plus lisible.

- Dans le squelette de votre article

  1. {fond=inclure/pointsdevente,env,ajax,geoloc=#ENV{geoloc}} />

Et hop, le tour est joué.

Merci à b_b pour la piste et les outils.

Les ressources

La base adresse nationale
Un référentiel national ouvert : de l'adresse à la coordonnée géographique
https://adresse.data.gouv.fr

La documentation du plugin GIS4
GIS 4

Tester votre JSON
Utiliser l'extension JSON Lite pour votre navigateur
https://github.com/lauriro/json-lite


Plugin microcache

10 April, by ARNO*, Fil, JLuc[ —]

Le microcache est un fichier cache totalement statique, de longue durée et dont le nom est facilement accessible.

Qu'est ce que microcache ?

C'est un système de cache statique et persistant des squelettes SPIP, qui permet des mises à jour en temps réel.

Comment ça s'utilise ?

Les fonctions définies s'appliquent au cas par cas pour les inclusions SPIP qui doivent bénéficier de ce mécanisme.

Pour cacher ainsi un squelette inc/truc_auteur, ça s'utilise ainsi :

  1. [(#ID_AUTEUR|microcache{inc/truc_auteur})]

Dans le squelette inclu, on récupére la valeur de l'#ID_AUTEUR connecté avec la variable #ENV{id} reçue dans l'environnement.

On peut également appeler le filtre microcache sur n'importe quelle balise, même non numérique : dans ce cas, c'est le md5 de la valeur qui servira pour indexer le cache.

Une fonction PHP est disponible pour effacer ce microcache, souvent à la validation d'un formulaire, par exemple lorsqu'un auteur poste un message, :

truc_auteur) ;>
  1. effacer_microcache($id_auteur, inc/truc_auteur) ;

Prérequis

Ce plugin nécessite que le plugin memoization soit installé.

Il faut adapter les squelettes pour viser spécifiquement les squelettes devant être gérés ainsi.

Le cache sera d'autant plus efficace que la mémoization sera activée avec un cache en mémoire (XCache, Memcache(d), redis ou APC Cache), mais le mécanisme d'invalidation ciblée sera utile même avec filecache.

Usages

Ce microcache est notamment utilisé sur le réseau social de recommandation de liens seenthis et, dans une version plus ancienne, sur rezo.net.

- Voir le Source
- Signalement initial sur seenthis
- À tester et mettre au point : le plugin fournit aussi 2e jeu de fonctions (dans inc/microcache.php) pour varnish : cela permet de ranger les caches ciblés sous forme de fichiers, sans memoization, et de délivrer un balisage destiné à un varnish correctement paramétré. Il faut avoir la main sur le serveur et sur la config varnish.


Memoization, la librairie

9 April, by Fil, JLuc[ —]

Mémoïzation est un terme d'informatique, dont Wikipédia donne la définition suivante : « une technique consistant à réduire le temps d'exécution d'une fonction en mémorisant ses résultats d'une fois sur l'autre ». C'est aussi le nom d'une nouvelle librairie de fonctions pour PHP, qui fait suite à mes expérimentations sur XCache.
À l'heure actuelle le plugin Memoization pour SPIP fonctionne avec memcache, APC, xcache, eaccelerator et redis, ainsi que sur l'option de base, filecache.

Cette librairie est développée sous forme d'un plugin pour SPIP, mais est codée de manière autonome, ce qui permet de l'utiliser indépendamment de SPIP. C'est cet aspect qui est détaillé dans cet article. Pour la doc du plugin, voyez l'article « Plugin mémoization ».

Sa double licence — LGPL ou MIT, selon votre choix — permet de l'intégrer librement dans n'importe quel projet PHP.

Le fichier memoization_options.php définit les fonctions suivantes :

  1. mixed cache_me()
  2. mixed cache_get(string key)
  3. bool cache_set(string key, mixed value [, int ttl])
  4. bool cache_isset(string key)
  5. bool cache_unset(string key)
  6. int cache_inc(string key [, int value [, int ttl] ])
  7. int cache_dec(string key [, int value [, int ttl] ])
  8. bool cache_lock(string key)
  9. bool cache_unlock(string key)
  10. mixed cache_edito_get($key)
  11. mixed cache_edito_set($key, $value)

Télécharger

Ces fonctions sont assurées par le module xcache s'il est disponible, et dans le cas contraire par eaccelerator, APC, etc., voire même — au pire — par des méthodes utilisant le système de fichiers.

Ces fonctions sont très proches de ce que permet XCache.
Comparé à XCache :
— on n'a pas conservé la fonction cache_unset_by_prefix, très difficile à émuler sur les autres librairies ;
— on a en revanche ajouté les fonctions cache_lock() et cache_unlock().

Les fonctions cache_edito_get et cache_edito_set complètent ce jeu de fonction : lorsqu'une valeur a été mise en cache par cache_edito_set , on ne la récupère avec cache_edito_get que si le cache SPIP n'a pas été invalidé depuis, par une modification du contenu éditorial.

Interface de programmation (API)

mixed cache_me() est la fonction de mémoïzation proprement dite, telle que je l'ai décrite, sous le nom W(), dans un autre article (« Utiliser xcache pour accélérer n'importe quel script PHP »).

Pour « mémoïzer » une fonction définie comme :

  1. function A($param) {
  2. calculs ...
  3. return $resultat;
  4. }

Télécharger

il suffit de lui ajouter une ligne :

  1. function A($param) {
  2. if (!is_null($W = cache_me())) return $W;
  3. calculs ...
  4. return $resultat;
  5. }

Télécharger

Les résultats sont alors mémoïzés et restitués, lors de l'exécution de la même fonction par la suite (et avec les mêmes arguments), sans devoir refaire les calculs ; cela fonctionne bien sûr au sein d'un même hit, mais aussi entre des hits successifs consécutifs. (Pour les cas où il est judicieux d'employer cette technique, se reporter à l'article initial.)

Exemple

À titre d'exemple voici comment je faisais, auparavant, pour mémoïzer le chargement d'une URL distante :

  1. function recuperer_page_cache($url, $delai=3600) {
  2. $cache = _DIR_CACHE.'url_'.md5($url);
  3. if (($GLOBALS['var_mode']
  4. OR !file_exists($cache)
  5. OR filemtime($cache)<time()-$delai
  6. )
  7. AND $contenu = recuperer_page($url))
  8. ecrire_fichier($cache, $contenu);
  9. lire_fichier($cache, $contenu);
  10. return $contenu;
  11. }

Télécharger

désormais, je fais :

  1. function recuperer_page_cache($url, $delai=3600) {
  2. if (!is_null($W = cache_me(null, $delai)))
  3. return $W;
  4. return recuperer_page($url))
  5. }

Télécharger

Non seulement c'est plus propre, mais le code tire automatiquement avantage d'un cache en RAM si celui-ci est dispo.

Les autres fonctions de l'API sont plus traditionnelles :

mixed cache_get(string key) récupère la valeur stockée sous la clé $key, ou null si l'info n'est pas disponible ou a expiré.

bool cache_set(string key, mixed value [, int ttl]) stocke une valeur sous la clé $key, avec une durée d'expiration de ttl secondes (par défaut, pas d'expiration).
Renvoie true en cas de succès, false en cas d'échec.

bool cache_isset(string key) renvoie true si la clé a une valeur disponible et non expirée, false dans le cas contraire.

bool cache_unset(string key) efface l'éventuelle valeur de la clé key.

int cache_inc(string key [, int value [, int ttl] ]) ajoute value (par défaut, value=1) à la valeur numérique entière de la clé key, règle, le cas échéant, le ttl, et renvoie le résultat.

int cache_dec(string key [, int value [, int ttl] ]) retire value (par défaut, value=1) à la valeur numérique entière de la clé key, règle, le cas échéant, le ttl, et renvoie le résultat.

cache_lock(string key) verrouille la clé key, et assure l'unicité de notre accès à cette clé jusqu'à ce qu'on libère le lock, ou que le processus se termine.

cache_unlock(string key) déverrouille la clé key.


Plugin mémoization

9 April, by Fil, JLuc[ —]

La mémoïzation est « une technique consistant à réduire le temps d'exécution d'une fonction en mémorisant ses résultats d'une fois sur l'autre » [1]. C'est aussi le nom d'un plugin SPIP qui a recours aux caches memcache(d), APC, xcache, eaccelerator ou redis, pour accélérer les accés aux caches SPIP. Il propose aussi une option de base, filecache, pour les hébergements sans cache mémoire.

La librairie utilisée pour ce plugin peut également être utilisée de manière autonome sur mesure dans le code d'un plugin, ou même par toute application indépendante de SPIP. Pour cela, voyez l'article « Memoization, la librairie ».

Mettre les caches en mémoire

Memoization est particulièrement utile lorsque votre hébergement propose un système de cache mémoire 'user'. À chacun des systèmes de cache mémoire les plus répandu correspond une option de memoization :
- XCache
- APC Cache
- redis
- memcache(d)

Lorsque votre site dispose de l'un de ces systèmes de caches, le paramétrage de memoization vous en propose le choix. Il suffit de choisir l'option, et votre SPIP bénéficie d'un cache mémoire au lieu d'un cache sous la forme de fichiers sur le disque. L'accès aux caches est donc grandement accéléré.



Lorsqu'activé sur un SPIP, le plugin memoization ne touche pas au fonctionnement habituel du cache de SPIP, sur la durée de mise en cache d'une page ou noisette. Cela ne fait que transférer le stockage du mécanisme de cache de SPIP dans la RAM. 

Il y a une autre différence par rapport au cache SPIP classique : avec memoization il n'y en a tout simplement pas de garbage collector car c'est chaque système de cache qui gère son propre nettoyage des données périmées. Cela permet d'éviter un bug récurrent sur les gros sites SPIP : l'« explosion » du cache.

XCache
- doc technique pour la configuration : http://xcache.lighttpd.net/wiki/PhpIni
- XCache n'est pas compatible PHP7 (et ne le sera peut être jamais)

APC
- APC Cache
- il n'y a aucun paramétrage supplémentaire à faire.
- Lorsque vous activez l'option APC Cache, vous pouvez aussi bénéficier d'un navigateur-analyseur de cache en installant le plugin XRay en complément.

redis
- https://redis.io/clients
- Pour ce système de cache, le paramétrage SPIP du plugin propose deux modes pour interroger la base : Serveur et Socket Unix. Ce choix dépends de la configuration du serveur redis choisi par l'admin sys.
- Pour la sérialisation : privilégier SERIALIZER_IGBINARY, qui est plus performant

memcache(d)
- memcached est une évolution plus récente de memcache.
- Liens :

Autres options de cache

filecache

L'option filecache est la seule option qui ne range pas les caches en mémoire. On l'utilisera lorsque l'hébergement ne propose pas de cache en mémoire.

Avec filecache, memoization range les caches sous la forme de fichiers, comme le SPIP de base, mais distribue ces fichiers dans un plus grand nombre de dossiers que par défaut avec SPIP. Il n'y a pas de réglage limite pour le filecache ; par défaut, mémoization prévoit une distribution homogène des caches parmi 16^4 fichiers. La plupart du temps ce sera satisfaisant, mais en cas de collision, il est possible de modifier cette valeur et régler ainsi la taille maxi (il faudra faire quelques essais).

Note : l'option filecache est intégrée dans SPIP à partir de la version 3.1.

nocache

Avec nocache, SPIP ne gère plus de cache. C'est à utiliser temporairement seulement, le temps d'un débug par exemple.


[1] d'après Wikipedia


Pre & Code

https://contrib.spip.net/Typographieplay episode download
5 April, by nicod_, tetue[ —]

Ce plugin rationalise l'affichage du code sous SPIP par l'usage des éléments HTML corrects et facilite le copier-coller de n'importe quel bloc de code.

Un seul raccourci :

Deux raccourcis sont prévus par SPIP pour afficher du code : ou .

Le premier raccourci, , sans doute le plus courant, s'utilise aussi bien pour un peu de code inline que pour un bloc de code. En effet, le code HTML qu'il génère s'adapte automatiquement, pour rester dans la ligne ou — dès lors qu'il contient plusieurs lignes de code — former un bloc qui va à la ligne.

Le second raccourci, , moins connu, génère un bloc de code formé de balises  : c'est un usage complètement détourné du HTML mais qui, selon la documentation, était prévu pour permettre d'en copier-coller le contenu plus facilement.

Avec ce plugin qui facilite le copier-coller de n'importe quel bloc de code, le raccourci devient inutile. Il reste néanmoins fonctionnel, par souci de rétro-compatibilité, en adoptant le fonctionnement du raccourci .

Copier-coller facilité

Ce plugin facilite le copier-coller des blocs de code : en survolant le bloc de code, un bouton « Copier » s'affiche ; au clic son contenu est copié dans le presse-papier. Simple et efficace.

Cela fonctionne avec la petite librairie javascript clipboard.js.

Code généré correct :

Ce plugin rationalise l'affichage du code sous SPIP en générant du code HTML correct (conforme à la spécification HTML du W3C). Avec ce plugin, les blocs de code sont désormais correctement formés des balises HTML appropriées

 et , comme suit :



...
code>>

La balise HTML

 a pour particularité de restituer le texte dans le code source de la même manière qu'il a été tapé : les espaces multiples, les tabulations et les sauts de ligne sont préservés. Pour en savoir plus, lire : À quoi sert la balise 
 ?

Distinguer les différents langages

Pour que vos lecteurs et lectrices identifient plus facilement le type de code affiché, vous pouvez ajouter un attribut class sur le raccourci pour préciser le langage utilisé : spip, php, html, css, js, less, scss, etc. Par exemple affiche visuellement et discrètement dans un coin du bloc qu'il s'agit de code « spip » :

Personnaliser l'affichage

Ce plugin injecte une feuille de style dédiée pour assurer un rendu lisible et agréable de vos blocs de code.

  1. Pour visualiser le rendu, affichez la page de démo ../?page=demo/precode dans votre site.
  2. Ajoutez vos personnalisations d'affichage via CSS, dans votre propre feuille de style. Pour ce faire, consultez : Le CSS pour la balise pre.

Ce plugin est compatible avec le plugin Coloration Code : il surcharge ses traitements et génère un code HTML valide. Il n'est par contre pas compatible avec l'affichage des numéros de lignes, cette option de Coloration Code génère un balisage HTML irrécupérable.

Exemples

Ce plugin est visible en situation sur le site pour lequel il a été initialement développé, notamment dans les articles de la rubrique « Atelier SPIP » :

Rendu des blocs de code avec le plugin Pre & Code sur le site romy.tetue.net

Il a été installé, associé à Coloration Code, sur les nouvelles versions des sites de la galaxie, où vous pouvez donc le voir fonctionner en situation : spip.net, programmer.spip.net et forum.spip.net

Rendu d'un bloc de code avec les plugins Pre & Code et Coloration Code sur les sites de la galaxie SPIP.

Évolutions

En l'état, ce plugin est un patch qui corrige le ticket 2504 :

 plutôt 
pour afficher du code en bloc. Pour la suite, voir sa todo.

Choix d'événements

23 March, by Maïeul[ —]

La version 3.19.0 du plugin Agenda permet de proposer dans un formulaire le choix parmi des événements gérés par le plugin Agenda, soit sous forme de boutons radio, soit sous forme de case à cocher.

Ceci peut être utilisé avec Formidable pour gérer des inscriptions à des événements récurrents nécessitant les mêmes informations de la part du·de la participant·e.

Raison d'être

Le système a été conçu pour une association qui propose des formations régulières (env 4 par ans). Ces formations demandent une inscription préalable. La personne qui s'inscrit doit remplir les mêmes informations pour chaque session. Par ex :

  • coordonnées ;
  • tarifs ;
  • compétences ;
  • modalités de logement et de transport ;
  • etc.

Il existait deux possibilités pour gérer les inscriptions à des événements, en plus du module d'inscription natif, mais limité, du plugin Agenda :

  • le plugin Formulaire de participation avec Formidable, mais celui-ci ne permet de gérer l'inscription qu'à un seul événement, alors que nous souhaitions avoir un formulaire générique pour l'ensemble des occurrences de l'événement répété.
  • le plugin Réservation d'événement, mais celui-ci possède une interface spécifique, alors que le salarié de l'association à l'habitude de Formidable.

C'est pourquoi nous avons créé une saisie spécifique qui permet de choisir entre un et n événements lors du remplissage d'un formulaire.

En tant que tel, il s'agit d'une simple saisie pour le plugin homonyme. Il peut donc être utilisée sans formidable, à travers la balise #SAISIE.
Toutefois, le présent article se propose de montrer un cas concret d'application à travers le plugin Formidable [1].

Installation

La saisie est fournit avec la version 3.18.0 du plugin Agenda.

Jusqu'au 5 avril 2018, elle était proposé dans un plugin « Saisie événements » qui a été fusionné avec le plugin agenda, et n'est donc plus disponible [2]

Pour le présent tutoriel, vous aurez besoin du plugin Formidable.

Utilisation avec Formidable

Vous disposez lors de la configuration des champs d'un formulaire Formidable d'un nouveau type de champ : sélection d'événements.

Sélection

Comme tous les champs d'un formulaire Formidable, celui-ci peut être configuré via une interface divisée en quatre onglets : Description, Utilisation, Affichage, Validation. Les trois derniers onglets ressemblent à ceux des autres champs, et nous ne les détaillerons pas.

Le premier onglet contient par contre des réglages spécifiques à ce type de champ « Sélection d'événement ».
Il permet de régler la liste des événements proposés, et la manière dont ils sont affichés.

Configuration d'un champ « Sélection d'événements »

Plusieurs critères de sélection sont possibles, ces critères sont cumulatifs : les événements qui seront proposés répondent à tous ces critères.

Lien à d'autres objets

Il est possible d'indiquer précisément les identifiants des événements que l'on propose. Toutefois, bien souvent on préférera sélectionner les événements en fonction d'un lien avec d'autres objets :
- événements associés à un article
- événements associés aux articles d'une rubrique
- événements associés aux articles d'une branche
- événements associés à des mots clé.

Par date

Il est possible de sélectionner les événements par date de début, selon quatre critères :
- une date de début minimum fixe : par exemple tous les événements qui commencent après le 2 janvier 2018.
- une date de début maximum fixe : par exemple tous les événements qui commencent avant le 31 janvier 2018.
- une date de début minimum variable : par exemple tous les événements qui commencent aujourd'hui, ou plus tard.
- une date de début maximum variable : par exemple tous les événements qui commencent d'ici un an.

Mode de présentation des événements

Les événements peuvent être présentés :
- avec juste le titre de l'événement ;
- avec juste la date de l'événement ;
- avec juste le titre et la date de l'événement.

Choix des événements

La saisie permet de proposer les événements :
- soit sous forme de bouton radios : l'utilisatrice·teur choisit un événement ;
- soit sous forme de case à cocher : l'utilisateur·trice choisit un ou plusieurs événements.

Note sur la manière dont sont stockés les événements

Une fois le formulaire validé, le ou les événement(s) sont stockés sous forme de leur identifiant numérique unique. Cela signifie deux choses :
- si le titre de l'événement ou sa date est modifié après coup, cela se verra dans l'enregistrement de la réponse ;
- il vaut mieux ne pas basculer un formulaire d'un mode « case à cocher » vers un mode « bouton radio ».


[1] Nous supposons, en effet, que les personnes capables d'utiliser #SAISIE en tant que programmeur·euse·s pourront utiliser les informations du présent article, alors que si nous avions fait un article centré sur l'utilisation de la #SAISIE événements, nous n'aurions pas nécessairement permis aux personnes ne programmant pas de l'utiliser avec Formidable.

[2] Excepté bien sûr via les archives de la SPIP zone, bien sûr.


0 | 10










mirPod.com is the best way to tune in to the Web.

Search, discover, enjoy, news, english podcast, radios, webtv, videos. You can find content from the World & USA & UK. Make your own content and share it with your friends.


HOME add podcastADD PODCAST FORUM By Jordi Mir & mirPod since April 2005....
ABOUT US SUPPORT MIRPOD TERMS OF USE BLOG OnlyFamousPeople MIRTWITTER