Bonjour à tous et toutes,
ce message s’adresse principalement aux personnes qui créent/maintiennent des extensions de formidable. Il présente un changement à venir dans la manière dont formidable stocke les enregistrements en BDD, puis il pose quelques questions.
Le problème principal
Formidable est amené en stocker en BDD des données tabulaires, à savoir
- les saisies
- les traitements
- les réponses pour les champs multivalués (type checkbox) et les saisies fichiers
Pour l’heure, tout cela est serialisé via serialize()
. Nous souhaitons passer en json_encode()
via la PR https://git.spip.net/spip-contrib-extensions/formidable/pulls/111/.
En effet, la serialisation PHP en BDD posent plusieurs problèmes :
- très sensible en cas de corruption de la BDD (par exemple après une restauration);
- incompatible avec la manière dont SPIP gère les emoji.
Solution proposée
L’idée est donc de sortir une nouvelle version qui :
- au lieu de ‹ serialize ›, utilise
json_encode()
pour stocker les futures insertions (aka : lorsqu’on crée ou modifie un formulaire existant / une réponse), sans faire une conversion en série à la MAJ - ce qui veut dire qu’on aura en BASE les 2 types de stockages
- ceci pour ne pas avoir une fonction de migration qui pourrait prendre un temps certains…
On propose par ailleurs deux fonctions :
-
formidable_deserialize()
qui tente dans l’ordre :
- unjson_decode()
- ununserialize()
sinon
- à défaut, renvoie la chaine telle qu’elle -
formidable_serialize
pour serialiser (actuellement : elle appellejson_encode()
)
On garde par ailleurs filtrer_tenter_unserialize()
(deprécié) qui se contente d’appeler formidable_deserialize()
.
Enfin, on passe directement les valeurs deserializées des traitements et des saisies dans le $args
des fonctions de traitements.
Problèmes
Le problème : il y a des plugins qui deserializent les traitements/saisies pour divers usages.
J’ai fait un grep « serialize » sur les plugins de la zone qui contiennent formidable dans leur nom, et j’ai commencé à faire des ajustement dans des branche formidable_PR_111.
J’ai eu plusieurs cas
1. Des plugins que j’ai commencé à rendre compatible, mais qui sont aussi compatible spip 3.2
Pour ces plugins, trois possibilités :
- soit on décide de les rendre SPIP 4.0 compatible seulement
- soit on reporte dans formidable v4 (pour spip 3) la fonction
formidable_deserialize()
(je renoncer à reporter le reste, car il y a désormais pas mal de divergences). Mais attention, cela veut dire que danspaquet.xml
il faudra indiquer une version minimale de formidable qui divergerait selon que l’on est en SPIP 4 ou en SPIP 3… - soit on utilise pour ces plugins
filtre_tenter_unserialize_dist()
qui :
- existe en formidable v4
- existe également en formidable v5 (simple appel àformidable_deserialize()
) - Soit on teste la présence de
formidable_deserialize()
(proposition de @cerdic https://git.spip.net/spip-contrib-extensions/formidablepaiement/pulls/4#issuecomment-37240)
Ces plugins sont :
- formidable_mailsubscribers de @tcharlss @rastapopoulos
- formidablepaiement de @cerdic
- formidableparticipation de @touti
=> Personnellement, et @rastapopoulos me rejoint, je serai pour le 1
2. Les plugins concernés mais qui ne sont pas compatible SPIP 4, et donc pour lequel je ne change rien
- formidable_fusion de @touti
- formidable_identification de @kent1
- formidable_importer_reponses de @kent1
- formidableinscription de @touti
- formidable_quizz de @rastapopoulos
3. Les plugins que je gère et que je vais rendre compatible SPIP 4 uniquement (si ce n’est pas déjà le cas)
- formidable_participation_destinataires_supplementaires
- formidable_ts
- formidable_rio
Questions
J’aimerais donc, pour les personnes concernées (@tcharlss, @rastapopoulos qui m’a deja donné son avis, @cerdic, @touti):
- vos avis sur le cas 1
- vos agrément pour que je fasse les modifs / releases en fonction de la décision prise
- faut-il pour formidable faire un up de y seulement, ou bien un up de x ?
Mon idée étant de sortir les nouvelles version de formidable et des plugins concernées en bloc, idéalement le WE prochain.
Merci d’avance pour vos avis
Maïeul