[dev] Le Couteau Suisse : développer un outil

... ou comment mieux comprendre « Le Couteau Suisse »

Le plugin « Le Couteau Suisse » propose d’introduire facilement de simples fonctionnalités supplémentaires à SPIP. Voici quelques conseils pour développer ou mieux comprendre un outil.

Cet article analyse le plugin Le Couteau Suisse au niveau du développement et fournit des renseignements à tous ceux qui désireraient, soit comprendre le fonctionnement du plugin afin d’en optimiser ou d’en améliorer certains aspects, soit développer eux-même de nouvelles fonctionnalités ou de nouveaux outils [1].

Généralités de développement

Savoir développer un plugin pour SPIP est un plus pour développer un outil, puisque l’outil est comme un « mini-plugin », mais ce n’est pas forcément nécessaire. Voici quelques liens d’information :
-  Plugins : Tutoriaux pour Plugins
-  Pipelines : http://doc.spip.org/@Tuto-Se-servir...

L’intégration des petits plugins existants est très simple :

-  Un paragrahe « add_outil() » à ajouter dans le fichier « couteau_suisse/config_outils.php » (voir la syntaxe ci-dessous).
-  Deux déclarations à ajouter dans chaque fichier de langue situé dans « lang/ » afin de définir le nom et la description du nouvel outil (voir la syntaxe ci-dessous). Pour ces deux premiers points, il suffit de récupérer les informations demandées dans le fichier « plugin.xml » de l’ancien plugin
-  Les fichiers *.php de l’ancien plugin doivent être placés sans aucune modification a priori dans le dossier « outils/ »
-  Il est donc toujours possible pour les auteurs de revenir sur leur code

L’intégration de nouvelles fonctionnalités est donc tout aussi simple :

-  Un paragraphe « add_outil() » à ajouter dans le fichier « couteau_suisse/config_outils.php » (voir la syntaxe ci-dessous).
-  Deux déclarations à ajouter dans chaque fichier de langue suitué dans « lang/ » afin de définir le nom et la description du nouvel outil (voir la syntaxe ci-dessous).
-  Un module (éventuel) à placer dans le répertoire « outils/ »
-  Une petite confirmation sur la page de configuration du plugin (ecrire/?exec=admin_couteau_suisse) et le tour est joué !

Syntaxe (format simpliste) des déclarations dans config_outils.php

 add_outil( array(
  'id' => # Un identifiant unique et sans espace
// optionnel (aide) :
  'auteur'   => # Auteur(s) de l'outil
  'contrib' => # Numéro d'article fournissant la doc sur spip-contrib.net
  'jquery' => 'oui', # Indique si l'outil nécessite la librairie jQuery
  'categorie' => # Une valeur égale, par exemple, à : 'admin', 'public', 'spip', 'divers', etc.
// optionnel (code) :
  'code:options'   => # Directement le code php à exécuter dans mes_options.php
  'code:fonctions'   => # Directement le code php à exécuter dans mes_fonctions.php
  'code:spip_options' => # Directement le code php à exécuter le plus en amont possible (options SPIP en général)
  'code:css'   => # Directement le code des styles à insérer entre <head> et </head>
  'code:js'   => # Directement le code Javascript à insérer entre <head> et </head>
  'code:jq'   => # Directement le code jQuery à exécuter quand le DOM est prêt
  'code:jq_init'   => # Directement le code Javascript ou jQuery à exécuter au chargement de la page ou d'un fragment Ajax
  'autoriser' => # Directement le code php à exécuter pour definir les droits de voir/manipuler l'outil en partie privée
# Les deux options suivantes désactivent l'outil si la version de SPIP ne convient pas
# Valeurs : 1.91, 1.92, 12691 pour SPIP 2.0, 14213 pour SPIP 2.1, etc.
  'version-min'	=> # La version minimale de SPIP pour utiliser cet outil.
  'version-max'	=> # La version maximale de SPIP pour utiliser cet outil.
# Les traitements utilisés :
  'traitement:UNEBALISE:1erMomentSpip' => # 'fonction à utiliser'
  'traitement:UNEBALISE:2eMomentSpip' => # 'fonction à utiliser'
  etc.
# Les pipelines utilisés :
  'pipeline:1erPipeline' => # 'fonction à utiliser'
  'pipeline:2emePipeline' => # 'fonction à utiliser'
  'pipelinecode:3emePipeline' => # Directement le code php a executer pour ce pipeline
  etc.
# Les fichiers distants placés dans couteau_suisse/lib/ :
  'distant' => # 'URL du fichier à rapatrier'
  'distant_pipelines' => # 'URL du fichier de pipelines à rapatrier'
  'distant_prefixe1' => # 'URL du fichier 1 à rapatrier'
  'distant_prefixe2' => # 'URL du fichier 2 à rapatrier'
  etc.
 ));

