Salut,
Dernièrement je tentais de résoudre un bug dans GIS2 qui provoque une erreur SQL lors de la suppression du logo d'un point GIS. Il s'avère que le problème vient de la fonction objet_type() et surtout de sa gestion du pluriel sur les objets.
Sous SPIP 2.1, dans exec/iconifier l'appel à autoriser('iconifier', $type, $id) ne charge pas l'autorisation présente dans GIS2 car $type vaut "gi" et non "gis".
http://core.spip.org/projects/spip/repository/entry/branches/spip-2.1/ecrire/exec/iconifier.php#L28
Du coup on retombe sur l'autorisation par défaut
autoriser_iconifier_dist() qui cherche un champ id_rubrique dans la table spip_gis et cela génère l'erreur SQL que je souhaite régler.
Tout cela vient du fait que la fonction objet_type() de base/connect_sql renvoie "gi" si on lui passe "gis" comme argument. Voici quelques tests effectués sous SPIP 2.1 :
table_objet('gis') => gis
objet_type('gis') => gi
table_objet('gi') => gis
Pour info j'ai déposé un fichier de test unitaire dans gis/trunk/tests/ sur la zone.
Le problème reste le même malgré la déclaration de gis dans le pipeline declarer_tables_objets_surnoms :
function gis_declarer_tables_objets_surnoms($surnoms){
$surnoms['gis'] = 'gis';
return $surnoms;
}
En effet, dans objet_type() on supprime d'abord le "s" final de la variable $table_objet (qui du coup vaut "gi"). Ensuite on exécute un test sur table_objet($type)==$table_objet, table_objet() ne trouve alors pas de trace de "gi" dans les éléments renvoyés par le pipeline declarer_tables_objets_surnoms et renvoie preg_replace(',ss$,', 's', $type."s"); avec $type qui vaut "gi" et hop la boucle est bouclée (pour SPIP du moins).
Du coup, il semble déconseillé (ou impossible) d'utiliser pleinement des objets dont le nom au singulier se termine par un "s" (cas, canevas, gis...).
Une solution à ce problème serait d'inverser les deux blocs de test dans objet_type et de tenter en premier lieu de trouver le type en utilisant trouver_table() mais je me demande si c'est bon pour les perfs de SPIP ?
J'ai aussi testé ce cas de figure sous SPIP 3 avec le plugin TestBuilder et le problème est le même. J'ai retrouvé un message récent de Severo qui propose un patch pour SPIP 3 :
http://comments.gmane.org/gmane.comp.web.spip.devel/61157
En appliquant ce patch et en déclarant 'gis' => 'gis' dans le nouveau pipeline declarer_type_surnoms objet_type('gis') renvoie bien 'gis'. Le bug original semble donc contournable sous SPIP 3 à condition qu'on y intègre le patch de Severo.