Carnet Wiki

Migrer un plugin vers spip3

Version 7 — Octobre 2011 JLuc

<blockquote class="spip">

- trucs et astuces pour le portage des plugins sous spip 3
-  trucs glanés à partir de l’analyse des commits de la zone qui signalent des adaptations du code pour compatibilité avec spip3.

Cette liste ouverte à tous : reportez y vos trucs et bonnes pratiques de portage des plugins vers spip3

Voir aussi :

- l’aide mémoire de la représentation en mémoire de la base de donnée (les « déclarations ») pour SPIP3, avec la comparaison avec SPIP2 : https://spreadsheets.google.com/spreadsheet/ccc?key=0Aq-LDsZ2YhzydDBvMjRSamQ5aWtfNWpKcnFESjQwU3c&hl=fr&authkey=CMmWhpEC

- Voir aussi  : migrer un plugin vers spip2

</blockquote>

Logs avec niveaux

Le niveau de log doit être concaténé au nom du fichier de log.

exemple avec http://zone.spip.org/trac/spip-zone/changeset/47826 :

_ spip_log("ACTION ACTUALISER DEPOT (manuel) : id_depot = ". $id_depot, 'svp'); 
_ devient
_ spip_log("ACTION ACTUALISER DEPOT (manuel) : id_depot = ". $id_depot, 'svp_actions.' . _LOG_INFO);


spip_log("Categorie absente dans le paquet issu de <". $insert_paquet['src_archive'] ."> du depot <" . $insert_paquet['id_depot'] . ">\n", 'svp_paquets'); 
_ devient
_ spip_log("Categorie absente dans le paquet issu de <". $insert_paquet['src_archive'] .  "> du depot <" . $insert_paquet['id_depot'] . ">\n", 'svp_paquets.' . _LOG_INFO_IMPORTANTE); 

Il y a d’autres niveaux de log :
-  _LOG_ERREUR


http://zone.spip.org/trac/spip-zone/changeset/48226 apporte son lot d’éléments migrateurs :