L’identifiant « id », seul paramètre indispensable, sert à plusieurs choses :

-  inclure le fichier du même nom, placé dans le dossier « outils/ » et contenant les fonctions utilisées,
-  lire les traductions du nom et de la description de l’outil. Celles-ci se trouvent dans les fichiers de langue du dossier « lang/ »,
-  inclure l’éventuel fichier de styles (.css) du même nom, placé dans « outils/ »
-  inclure l’éventuel fichier javascript (.js) du même nom, placé dans « outils/ »
-  inclure l’éventuel fichier d’options (mon_outil_options.php), placé dans « outils/ »
-  inclure l’éventuel fichier de fonctions (mon_outil_fonctions.php), placé dans « outils/ »
-  stocker dans la base de donnée l’état de l’outil : actif/inactif.

La fonction associée à chacun des pipelines utilisés doit se trouver dans un seul fichier, celui indiqué par « id ». Par exemple, si l’on déclare 'id' => 'mon_outil', et bien le fichier en question est : « outils/mon_outil.php ». Ensuite, dans tous les fichiers de langue (par exemple « lang/cout_fr.php » ou « lang/cout_it.php ») il faut bien définir les traductions comme ceci : 'mon_outil:nom' => 'Mon bel Outil', et 'mon_outil:description' => 'Ma belle description'. Enfin, si cet outil utilise les feuilles de styles, alors le fichier doit s’intituler « outils/mon_outil.css ». S’il utilise des fonctions javascript, alors le fichier doit s’intituler « outils/mon_outil.js ».

Concernant les autorisations et notamment le paramètre ’autoriser’, vous trouverez plus d’informations ici : [dev] Les autorisations du Couteau Suisse.

Le « cadre » du Couteau Suisse

Options, fonctions et pipelines

Le principe de Couteau Suisse est de compiler (lors de l’accès à la page privée de configuration du plugin, ou lorsque le rédacteur demande un calcul manuel de son article en partie publique) les options, fonctions et pipelines utilisés par les outils activés. Le plugin ne produit donc qu’un seul fichier « mes_options.php », un seul fichier « mes_fonctions.php » et un seul fichier par pipeline. N’hésitez pas à vous rendre dans le dossier « tmp/couteau-suisse » (SPIP versions 1.9.2 et suivantes) ou « ecrire/data/couteau-suisse » (pour les versions antérieures) afin de contrôler les divers fichiers ainsi créés.

Table des traitements

Si aucun pipeline n’est utilisé alors il est parfois nécessaire de créer un fichier « outils/mon_outil_fonctions.php » pour y stocker les fonctions nécessaires par exemple à un traitement automatique d’une balise SPIP (voir l’outil « decoupe »). Afin de gagner en performance et d’utiliser au maximum la personnalisation des balises SPIP, tous les traitements sont compilés au moment de l’installation des outils. Il est donc possible d’obtenir le code suivant :

$GLOBALS['table_des_traitements']['TEXTE'][]='fonction1(fonction2(propre(fonction3(%s))))';

grâce à la configuration suivante :

// 1er outil :
	'traitement:TEXTE:post_propre' => 'fonction1',
