Categories
Uncategorized

Actions et exec

Exactement comme le fait le noyau, un plugin peut fournir des action ou des exec qui seront directement chargeables par requête url.

En théorie, un exec n’effectue pas de modification par lui même mais les délègue à des action qui ne devraient elles-même pas faire d’affichage. Ce n’est toutefois pas toujours respecté et on retiendra surtout qu’un exec se déclenche depuis l’espace privé ecrire/ alors qu’une action l’est depuis l’espace public, la racine du site.

exec


Ces scripts son fournis dans un sous-répertoire exec/. Le script exec/xxx.php est lancé par l’utilisateur final en demandant l’url http://le.domaine.tld/ecrire/?exec=xxx[&param=blah]

Il doit fournir une fonction principale exec_xxx() ou exec_xxx_dist() (si on veut la rendre surchargeable) qui sera le point d’entrée chargé par ecrire/index.php. Cette fonction ne prend pas d’argument. Elle récupèrera les paramètres éventuels dans la requète par appel de _request() (GET ou POST

Un plugin peut ainsi fournir des exec supplémentaires ou surcharger ceux provenant du noyau.

action

Exactement de la même façon de un travel insurance, un plugin peut fournir des action par l’intermédiaire d’un script action/xxx.php.Une action sera lancée par l’url http://le.domaine.tld/?action=xxx[&param=blah]

La fonction que ecrire/public.php lancera dans ce script est : action_xxx() où xxx est le nom de l’action. Comme pour exec, cette fonction ne prend pas d’argument mais récupère ses paramètres éventuels par _request()

Une action précise de plus un “redirect”, l’url qui doit être lancée lorsqu’elle s’achève. Cela passe par la globale $GLOBALS['redirect'] ou par le paramètre d’url de même nom.

Il existe de plus un mécanisme optionnel de sécurisation lié aux actions. Celui-ci passe par la fonction securiser_action() et utilise un argument spécifique à l’action (arg) et un hash calculé d’après l’auteur et cet arg grâce à la fonction calculer_action_auteur()

Comme pour les exec un plugin peut ainsi fournir des action supplémentaires ou redéfinir celles existantes.

Nommage

Attention, le nom d’un exec ou d’une action est unique dans tout le spip, il est donc important de veiller à l’unicité du nom qu’elle utilise si on veut éviter toute “collision”, bien sûr, dans la mesure où l’intention n’est justement pas de surcharger un autre exec ou action…

Un principe couramment adopté est de “préfixer” le nom de l’action ou de l’exec un water softener review par un mot unique, la tendance est d’utiliser le propre préfixe du plugin dont l’unicité est assurée. Cela donnera quelque chose comme action/prefixe_xxx.php ou exec/prefixe_xxx.php

Voir à ce sujet la convention en cours d’élaboration

French Technology Companies to Watch in 2012

As there is no dearth of coach hire services; there is also no dearth of technology companies in France. With the advancement of science and technology in Europe, a lot of technology companies have been coming into being each year in different parts of Europe. France is not an exception in this regard. As people are interested in the top ranked online MBA programs; people are also interested to know about the top ranked technology companies in France.

There are a lot of such companies. As anti aging skin care products can be divided into different types; the technology companies in France can be divided into different types. Two of the most prominent types are:

Software companies
Video Game companies

Some of the most important technology industries from these categories are discussed below. These are some of the companies in France to watch in 2012.

As you are interested to know about the best sell boats services; you are also interested to know about the well-known French Software industries. OVH is one of them. It is a web hosting service that is owned privately. This is well-known for its mutual hosting, VOIP services, dedicated servers and domain names. You will find all these services in a new form in 2012. This software farm has gained popularity due to its constant adaptation to the needs of its consumers. As Friendswood air conditioning can offer you a better service, this web hosting company can offer you a lot of services.

Evite is another well-known farm that you will find in a new look in 2012. This is a website specially meant for social-planning. It produces, sends and manages invitations in the internet. As people are always in search of high quality academic institutions for bachelors in criminal justice; people are also in search of high quality software farms. So, people are leaning towards it for a better service.

As Melaleuca Foundation restores the hope of people in disaster; the video game industries in France also restore the hopes of so many people around the world. Each New Year, a lot of new games are coming into being to entertain the people worldwide. As trazer amor de volta can help you out of different problems; these companies also help the games lovers out of their daily problems by giving them monetary relief.

Adeline Software International is known for its wonderful video games and people are eagerly waiting for its 2012 versions. This is basically a game developer company that is working since 1993. Since then, its motto is the sheer entertainment of its consumers.

BigBen Interactive is another important name in the field of video games. As medical aid is important to save the physical health of the people; BigBen Interactive games are also important to save the mental health of the people. Video game lovers around the world are crazy about its games.

So, these are some of the old French technology companies to watch in their new form in 2012. As it is not possible to mention the names of all the institutions for accredited online MBA; it is also not possible to mention all the names of the technology companies.

Categories
Uncategorized

Internationalisation

La gestion des textes en pludieurs langues par un plugin est tout à fait similaire à celle existant dans le noyau.

Il suffit de fournir un sous-répertoire lang/ dans lequel on place des fichiers de traduction comme chose_fr.php, chose_en.php, etc.

Ces fichiers rajoutent au tableau global de nom $GLOBALS['idx_lang'] les chaînes traduites indicées par le mnémonique de traduction. Par exemple, le plugin crayons fournit une traduction allemande dans le fichier lang/crayons_de.php ainsi :

Important : on voit ici que $GLOBALS['idx_lang'] est bien le nom de la globale et non pas la globale elle-même.

On utilise ensuite ces chaines traduites en les préfixant par le nom du fichier langue.

Dans les squelettes : <:chose:mnemonique:>, par exemple ici <:crayons:annuler:>

Dans le PHP en utilisant la fonction _T() comme _T("chose:mnemonique")

Les mnémoniques avec des, anthony morrison scam @param@ sont des chaines paramétrées. Elles permettent d’incorporer des valeurs variables dans la traduction. Par exemple, la 2ème ligne de l’exemple tiré de crayons s’utilise en fournissant 2 variables comme arguments supplémentaires à _T() : _T("crayons:editer_@type@_@id@, $type, $id). Si type vaut “article” et id 17, on obtiendra : “article 17 voll ändern”

Il est impératif d’utiliser dans les traductions des entités html ou numérique pour les caractères accentués, comme ici &auml ; pour ä.
A titre de curiosité, la première chaîne en arabe devient :
’annuler’ => ’&#1573 ;&#1604 ;&#1594 ;&#1575 ;&#1569 ;’
qui donne 'annuler' => 'إلغاء'

Si la traduction n’existe pas, le mnémonique outdoor garden fountain sera utilisé, les tirets bas (underscore) étant remplacés par des espaces.

A noter que le nom du fichier de traduction qui fournit le préfixe précédant les deux-points est en fait indépendant du nom du plugin. On peut même fournir plusieurs fichiers de préfixes différents pour un même plugin.

Categories
Uncategorized

La pièce centrale : plugin.xml

Un plugin est déterminé par sa pièce centrale : le fichier plugin.xml situé à sa racine.

Ce document suit la syntaxe xml. Son élément racine est <plugin>. Attention, il doit utiliser uniquement des caractères ASCII (non accentués) pour assurer sa portabilité. On doit donc utiliser des entités html ou numériques pour tout autre caractère.

Balises de description :

Elément Description Obligatoire Typo
<nom> Le nom du plugin tel qu’il apparaitra dans le panneau de configuration. X
<version> La version du plugin X
<etat> Etat du plugin, parmi dev (developpement), experimental, test, stable. X
<auteur> Le ou les auteurs du plugin. Vous pouvez utiliser les raccourcis typo et chaînes de langue dans ce champ. X
<description> Décrit ce que fait le plugin. X
<lien> Liens html vers la homepage ou la doc du plugin qui donne plus d’information sur son fonctionnement. X

Balises d’implémentation :

Elément Description Obligatoire Typo
<prefix> permet de définir le nom des préfixes de fonction définies par le plugin. Pour des raisons de cohabitation saine avec ses petits copains plugins, toutes les fonctions propres à votre plugin devront commencer par ce préfixe. Regardez les exemples du plugin « Rien » pour voir comment faire. La seule contrainte est de préfixer les declarations de fonction et d’ecrire vos appels de fonction sur le mode $truc = Rien_ma_fonction($val);. X
<options> permet de définir un fichier qui sera chargé à chaque hit, comme l’était le fichier mes_options.php.
<fonctions> permet de définir un fichier qui sera chargé à chaque recalcul de page, comme l’était le fichier mes_fonctions.php.
<pipeline> permet de définir un point d’insertion du plugin dans un pipeline de traitement.

Cet élément <pipeline> inclut alors les sous-éléments suivants :

Elément Description Obligatoire Typo
<nom> donne le nom du pipeline ou insérer l’appel au plugin. X
<action> donne le nom de la fonction à appeler (sans le préfixe qui sera ajouté automatiquement par SPIP). Si non précisé, ce sera le nom du pipeline soit une fonction : prefix_nom_pipeline()
<inclure> Nom du fichier à inclure pour que la fonction soit disponible. Si non précisé, la fonction doit être disponible dans le script options

Les tags <nom>, <version> et <prefix> sont obligatoires. Les autres sont facultatifs. Il n’est pas autorisé d’utiliser un nom de fonction identique au nom de préfixe (La fonction Rien_rien() sera refusée parce que c’est comme ca – pour les curieux je peux raconter l’histoire… -), ni d’utiliser les noms de fonctions install, uninstall et configure qui sont réservés pour des évolutions que vous devinez déjà.

Pour des raisons de performance, il est conseillé de découper proprement les fonctions de son plugin dans des fichiers séparés, afin que seules les fonctions requises soient chargées lors des include.

Et pour plus de réponses à vos questions n’hesitez pas à regarder tous les exemples disponibles sur spip-zone.

Voir description initiale sur contrib dont cet article reprend des extraits.

Répondre à cet article

Suivre la vie du site

Categories
Uncategorized

Structure générale de spip

SPIP est un CMS unique en son genre.

Au delà de son fonctionnement qu’on peut qualifier de “data driven”, à savoir piloté par les données (les fameuses BOUCLES), il a toujours fourni en première ligne les moyens de “customiser”, adapter son fonctionnement et sa présentation au goût et aux besoins propres au site.

C’était d’abord la possibilité de fournir ses propres “squelettes” (templates), d’adjoindre des fragments de php spécifiques et de surcharger les fonctions de base du core (les xxx_dist() que nous verrons plus loin).

La version 1.9 introduit un mécanisme complémentaire, les plugins. Ils sont issus de la volonté d’ouvrir spip à des fonctionnalités supplémentaires sans alourdir le noyau de SPIP (le core). La tendance actuelle est même d’alléger ce core en transférant les fonctionnalités optionnelles dans des plugins. SPIP 2.0 devrait être réduit et livré avec une collection de plugins “de base” que l’utilisateur activera selon ce qu’il utilise réellement. Par exemple, il est question que les brêves ne soient plus dans ce core mais dans un plugin optionnel. En effet, seule une partie des installations les utilisent et il est préférable de ne pas alourdir le système de base pour ceux qui n’en ont pas besoin.

Mais déjà, SPIP 1.9 a complètement réorganisé les répertoires qui le constituent afin de bien séparer les éléments selon leur durée de vie, le fait qu’il soient modifiables et leur appartenance à ce qui est propre ou spécifique au site ou au code de base. Un des autres objectifs visés ici est la possibilité de mutualiser le noyau : que plusieurs sites puissent partager une base de code commune.

Etudions d’abord cette nouvelle organisation des répertoires, de ce qui appartient à SPIP à ce qui est propre au site, de ce qui reste constant à ce qui bouge.


DISTRIBUTION


racine du site

La racine a été complètement vidée et ne contient pratiquement plus que index.php qui redirige sur spip.php, c’est maintenant l’unique point d’entrée de la partie publique du site.

inc-public.php3 est un fichier fantome pour assurer la compatibilite ascendante.

.htaccess optionnel pour l’url rewriting essentiellement.

win_png.htc et rien.gif pour assurer la transparence png avec MSIE

ecrire/

Ce dossier contient maintenant l’ensemble des fichiers interprétables côté serveur (PHP et MySQL) et ce, aussi bien pour le coté “public” (sous-dossier public/) que pour le coté “privé”.

Le nom de ce dossier est historique, c’était auparavant là où on trouvait le code permettant de modifier le contenu du site. Paradoxalement, c’est un dossier maintenant immuable, on “écrira” plus jamais dedans. Dans une installation normale, il ne contient que les scripts livrés par la distribution, il est quasi impératif de ne pas y faire de modification.

Son script index.php est le point d’entrée de ecrire/, la partie privée du site.

Voyons la documentation de spip.net pour le détail.

dist/

Il contient tous les fichiers livrés au client (HTML, Javascript, feuilles de style, images de différents formats) ainsi que les patrons de mise en page nommés squelettes. Ces squelettes sont interprétés coté serveur afin d’envoyer au client un texte purement MIME (la plupart du temps du HTML, mais aussi du RSS, du SVG … voire du JS).

Ce sont les modèles standards livrés avec SPIP, ils ne doivent eux aussi pas être modifiés mais remplacés en les copiant dans squelettes/

Détail dans la documentation de spip.net

oo/

Ce dossier fournit le mode “accessibilité” de spip (spip en mode texte), Il contient essentiellement un index qui renvoie dans le système standard.


ADAPTATION


config/

Ce dossier créé à l’installation contient le script de connection à la base de données, connect.php et le script fixant le mode des fichiers créés par le serveur, chmod.php.

C’est aussi ici qu’on place les options universelles du site, mes_options.php

IMG/

Il contient tous les documents originaux (taille réelle) du sites. Il est subdivisé en sous-dossiers par types de documents.

A l’installation, il ne contient que les documents de test pour la fabrication des images.

squelettes/

C’est ici qu’on dispose tous les fichiers scripts, images, formulaires … propres au site en suivant la même structure que ecrire/ ou dist/. Par exemple, pour redéfinir le sommaire du site, on y copie/adapte le sommaire.html de la dist/.

On met là notamment, le script mes_fonctions.php qui est chargé à chaque recalcul de page. A noter qu’il est possible de faire un xxx_fonctions.php qui sera chargé uniquement lorsque la page xxx sera demandée, exemple sommaire_fonctions.php

A l’installation, ce dossier n’existe pas, il faut le créer.

plugins/

Ce dossier qui est aussi à créer par soi-même reçoit les sous-dossiers de chaque plugin. Par exemple, le plugin crayons est placé dans plugins/crayons/.

C’est ce dossier qui fait l’objet de cette formation.


TEMPORAIRE


local/

Il contient tous les fichier (re-)calculables à partir des documents et données du site.

Il s’agit essentiellement des caches d’images réduites. On y trouve aussi les caches calculés par certains plugins comme coloration_code.

Ce dossier peut être vidé, cela ne coûtera que son recalcul.

tmp/

Ici sont stockés tous les fichiers temporaires comme les caches de squelettes, les sessions, les logs etc.

Il contient aussi le sous-réperoire dump/ où sont effectuées les sauvegardes de données.

Ce dossier peut être vidé à tout moment. Voir Étendre SPIP
et Contribuer au développement de SPIP

Categories
Uncategorized

Mecanismes de fabrication des pages publiques et privées

En version 1.9, le fonctionnement de SPIP a été rationalisé complètement. Il n’existe plus maintenant que 2 points d’entrée pour le site :

  • Public : index.php alias spip.php à la racine
  • Privé : ecrire/index.php

La page demandée est précisée dans un cas comme dans l’autre par les arguments GET ou POST associés à la requète. Nous verrons plus loin quels sont les principaux.

A de très rares exceptions près (a priori customisation), tous les autres scripts présents dans l’arborescence ne sont pas exécutables directement mais uniquement incluables. Ils sont d’ailleurs en général “protégés” par un test initial :

Ceci vérifie que la constante _ECRIRE_INC_VERSION est définie, ce qui ne sera pas le cas si le script est chargé directement.

Cette constante est définie par ecrire/inc_version.php qui constitue la clé de voute de l’architecture SPIP. Ce script est en effet inclus pratiquement en tout début par les index public ou privé.

Pour l’index public, cela passe par l’inclusion initiale de ecrire/public.php : mis à part cet include, on peut voir que cet index est pratiquement vide.

ecrire/inc_version.php

Ce script est commun à tous les composants de spip. C’est lui qui procède aux définitions, initialisations et inclusions de base qui déterminent le fonctionnement de tout le reste. Il initialise les constantes et les variables globales nécessaires au fonctionnement de SPIP, notamment celles assurant sa portabilité sur les différentes plates-formes.

Assez tôt lors de son chargement, il inclut les fichiers :

  • inc/utils.php, où figurent les fonctions indispensables à SPIP (voir plus loin)
  • le script optionnel hors distribution nommé mes_options.php qui permet de moduler cette initialisation sans avoir à modifier le fichier inc_version.php.

Déroulement du code :

  • définition de la constante “clé” _ECRIRE_INC_VERSION vue plus haut
  • définition des constantes représentant les répertoires de base de SPIP et en particulier _DIR_RACINE, racine du site, et _DIR_RESTREINT, répertoire ecrire/ sur lesquelles toutes les autres constantes de dossier seront basées, voir le détail dans le code.
  • recherche, sans encore l’inclure du script mes_options.php historiquement dans ecrire/ et dans une installation normalisée dans config/
  • initialisation de l’ensemble des globales de base de spip dont les variables de personalisation, voir index technique de spip.net
  • inclusion de inc/utils.php
  • inclusion de mes_options.php optionnel
  • appel de spip_initialisation() si mes_options ne l’a pas déjà fait (en particularisant éventuellement cette initialisation). Elle prend en paramètre les 4 répertoires de base de spip : config/, IMG/, tmp/ et local/ et :
    • définit à partir d’eux tous les répertoires nécessaires à spip et les droits qui leur sont affectés.
    • récupère et désinfecte tous les arguments de la requète : GET, POST, COOKIES et environnement serveur.
    • installe le module de lecture/écriture/suppression de fichiers nécessaire entre autres à tous les caches
    • commande le chargement des métas, la configuration de spip, depuis la base de donnée … et incidemment la connection à cette base.
  • charge les plugins à partir du cache tmp/charger_plugins_options.php en regénérant si nécessaire ce script.

Si l’on est en cours d’installation, inc_version.php a un fonctionnement particulier que nous n’aborderons pas ici.

inc/utils.php

Ce script ne réalise aucune action mais définit les fonctions utilitaires fondamentales de spip. Il y en a plus d’une cinquantaine ! Voici les plus importantes :

  • find_in_path() : afin de permettre la customisation du site, le plupart des fichiers, que ce soit script, squelettes ou fichiers servis comme les images, sont recherchés dans le “path”, dans l’ordre, les répertoires :
    • squelettes : ceux optionnellement définis dans $GLOBALS['dossier_squelettes'] et squelettes/
    • des plugins activés
    • ecrire/
    • dist/
    • racine du site
  • include_spip() : permet d’inclure un script php selon le schema précédent, donc de le surcharger en fournissant une alternative (communément appelée “fork”)
  • charger_fonction() : scenario identique mais adapté à une fonction, celle-ci pouvant être définie n’importe où. Le mécanisme cherche d’abord la fonction sous son nom() puis si pas trouvée, sous nom_dist() comme c’était fait historiquement (tous les fichiers de Spip sont chargés par ces deux dernières fonctions).
  • spip_log() : utilitaire permettant de faire des logs, typiquement dans tmp/spip.log, important pour la mise au point et le suivi d’un site. A noter qu’étant basée sur un var_export(), on peut lui passer tout type de paramètre à tracer.
  • spip_query() : toutes les requètes SQL doivent passer par cette fonction. Important, il faut préciser les noms des tables comme spip_nomtable, la fonction se chargeant de remplacer “spip_” par le véritable préfixe des tables de l’installation.
  • _q() : cette fonction protège les variables incluses dans une requète SQL (échappement). Il est fondamental de passer toute variable utilisée dans une requète SQL si on veut éviter des attaques par injection
  • _request() : permet de récupérer des variables argument de la requète, sans se préoccuper qu’elles viennent d’un GET, POST ou COOKIE et en étant assuré qu’elles sont “nettoyées” correctement.
  • spip_initialisation() vue plus haut

config/mes_options.php

Ce script optionnel permet de configurer les constantes, variables et fonctions de spip “à sa sauce”.

On peut :

  • y adapter les variables de personalisation (globales), par exemple les dossiers squelettes spécifiques ou le type d’url propre utilisé.
  • redéfinir des fonctions dépendant du mécanisme xxx_dist() ou plus généralement chargées par charger_fonction()
  • définir des “constantes” PHP : en effet, une fois définie, une constante PHP ne peut plus être changée dans la session

En particulier, il est possible dans ce fichier personnel d’invoquer la fonction spip_initialisation pour définir les répertoires de données et, par exemple, disposer ainsi de plusieurs sites sous SPIP utilisant une seule distribution (l’appel standard de cette fonction, plus loin dans inc_version.php, sera automatiquement neutralisé).

Argument de requète principal

Comme on l’a vu, les seuls accès à spip se font par index.php à la racine ou dans ecrire/. La page demandée est précisée par les arguments accompagnant cette requète. Ce peut être par GET ou POST. Ces arguments peuvent être explicites ou générés par l’url rewriting lorsqu’on utilise les urls propres.

Il s’agit de :

  • page : c’est l’unique argument pour l’espace publique. Il précise la page demandée comme sommaire (le défaut), article … Il est interprété par ecrire/public.php pour déterminer le fond principal (le squelette.html du même nom que l’argument page) à renvoyer après l’avoir “rempli” en fonction des autres paramètres de la requète comme id_article.
  • action : bien que ce paramètre soit aussi interprété par ecrire/public.php , il s’agit ici d’une requète effectuant (si tout va bien) une modification dans les données du serveur. SPIP fournit un mecanisme permettant de sécuriser une telle requète. Le script qui sera utilsé est action/xxx.php où xxx est la valeur de action
  • exec : c’est typiquement l’argument d’une url “privée”. Sa valeur xxx donne le script ecrire/exec/xxx.php qui sera utilisé.

Voir Étendre SPIP

Categories
Uncategorized

Installation de plugins

Categories
Uncategorized

Tour d’horizon des plugins courants, que peut fournir un plugin

Categories
Uncategorized

Présentation des urls libres

Unification et extension des urls propres 1.9.2
Disponible sous forme de plugin, mise en place immédiate

Le plugin urls libres prend en charge la génération et l’anlyse des urls en “texte clair” pour les relier aux références numériques des “objets” de spip. Il maintient la compatibilité avec les anciens urls propres et intègre les fonctionnalités de propres2, notamment vis à vis des robots référenceurs. Prémisses pour les 5 ans de spip

 

spip-1.9.2 : Etat des lieux

Assouplir les urls

Mise en service

Categories
Uncategorized

Listes imbriquées hétérogènes

Test pour spip 1.9.2

 

Des listes où on mélanges * et # comme -*#*

  • Your horse is :
    -
    -
    -
  • but my rabbit is
    • white :
      -
      -

Des listes où on ne mélange pas * et #

  • Your horse is :
    • chestnut ;
    • bay ;
    • black ;
  • but my rabbit is
    • white :
      • angora
      • or short-haired.

  1. first
  2. second
  3. third

- simple
- si simple
- vraiement

Categories
Uncategorized

Widgets

Le plugin widgets dynamise l’espace public en permettant des mises à jour directes des articles et autres sans passer par l’espace privé, par le biais d’applets insérées par jQuery dans la page.

Le paramétrage coté squelettes est des plus simples, il suffit d’ajoindre 2 classes aux éléments qu’on veut rendre modifiables.

 

Transféré sur contrib