Hello,
ce message concerne le plugin commandes et une proposition de modification de la définition de la référence, pour s'assurer que ça ne casse rien chez personne.
Problème :
* la référence d'une commande est censée être unique
* on a pas de contrainte sur le champ 'reference' de la table spip_commandes pour le garantir
* la méthode de calcul repose est simplement un time(), donc 2 commandes passées dans la même seconde auront la même référence : bonjour le bazar
Avant que ça n'arrive à quelqu'un je propose les modifications qui suivent :
1/ situation actuelle
la référence commande est determinée avant insertion en base, dans la fonction commande_inserer() :
https://zone.spip.org/trac/spip-zone/browser/plugins/commandes/trunk/action/editer_commande.php#L73
on appelle la fonction
commandes_reference() surchargeable avec pour seul argument id_auteur
https://zone.spip.org/trac/spip-zone/browser/plugins/commandes/trunk/inc/commandes_reference.php
la fonction se contente d'un time() comme seule référence, d'où le problème
2/ la correction proposée :
la fonction commandes_reference() serait appelée après insertion en base, avant appel du pipeline post_insertion genre ici
https://zone.spip.org/trac/spip-zone/browser/plugins/commandes/trunk/action/editer_commande.php#L114
elle prendrait en second argument $id_commande, donc l'id unique de la commande en base
la fonction
commandes_reference($id_auteur,$id_commande)
génèrerait une référence de la forme
YYYYMMDDIIIIII
avec IIIIII l'id_commande sur 6 chiffres (000001 pour id_commande=1)
# Avantages :
* on assure l'unicité des références commande
* la référence contient explicitement la date, ce qui facilite la gestion
* on passe des références actuelles sur 10 chiffres à des références sur 14 chiffres mini, donc on reste incrémental : les nouvelles références se placeront bien postérieurement après les anciennes, y compris dans le cas d'un tri alphabetique puisque commençant par 2 au lieu de 1 actuellement
# Inconvénient :
* si quelqu'un utilise le pipeline pre_insertion sur les commandes et s'attend à y retrouver une référence de commande, ça ne sera plus le cas, la référence n'apparaissant que dans le pipeline post_insertion.
Donc petit risque de bug.
Est-ce que ça concerne des utilisateurs ici ?
* on a toujours pas de contrainte unique sur le champ reference de la table, car une telle contrainte empêcherait l'insertion de 2 commandes avec reference=''
On peut le gérer dans commandes_inserer() en générant un uniqid temporaire en guise de reference pour l'insertion et en re-essayent 3 fois en cas de collision (ce qui serait vraiment un comble de malchance), mais là ça casserait potentiellement tout autre code qui fait des sql_insertq brutaux
Qu'en pensez-vous ?
Go en version simple ?
En version avec contrainte d'unicité sur le champ reference ?
Pasgo pasgo ?
--
Cédric