// 2ème outil :
	'traitement:TEXTE:post_propre' => 'fonction2',
	'traitement:TEXTE:pre_propre' => 'fonction3',

Attention, la syntaxe suivante est interdite, la deuxième ligne écrasant la première :

// Mon outil :
	'traitement:TEXTE:post_propre' => 'fonction1',
	'traitement:TEXTE:post_propre' => 'fonction2',

La bonne syntaxe (notez bien la parenthèse) est :

// Mon outil :
	'traitement:TEXTE:post_propre' => 'fonction1(fonction2',

Aide aux raccourcis

La liste des outils apportant de nouveaux raccourcis aidant à la rédaction des textes du site commence à s’allonger. Sur la page d’administration du plugin, sont maintenant listés (dans un cadre sur la gauche) les raccourcis typographiques actifs que l’on peut utiliser dans ses articles ou autres différents textes du site.

Chaque outil introduisant de nouveaux raccourcis doit prévoir une fonction « mon_outil_raccourcis() » qui renvoie l’aide en question en listant les raccourcis typographiques disponibles. Cette chaine (hors spécificités de langage !) peut-être pré-compilée lors de l’installation de l’outil, au sein de la fonction « mon_outil_installe() » en la stockant dans les données mises en cache par le Couteau Suisse (fichier tmp/couteau-suisse/mes_outils.php).

Lors de l’appel à l’aide, la chaine de langue prévue à cet effet est : ’mon_outil:aide’ et doit être présente dans les fichiers de langue (couteau_suisse/lang/). Par exemple : ’chatons:aide’ => ’Chatons : @liste@’. Le contrôle « @liste@ » sera remplacé par la liste des raccourcis préalablement calculée lors de l’installation de l’outil grâce à la fonction surchargeable chatons_installe_dist().

Au final voici comment est renvoyée l’aide aux raccourcis :

function chatons_raccourcis() {
	$chatons = cs_lire_data_outil('chatons');
	return _T('couteauprive:chatons:aide', array('liste' => '<b>'.join('</b>, <b>', $chatons[0]).'</b>'));
}

Si la fonction ’mon_outil_raccourcis’ censée traiter cette chaine de langue n’existe pas, alors la chaine de langue est utilisée telle quelle.

TODO : création d’une balise pouvant servir d’aide à la rédaction des forums.

Fonction d’exclusion de balises

La fonction cs_echappe_balises($balises, $fonction, $texte) permet aux outils utilisant des remplacements typographiques de protéger le texte situé entre certaines balises.
-  $balises est la liste de balises à ignorer. Exemple : ’html|code|cadre|frame|script|acronym|cite’
-  $fonction est la fonction de modification typographique
-  $texte est le texte d’origine à traiter

Si $balises='' alors les balises suivantes sont protégées par défaut : html|code|cadre|frame|script

Exemple simple d’utilisation :

function small_caps_remplace($texte) {
	return preg_replace("/\<sc\>(.*?)\<\/sc\>/",
		"<span style=\"font-variant: small-caps\">\\1</span>", $texte);
}

function small_caps($texte) {
	return cs_echappe_balises('', 'small_caps_remplace', $texte);
}

Cet exemple permet à l’outil small_caps de remplacer toutes les textes entre balises <sc> et </sc> par un texte en petites capitales. Mais tout ce qui se trouve entre <html> et </html>, <code> et </code>, <cadre> et </cadre>, <frame> et </frame> ou <script> et </script> est ignoré.

Installation d’un outil

Article dédié : [dev] Les données du Couteau Suisse

Une fonction d’installation est automatiquement appelée par le plugin (si elle existe), lorsque l’utilisateur demande manuellement de recalculer une page, ou lorsqu’un administrateur consulte la page de configuration du plugin (ecrire/?exec=admin_couteau_suisse). Cette fonction intitulée mon_outil_installe_dist() (notez bien le suffixe obligatoire « _installe_dist ») doit se trouver dans le fichier « outils/mon_outil.php » (voir l’outil « smileys » par exemple).