Paginations  : Dans un fichier squelette du privé,
[<p class='pagination'>(#PAGINATION)</p>]
devient
[<p class='pagination'>(#PAGINATION{prive})</p>]

Nommages CSS  : La classe ’liste_items’ devient ’liste-items’ !!

Boutons du menu de la partie privée

Dans plugin.xml on supprime

<bouton id='corbeille' parent='configuration'> 
<titre>corbeille:corbeille</titre> 
<icone>img_pack/trash-full-24.png</icone> 
</bouton> 


et on ne laisse que

<bouton id='corbeille' parent='bando_administration'> 
<titre>corbeille:corbeille</titre> 
<icone>images/trash-full-16.png</icone> 
<url>corbeille</url> 
</bouton>

Ou bien (51393) :

<pipeline> 
<nom>ajouter_boutons</nom> 
	<action>ajouterBoutons</action> 
	<inclure>spiptospip_fonctions.php</inclure>          
</pipeline>

devient :

<bouton id='spip2spip1' parent='naviguer'> 
	<titre>spiptospip:titre</titre> 
	<icone>img_pack/icon.png</icone> 
	<url>spip2spip</url> 
</bouton> 
<bouton id='spip2spip2' parent='bando_activite'> 
	<titre>spiptospip:titre</titre> 
	<icone>img_pack/icon.png</icone> 
	<url>spip2spip</url> 
</bouton>

et la fonction function spip2spip_ajouterBoutons($boutons_admin) est supprimée.

Motclés

En spip3, les motclés sont gérés par une seule table pour tous les objets auxquels ils s’appliquent. Il faut donc transférer les contenus de toutes les tables de spécialisées vers la table générique.

exemple avec http://zone.spip.org/trac/spip-zone/changeset/48879

Lorsqu’un plugin crée un type d’objet qui bénéficie des motclés, ce transfert se traduit :
-  dans les déclarations des tables (une table de jointure spécialisée en moins, 2 déclarations de jointures en moins, une déclaration de table auxiliaire en moins)
Par exemple pour spip-lettre, on supprime :

	$spip_mots_lettres = array( 
	     "id_mot"                => "BIGINT (21) DEFAULT '' NOT NULL", 
	     "id_lettre"             => "BIGINT (21) DEFAULT '' NOT NULL" 
	); 
	$spip_mots_lettres_key = array( 
	     "PRIMARY KEY"   => "id_lettre, id_mot", 
	     "KEY id_mot"    => "id_mot" 
	); 

ainsi que

                $interface['tables_jointures']['spip_lettres'][] = 'mots_lettres'; 
                $interface['tables_jointures']['spip_lettres'][] = 'mots'; 

et

                $tables_auxiliaires['spip_mots_lettres'] =  
                        array('field' => &$spip_mots_lettres, 'key' => &$spip_mots_lettres_key); 

-  dans la procédure d’upgrade : supprimer les anciennes tables de la nouvelle manière déclarative :

           include_spip('maj/svn10000'); 
           $maj['5.2'] = array( 
                  array('maj_liens','mot','lettre'), 
                  array('sql_drop_table',"spip_mots_lettres"), ...
            );

Auteurs

Il en est de même pour les auteurs que pour les motclés

exemple avec http://zone.spip.org/trac/spip-zone/changeset/48879

Procédure d’upgrade des plugins

Visiblement, un format déclaratif a été créé. Il permet de s’affranchir de faire les tests de versions DANS la fonction d’upgrade : on déclare seulement ce qui doit être fait dans les différents cas.

exemple avec http://zone.spip.org/trac/spip-zone/changeset/48879

On remplit $maj avec diverses fonctions d’upgrade standard ou faites sur mesure :

	$maj['0.1'] = array(  
		array('spip_lettres_update_meta',$version_plugin,$nom_meta_base_versio,$current_version,$version_cible),         
		array('spip_lettres_creer_repertoire_documents'), 
	); 
...
	$maj['3.8'] = array( 
		array('maj_tables',array('spip_lettres')), 
		array('sql_alter',"TABLE spip_lettres DROP idx"),        
		array('sql_drop_table',"spip_documents_lettres",true),
		array('spip_lettres_update_meta',$version_plugin,$nom_meta_base_versio,$current_version,$version_cible),                         
	); 

Ici la fonction ’spip_lettres_creer_repertoire_documents est définie sur mesure peu après :

function spip_lettres_creer_repertoire_documents() { 
	include_spip('inc/getdocument'); 
	creer_repertoire_documents('lettres'); 
} 

et à la fin on appelle

maj_plugin($nom_meta_base_version, $version_cible, $maj); 

Filtre icone pour la partie privée

Le code SPIP3 de inc/filtres.php, indique que ’icone_base’ remplace ’icone’ même si icone est maintenu pour compatibilité. Attention : les arguments sont différents.

Ainsi, le commit http://zone.spip.org/trac/spip-zone/changeset/53822 remplace
[(#URL_ECRIRE{gis_editer}|parametre_url{nouveau,oui}|icone{<:gis:editer_gis_nouveau:>,#CHEMIN{images/gis-24.png},#LANG_RIGHT,creer.gif})]
par
[(#URL_ECRIRE{gis_editer}|parametre_url{nouveau,oui}|icone_verticale{<:gis:editer_gis_nouveau:>,#CHEMIN{images/gis-24.png},new,#LANG_RIGHT})]

Un exemple de migration

http://zone.spip.org/trac/spip-zone/changeset/53842 suivi de http://zone.spip.org/trac/spip-zone/changeset/53844 :
-  on passe du pipeline declarer_tables_principales au pipeline declarer_tables_objets_sql pour declarer la table GIS
-  on rajoute les elements qui vont bien dans declarer_tables_objets_sql
-  on vire la fonction generer_url_ecrire_gis qui est générée toute seule par SPIP

http://zone.spip.org/trac/spip-zone/changeset/53850 :
-  Les trois pipelines supprimés vont dans le pipeline declarer_tables_objets_sql (recherche, et les deux surnoms)