Re: Meta dans une table spécifique
Eric Lupinacci <[email protected]>
| Newsgroups | gmane.comp.web.spip.devel |
|---|---|
| Message-ID | <[email protected]> |
Hello, > Le 15 mai 2020 à 15:10, Eric Lupinacci <[email protected]> a écrit : > > J’essaye de mettre en place une configuration de plugins dans une table différente que spip_meta et je me heurte à quelques incohérences dans les API SPIP. > ... > Donc il me semble qu’il y a plusieurs incohérences voire bugs : > - l’API Config et Meta ne fonctionnent pas de la même façon vis-à-vis d’un table différente de spip_meta > - l’upgrade fait appel à l’API meta et pas à l’API Config ce qui provoque en partie le problème. > - l’attribut meta ne semble pas être utilisé correctement lors de l’installation. > Premiers éléments de réponse : La fonction qui permet d’installer ou de dés installer un plugin est dans la plupart des cas spip_plugin_install(). Cette fonction a le code suivant : function spip_plugin_install($action, $infos, $version_cible) { $prefix = $infos['prefix']; if (isset($infos['meta']) and (($table = $infos['meta']) !== 'meta')) { $nom_meta = "base_version"; } else { $nom_meta = $prefix . "_base_version"; $table = 'meta'; } switch ($action) { case 'test': return (isset($GLOBALS[$table]) and isset($GLOBALS[$table][$nom_meta]) and spip_version_compare($GLOBALS[$table][$nom_meta], $version_cible, '>=')); break; case 'install': if (function_exists($upgrade = $prefix . "_upgrade")) { $upgrade($nom_meta, $version_cible, $table); } break; case 'uninstall': if (function_exists($vider_tables = $prefix . "_vider_tables")) { $vider_tables($nom_meta, $table); } break; } } C’est donc elle qui appelle les fonctions contenues dans <prefixe>_administrations.php. On voit aussi qu’elle examine la paquet du plugin pour savoir si l’attribut « meta » a été rempli avec une table autre que meta. Et donc la chose importante est que le prototype de la fonction upgrade ou vider_tables possède toujours un argument $table à la fin qui indique la table des metas pour le plugin. Et cet argument est systématiquement absent de tous nos plugins et cela est renforcé par le fait que la Fabrique et Programmer n’en font pas référence. Donc une bonne pratique serait maintenant de rajouter cet argument dans ces fonctions. Cet argument $table devant être passé à la fonction maj_plugin() ou à effacer_meta par exemple. Après ces modifications, il ne reste plus qu’un seul problème : la table spécifique des meta n’existe pas la première fois et comme l’API meta ne la crée pas au contraire de l’API config on a une erreur SQL. Je pense que c’est sur ce point qu’il faut faire une correction. ++ Eric