Une surcharge de la fonction l’installation des outils natifs fournis par le Couteau Suisse est possible en l’intitulant mon_outil_installe() (notez bien le suffixe obligatoire « _installe ») . Cette fonction, placée dans le fichier config/mes_options.php, remplacera automatiquement la fonction native.

Exemples :

// surcharge de la fonction d'installation de l'outil «typo_exposants»
function typo_exposants_installe() {
	$datas = typo_exposants_installe_dist();
	$datas['fr'][0][] = '/exemple/';
	$datas['fr'][1][] = 'ex<sup>emple</sup>';
	return $datas;
}
// surcharge de la fonction d'installation de l'outil «spam»
function spam_installe() {
	$datas = spam_installe_dist();
	$datas[0][0][] = 'averybadword';
	return $datas;
}

Cette fonction peut être utile pour stocker à long terme des données particulières dans un fichier compilé que vous pouvez facilement consulter (tmp/couteau-suisse/mes_outils.php) afin d’accélérer le futur calcul des pages du sites.

En somme...

Cela semble assez bien tenir la route pour l’instant... J’attends vos retours d’expériences !

Pour créer un nouvel outil, le mieux est toujours de voir comment sont configurés les autres (il y en a plus de 70 en 2012...) afin de s’en inspirer. En dernier recours, le forum ci-dessous est fait pour vous.

Exemples d’outils

Lignes à placer dans config_outils.php :

add_outil( array(
	'id' => 'pucesli',
	'auteur' => '[Jérôme]',
	'categorie' => 'typo-corr',
	'pipeline:pre_typo' => 'pucesli_pre_typo',
 ));

add_outil( array(
	'id' => 'forcer_langue',
	'code:options' => '$GLOBALS["forcer_lang"]=true;', 
	'categorie' => 'admin',
));

add_outil( array(
	'id' => 'decoupe',
	'traitement:TEXTE:post_propre' => 'decouper_en_pages',
	'categorie'	=> 'typo-racc',
));

Lignes à placer dans lang/cout_fr.php :

'pucesli:nom' => 'Belles puces',
'pucesli:description' => 'Remplace les puces - (tiret) des articles par des puces -* (<li><ul>...</li></ul>)',

Les variables

Le plugin « Le Couteau Suisse » permet de manipuler facilement des variables agissant sur le fonctionnement public ou privé de SPIP. Ces variables bénéficient donc d’une entrée spécifique (<input>) sur la page de configuration du plugin (ecrire/?exec=admin_couteau_suisse), afin que l’administrateur y porte ses choix. Il y a actuellement 4 types de variables : les cases ’input’ (chaine ou nombre), les boutons « radio », les cases à cocher et les listes de sélection.

Une variable est détectée par le plugin dès qu’elle apparaît dans la chaîne de langue de l’outil ayant besoin d’une variable configurable. Le Couteau Suisse se charge ensuite de créer le formulaire adéquat. Une variable doit apparaitre en suivant le format suivant : [2]. Pour qu’une variable (champ de formulaire au final...) soit attachée au même cadre (« fieldset ») que la variable précédente, utilisez le format suivant : [qq chose]. Dans ce cas, seul le label de la première variable est utilisé. Pour un retour à la ligne, utilisez le format suivant : [-].

Le label d’une variable est défini par une chaine de langue au format : ’label:ma_variable’. N’hésitez pas à lire le code du fichier lang/couteauprive_fr.php où sont centralisées toutes les descriptions d’outils du Couteau Suisse.

Voici néanmoins quelques exemples :

$GLOBALS[$GLOBALS['idx_lang']] = array(
	'mes_notes:description' => 'Vous pouvez définir le code ouvrant et fermant pour les notes de bas de pages. [[%ouvre_notes%]][[->%ferme_notes%]]',
	'mes_pixels:description' => 'Limitez à [[%img_max% pixels au maximum]].'.
	'label:ouvre_notes' => 'Votre choix :',
);

