Bonjour,
Suite à mon précédent sujet « Suite ecommerce SPIP : auteurs & visiteurs dans un bateau », je m’attaque à la problématique de la surcharge du #FORMULAIRE_INSCRIPTION afin de pouvoir collecter des informations d’entreprise liées à l’auteur et les enregistrer en base sur la table spip_auteurs.
Note : je sais qu’il existe un bon nombre d’excellents plugins (Profils, Contacts & Organisations…) qui pourraient couvrir ce besoin, mais je cherche avant tout à comprendre et expérimenter.
J’ai créé un petit plugin « marketplace » qui :
1) déclare de nouveaux champs sur spip_auteurs via le fichier base/marketplace.php :
function marketplace_declarer_tables_principales($tables_principales) {
# Déclarer les nouveaux champs sur les auteurs
$tables_principales['spip_auteurs']['field']['entreprise_nom'] = "VARCHAR(150)";
$tables_principales['spip_auteurs']['field']['entreprise_siren'] = "VARCHAR(14)";
$tables_principales['spip_auteurs']['field']['entreprise_adresse'] = "VARCHAR(200)";
$tables_principales['spip_auteurs']['field']['entreprise_code_postal'] = "VARCHAR(5)";
$tables_principales['spip_auteurs']['field']['entreprise_ville'] = "VARCHAR(150)";
$tables_principales['spip_auteurs']['field']['entreprise_tva'] = "VARCHAR(13)";
return $tables_principales;
}
2) les charge au démarrage du formulaire et ajoute les saisies idoines via marketplace_pipelines.php :
# Charge les champs entreprise au démarrage du formulaire d'inscription
function marketplace_formulaire_charger($flux) {
if ($flux['args']['form'] == 'inscription' and $flux['data'] !== false) {
$flux['data']['entreprise_nom'] = '';
$flux['data']['entreprise_siren'] = '';
$flux['data']['entreprise_adresse'] = '';
$flux['data']['entreprise_code_postal'] = '';
$flux['data']['entreprise_ville'] = '';
$flux['data']['entreprise_tva'] = '';
}
return $flux;
}
# Ajoute le HTML des champs entreprise durant l'inscription
function marketplace_formulaire_fond($flux) {
if ($flux['args']['form'] == 'inscription') {
$champs_entreprise = recuperer_fond('formulaires/inc/inscription_entreprise', $flux['args']['contexte']);
$chercher = '%<(li|div)[^>]*(saisie|editer)_mail_inscription[^>]*>.*?</\1>%is';
$flux['data'] = preg_replace(
$chercher,
"$0$champs_entreprise",
$flux['data']
);
}
return $flux;
}
Tout cela fonctionne correctement : mes nouveaux champs sont déclarés en base sur spip_auteurs et apparaissent bien là où je le souhaite dans le #FORMULAIRE_INSCRIPTION.
3) Maintenant je souhaite insérer en base ces données dans la table spip_auteurs :
Là où plus rien ne va c’est dans le traitement de ces données… J’essaye de m’insérer via le pipeline _formulaire_traiter (toujours via marketplace_pipelines.php) mais sans succès.
# Ajouter en base les champs supplémentaire entreprise à l'inscription d'un auteur
function marketplace_formulaire_traiter($flux){
if (
$flux['args']['form'] == 'inscription'
and $id_auteur = intval($flux['data']['id_auteur'])
and $auteur = sql_fetsel('*', 'spip_auteurs', 'id_auteur = '.$id_auteur)
){
$valeurs = array(
'entreprise_nom' => _request('entreprise_nom'),
'entreprise_ville' => "test",
'entreprise_siren' => $flux['data']['entreprise_siren'],
);
sql_updateq('spip_auteurs', $valeurs, 'id_auteur=' . intval($id_auteur));
}
return $flux;
}
J’essaye plein de choses : récupérer les valeurs soumises via _request() ou encore $flux[‹ data ›] mais aussi en ajoutant une valeur fixe « test ».
Mais sql_updateq ne donne rien, pas d’enregistrement en base. Et rien dans mes logs qui pourrait m’aider à avancer
J’utilise dans mon petit ecosystème les plugins inscriptionmotdepasse & inscriptionconnexion dont je me suis largement inspiré car ils utilisent les mêmes pipelines pour surcharger le fonctionnement de #FORMULAIRE_INSCRIPTION.
J’en viens à me demander si il y a un ordre d’exécution particulier des pipelines _formulaire_traiter qui pourrait parasiter mon traitement ou bien je m’y prend comme un manche
Dans la logique des choses, il me semble qu’il faudrait que inscriptionmotdepasse & inscriptionconnexion appliquent leurs traitements (création et autologin de l’auteur) puis que je puisse venir m’insérer : je récupère l’id_auteur et j’ajoute les champs.
La logique est-elle bonne ? Comment la mettre en oeuvre ? Voyez-vous d’où pourrait venir mon problème ?
Merci aux courageux qui ont pris le temps de lire tout cela !