Notez bien :
-  Une variable détectée dans une chaîne de langue, mais non déclarée par la procédure add_variable() induira une erreur d’affichage dans la description de l’outil.
-  Une variable déclarée par la procédure add_variable(), mais non détectée dans une chaîne de langue ne pourra pas être configurée et utilisée.

Syntaxe (format simpliste) des déclarations de variables (dans config_outils.php par exemple) :

add_variable( array(
  'nom' => # Un nom unique et sans espace
  'format' => # type de variable : _format_CHAINE ou _format_NOMBRE
  'defaut' => # valeur par défaut prise par la variable
  'code' => # code php inline (la variable est ici représentée par %s) à insérer dans l'outil en lieu et place du raccourci %%ma_variable%% 

// paramètre optionnels :
  'radio' => # tableau de valeurs ('code' => 'valeur') où 'code' est un choix de réponse et 'valeur' la traduction _T('valeur') affichée dans la description de l'outil sur la page de configuration, sous forme de boutons radio
  'radio/ligne' => # nombre de boutons radio par ligne
  'select' => # tableau de valeurs ('code' => 'valeur') où 'code' est un choix de réponse et 'valeur' la traduction _T('valeur') affichée dans la description de l'outil sur la page de configuration, sous forme d'une liste de sélection
  'check' => # label d'un bouton de type checkbox
  'lignes' => # nombre de lignes (d'un textarea) nécessaires pour une variable de type _format_CHAINE
  'taille' => # taille d'un champ input (en nombre de caractères) pour une variable de type _format_CHAINE
  'code:condition' => # code pris en compte uniquement si 'condition' est vrai (la variable est ici représentée par %s)

// variables externes :
  'externe' => # code PHP inline pour récupérer la valeur de la variable externe
  'action' => # code PHP inline (la variable affectable est ici représentée par %s) pour traiter la nouvelle valeur choisie par l'utilisateur
 ));

Ces variables sont utilisées dans le code inline utilisé par les outils et le plugin les repère grâce à la syntaxe suivante : %%ma_variable%%. La valeur par défaut est la valeur attribuée à la variable lors de la toute première installation de l’outil en question ou lors d’une réinitialisation générale du plugin (ecrire/?exec=admin_couteau_suisse&reset=oui). Un outil peut sans aucun problème manipuler plusieurs varibles dans son code inline.

Voici un exemple d’outil utilisant une chaine de caractère que l’administrateur du site devra renseigner :

/*
Ici on demande au plugin une case input de type texte.
La variable est : cookie_prefix_var.
A la toute première activation de l'outil,
la valeur sera : $GLOBALS["cookie_prefix"]
Le code inséré dans mes_options sera : 
  $GLOBALS['cookie_prefix']="monprefixe";
*/
add_variable( array(
	'nom' => 'cookie_prefix_var',
	'format' => _format_CHAINE,
	'defaut' => "\$GLOBALS['cookie_prefix']",
	'code' => "\$GLOBALS['cookie_prefix']=%s;",
));
add_outil( array(
	'id' => 'cookie_prefix',
	'code:options' => "%%cookie_prefix_var%%",
	'categorie' => 'admin',
));

Voici un exemple d’outil utilisant une condition simple (grâce à ’code :%s’, le plugin insère le code dans mes_options.php seulement si la variable %s est non nulle) :

/*
Ici on demande au plugin une case input de type texte.
La variable est : forum_lgrmaxi.
A la toute première activation de l'outil, la valeur sera : 0
Si la valeur est différente de zéro (condition : '%s'), 
le code inséré dans mes_options sera par exemple : 
  define('_FORUM_LONGUEUR_MAXI', 1000);
*/
add_variable( array(
	'nom' => 'forum_lgrmaxi',
	'format' => 'nombre',
	'defaut' => 0,
	'code:%s' => "define('_FORUM_LONGUEUR_MAXI', %s);",
));
add_outil( array(
	'id' => 'forum_lgrmaxi',
	'code:options' => "%%forum_lgrmaxi%%",
	'categorie' => 'admin',
	'version-min' => 1.92,
));

Pour une condition plus poussée (ici ’code:strlen(%s)’ implique une utilisation du code si la variable %s est de longueur non nulle) :

/*
Ici, si la variable 'style_p' a une longueur nulle,
le code inséré dans mes_options sera  : 
  $GLOBALS['class_spip']='';
et si la variable 'style_p' a une longueur non nulle,
le code inséré dans mes_options sera par exemple : 
  $GLOBALS['class_spip']=' class="maclasse"';
*/
add_variable( array(
	'nom' => 'style_p',
	'format' => _format_CHAINE,
	'defaut' => 'spip',
	'code:strlen(%s)' => ' class=%s',
));
add_outil( array(
	'id' => 'style_p',
	'code:options' => "\$GLOBALS['class_spip']='%%style_p%%';",
	'categorie' => 'public',
	'version-min' => 1.93,
));

Les boutons radio (choix multiples prédéfinis) sont assez simple à définir. Il suffit de remplir le tableau ’radio’ au sein de la variable en question. Voici un exemple concernant le calcul des adresses du site :

/*
Ici on demande au plugin six boutons radio : _T('page'), _T('html'), 
_T('propres'), _T('propres2'), _T('standard'),  et _T('propres-qs')
La variable SPIP est : radio_type_urls3
le 'defaut' => 'page' signifie que 'page' (traduit par : _T('cout:page')) sera coché 
par défaut à la toute première installation de l'outil.
'mavaleur' => 'matraduction' signifie que la valeur 'mavaleur' est traduite 
par _T('cout:matraduction') dans les fichiers de langue (tweak_spip/lang/).
si l'utilisateur choisi le bouton 'html', 
alors le code inséré dans mes_options sera celui-ci :
  $GLOBALS['type_urls']="html";
*/
add_variable( array(
	'nom' => 'radio_type_urls3',
	'format' => _format_CHAINE,
	'radio' => array(
		'page' => 'page',
		'html' => 'html',
		'propres' => 'propres',
		'propres2' => 'propres2',
		'standard' => 'standard',
		'propres-qs' => 'propres-qs'
	),
	'defaut' => 'page',
	'code' => "\$GLOBALS['type_urls']=%s;",
));
add_outil( array(
	'id' => 'type_urls',
	'code:options' => "%%radio_type_urls3%%",
	'categorie' => 'admin',
));

Les listes de sélection (’select’) fonctionnent sur le même principe. Pour trouver un exemple, lisez le code de l’outil « Débogueur de développement » (fichier outils/devdebug_config.php).

Les variables externes sont des variables qui ne sont pas stockées par le Couteau Suisse. Deux paramètres sont nécessaires dans ce cas : ’externe’ et ’action’. Ceci est un peu équivalent au schéma get/set, appliqué à du code PHP inline. Exemple tiré de l’outil « SPIP et le cache… » :

add_variable( array(
	'nom' => 'compacte_js',
	'check' => 'Compacter le Javacript',
	'externe' => "\$GLOBALS['meta']['auto_compress_js']=='oui'",
	'action' => "ecrire_meta('auto_compress_js', %s?'oui':non);",
));

Surcharge d’outils existants

Il est possible de surcharger/compléter les outils existants grâce à la fonction suivante, à placer dans config/mes_optionsphp :

// Fonction reconnue par le C.S. pour étendre l'outil "mon_outil"
// Forme : {id_outil}_surcharger_outil($tab)
function mon_outil_surcharger_outil($tab) {
	$tab['cle_de_config'] = 'ma_valeur_de_config';
	return $tab; 
}

Voici un exemple d’extension de l’outil « Corrections automatiques ». Cette fonction permet aux balises #TITRE et #DESCRIPTIF de bénéficier également des corrections automatiques nativement réservées aux balises #TEXTE, #PS et #CHAPO :

function insertions_surcharger_outil($tab) {
	$tab['traitement:TITRE:pre_typo,
	 traitement:TITRE/mots:pre_typo,
	 traitement:DESCRIPTIF'] = 'insertions_pre_propre';
	return $tab; 
}

Dysfonctionnements

N’hésitez pas à remonter tout type de dysfonctionnement du plugin, nous essaierons d’y répondre, dans la mesure du possible. Dans un premier temps, tentez quand même de chercher les causes de vos soucis et soyez méthodiques. Le code est gratuit et améliorable ; chacun peut apporter une pierre à l’édifice.

Dans vos messages, soyez précis. Indiquez bien les différentes versions des éléments que vous utilisez : plugin, squelette, SPIP, PHP, etc. Pour débusquer un bug et trouver la source, il faut d’abord isoler le Couteau Suisse en désactivant les autres plugins, puis isoler l’outil défaillant. Désactiver temporairement son squelette et réutiliser le squelette source de SPIP (« dist ») peut également donner des informations utiles.

3 moyens de contact :
-  Le forum ci-après, histoire que tout le monde en profite
-  Les listes de diffusion comme spip.zone, sur gmane.org
-  Mail direct, si par hasard vous savez à qui vous adresser

Avant toute chose, assurez-vous d’avoir :
-  la toute dernière version du plugin
-  validé la page des plugins (admin_plugin)
-  validé la page du couteau suisse (admin_couteau_suisse)
-  vidé le cache
-  supprimé le dossier tmp/couteau-suisse

Historique

Pour l’instant, il n’y a pas d’historique officielle. Juste les logs de la version SVN disponibles ici.

L’outil « Boîtes Privées » vous permet de suivre en direct les derniers dépôts SVN. Rendez-vous sur la page de configuration (ecrire/?exec=admin_couteau_suisse).

Perpectives

Le plugin activé, mais sans aucun outil activé ne fait absolument rien de significatif. Des optimisations sont probablement encore à faire. En effet, le plugin fonctionne bien et remplit son office correctement : il précompile les outils à l’avance et facilite ensuite le calcul des pages avant la mise en cache. Mais préserver les ressources est toujours la priorité de ses auteurs et de ses utilisateurs. Ce qui est sûr, c’est qu’il vaut mieux deux outils que deux plugins !

Aujourdhui, trois façon différentes permettent d’écrire des lames. La première est décrite plus haut. Voici les deux suivantes :

1. Cas des fichiers PHP outils/*_config.php

Depuis la version 1.8.09.00 du plugin, une nouvelle façon d’écrire des lames est apparue : la définition et la configuration d’un outil grâce à un fichier PHP « outils/mon_outil_config.php ».

Plus de doc serait maintenant à écrire sur le sujet, mais un rapide coup d’oeil au fichier outils/type_urls_config.php peut donner une idée sur cette façon de faire que nous recommandons.

Quelques exemples : [dev] Le Couteau Suisse à piloter.

2. Cas des fichiers XML outils/*_config.xml

Depuis la version 1.8.10.02 du plugin, une troisième façon (encore expérimentale) d’écrire des lames est apparue : la définition et la configuration d’un ou plusieurs outils grâce à un fichier XML « outils/un_fichier_config.xml ».

Plus de doc serait également à écrire sur le sujet, mais un rapide coup d’oeil au fichier outils/interface_config.xml peut donner une idée sur cette façon de faire. SPIP ne gérant pas encore les données CDATA (indispensables pour le code PHP inline par exemple) insérées dans un fichier XML, il est sans doute utile de faire mûrir cette troisième idée.

Notes

[1N’hésitez pas à vous lancer !

[2texte avant %ma_variable% texte après

Discussion

4 discussions

  • 3
    Mikado

    Bonjour, j’ai installé le plugin et j’ai bien l’espace coureau suisse dans configuration... Mon problème est que je ne peux pas changer les données... par exemple :

    Par défaut, SPIP calcule toutes les pages publiques et les place dans le cache afin d’en accélérer la consultation. Désactiver temporairement le cache peut aider au développement du site. Désactiver le cache :
    Non


    Par défaut, la case est cochée non...dans ce cas il m’est impossible de mettre oui...

    Que dois-faire... ?

    Merci pour votre aide...

    • J’ai eu le même problème :
      (192c)

      Il suffit de valider les options (là rien ne change on est d’accord) en suite clique sur valider (en haut à gauche) pour recharger le CS.

      Et normalement tes options de cache sont prise en compte.

      C’est vrai que c’est contraignant (comme si les grèves ne suffisaient pas ;) ) mais il est clair que ce bug sera corrigé dans une prochaine version du plugin ou de Spip.

    • Cette petite contrainte n’a-t-elle pas été levée dans la nouvelle interface ?

    • En effet, sur la version que j’ai récupéré aujourd’hui il semblerait que ce soit résolu. Je dis ça parce que j’ai un erreur http302 qui s’immisce dans la manip. Cependant je ne crois pas que ce soit le fait du CS car j’ai cette erreur sur tout le site (notamment lors des sauvegardes/restaurations de la DB. Donc je penche plus du coté de free pour cette erreur

    Répondre à ce message

  • 1

    Bjr, Glossaire prend « ses » mots dans le groupe de Mots-Clé « glossaire », ce qui est un bon choix fonctionnel (on peut facilement rajouter des mots) mais peut être assez limitant. Pourrait-on « offrir un choix de personnalisation plus poussé » ( changer le titre du groupe de MC, proposer plusieurs groupes comme source des mots, ne pas avoir à créer de doublon inutile)

    Il est certes possible de modifier le         $r = spip_query("SELECT id_mot, titre, texte FROM spip_mots WHERE type='Glossaire' "); , mais forcément la MAJ suivante fera perdre le minitrunk-là ;:O)

    Perso j’aimerais que le Glossaire soit cohérent avec mon groupe « Dossiers du site » que j’ai donc renommé en « Glossaire » et qui est cohérent avec l’affichage de la page=motxx, mais j’aimerais rajouter une série de mot « définition » (pas de lien vers article) et ne pas avoir à mettre tous mes mots-clé dans le mêm groupe

    Perso il me faudrait aboutir à un         $r = spip_query("SELECT id_mot, titre, texte FROM spip_mots WHERE type='Glossaire' OR type='Programmation' OR type='Definitions'"); ou qqchose d’approchant

    -  site d’exemple Merci

    • Merci pour cette proposition intéressante et détaillée. La version 1.7.6.8 du Couteau Suisse intègre donc la possibilité de choisir le ou les groupes de mots-clés pour le glossaire interne.

    Répondre à ce message

  • 3

    Eh ben Pat’, je vois que ton plugin a fait du chemin, c’est cool :)

    Là j’ai du pauser un peu mes travaux spipiens mais attend toi à ce que je te rebalance feedbacks sur feedbacks qd je m’y serais remis :P

    Bonne continuation à toi et merci pour tout ce taff que tu abats

    • Eh oui les choses avancent doucement. Merci des tes encouragements. Tu vas devoir faire des mises à jour ;-) Pour feu Tweak-SPIP, il vaut mieux supprimer son répertoire avant d’activer le Couteau Suisse !

    • Et à ce que je vois aussi tu as toujours un temps de réponse assez court entre les messages des utilisateurs et tes réponses, punaize, c’est génial, t’es encore plus g33k que moi :-P :-D

    • mdr ;-) ne crois pas ça, les vacances arrivent !!

    Répondre à ce message

  • 1

    bonjour,
    une petite remarque sur les présentations en passant :

    (à croire que personne imprime... )
    les portions de code dans les ascenceurs sont 3 fois sur quatre incomplet à l’impression.

    des fois le code peut être réduit en taille, ici c’est pas le cas...

    (j’ai pas dit merde...!) ;-)

    sur ce,
    bonne continuation à tous les couteaux et à tous les suisses...

    • Ah, il doit s’agir ici des styles d’impression de SPIP... Il faut ouvrir un ticket dans ce cas et signaler ce problème ici : http://trac.rezo.net/trac/spip/report (cliquer sur « Connexion » avant toute chose).

      Ne pas hésiter à être très clair et détaillé, sans oublier des liens en exemple...

    Répondre à ce message

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

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