Skip to main content

champs personnalisés et clé unique

More
4 years 5 months ago #341055 by must_de_cartier
Bonjour

J'ai mis en place un champ personnalisé de numéro d'adhérent.
Celui-ci est unique.
J'ai modifié la table hikashop_user pour mettre sur la colonne un index unique.
Cependant lors de l'inscription l'utilisateur joomla est tout de même créé. Que faire ?
Je souhaiterai que l'inscription ne puisse se faire et idéalement afficher un message pour expliquer cela.

Merci pour votre aide.

Please Log in or Create an account to join the conversation.

More
4 years 5 months ago #341058 by nicolas
Bonjour,

C'est normal. Le processus est ainsi:
1 vérification des données (champs requis, regex, etc)
2 ajout de l'utilisateur dans joomla
3 ajout de l'utilisateur dans hikashop_user
4 ajout de l'adresse dans hikashop_address
5 envoi d'email si nécessaire
L'index unique va bloquer au niveau de l'étape 3, et donc l'étape 2 sera déjà passée.

Pour ce que vous voulez faire il y a deux possibilités:
1. Vous créez un plugin du groupe "hikashop" et implémentez l'API "fields" pour créer un nouveau type de champ personnalisé:
www.hikashop.com/support/documentation/6...entation.html#fields
Vous faites étendre votre champ du type texte et surchargez juste la fonction check pour faire la vérification de l'unicité à cet endroit.
Ensuite, il suffit de changer le type de votre champ pour le type de votre plugin et du coup votre plugin pourra stopper l'enregistrement directement à l'étape 1.
Un exemple d'un plugin de ce genre est dans le dossier plugins/hikashop/datepickerfield qui rajoute le type 'advanced date picker' dans HikaShop.

2. Vous pouvez également développer un plugin du groupe "hikashop" et juste implémenter l'évènement onBeforeHikaUserRegistration(&$data, $input_data, $mode)
Cet évènement est déclencher entre l'étape 1 et l'étape 2.
Dans
Code:
$data['userData']['xxx']
(où xxx est le nom de colonne de votre champ) vous aurez la valeur entrée par l'utilisateur dans votre champ.
Et si cela ne va pas, vous pouvez alors changez
Code:
$data['status']
à false pour annuler l'enregistrement et mettre votre message d'erreur dans l'array
Code:
$data['messages']
Le plugin recaptcha disponible sur notre site utilise justement cet évènement pour vérifier le captcha avant l'enregistrement donc c'est un bon exemple.

Je pense que la solution numéro 2 est la plus facile à mettre en place, mais cela demande quand même de savoir coder en PHP.

Please Log in or Create an account to join the conversation.

More
4 years 4 months ago #341474 by must_de_cartier
Bonjour Nicolas

Je pense que c'est une bêtise qui saute aux yeux mais je n'arrive pas à mettre en place la 2nde méthode que vous avez indiqué.

Voici le code que j'utilise :
Code:
<?php /** * @package HikaShop for Joomla! * @version 4.4.0 * @author hikashop.com * @copyright (C) 2010-2020 HIKARI SOFTWARE. All rights reserved. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html */ defined('_JEXEC') or die('Restricted access'); ?><?php class plgHikashop_matricule extends JPlugin { function onBeforeHikaUserRegistration(&$data, $input_data, $mode) { $app = JFactory::getApplication(); if(version_compare(JVERSION,'4.0','>=')) { if($app->isClient('administrator')) return true; } else { if($app->isAdmin()) return true; } $data['status'] = $this->checkMatricule(false); if(!$data['status']) $data['messages']['matricule'] = "Ce matricule existe déjà dans la base"; } function checkMatricule(&$data){ $user = JFactory::getUser(); if ($user->guest) { return true; } // Get a db connection. $db = JFactory::getDbo(); // Create a new query object. $query = $db->getQuery(true); // Select all records from the user profile table where key begins with "custom.". // Order it by the ordering field. $query->select(array('user_matricule')); $query->from('#__hikashop_user'); // Reset the query using our newly populated query object. $db->setQuery($query); // Load the results as a list of stdClass objects (see later for more options on retrieving data). $results = $db->loadColumn(); if($data['user']['user_matricule'] === $results) { return false; }else { return true; } } }

Please Log in or Create an account to join the conversation.

More
4 years 4 months ago #341476 by nicolas
Bonjour,

Au début de la fonction checkMatricule vous vérifiez si l'utilisateur est connecté ou pas pour ne faire que le check si l'utilisateur est connecté.
Or, lors du déclenchement de l'évènement onBeforeHikaUserRegistration l'utilisateur n'a pas encore été enregistré et donc pas encore connecté non plus.
Du coup, la fonction checkMatricule retourne toujours true à cet endroit.

Please Log in or Create an account to join the conversation.

More
4 years 4 months ago #341559 by must_de_cartier
Merci Nicolas.
Mais je ne comprends vraiment pas ce qui se passe, j'ai essayé de simplifier au maximum le code et ça ne fonctionne toujours pas. Auriez-vous encore l'amabilité de me dire pourquoi ??
Code:
<?php /** * @package HikaShop for Joomla! * @version 4.4.0 * @author hikashop.com * @copyright (C) 2010-2020 HIKARI SOFTWARE. All rights reserved. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html */ defined('_JEXEC') or die('Restricted access'); ?><?php class plgSystemMatricule extends JPlugin { function onBeforeHikaUserRegistration(&$data, $input_data, $mode) { $data['status'] = $this->checkMatricule(false); if(!$data['status']) $data['messages']['matricule'] = "stop"; } function checkMatricule(&$data){ if($data['user']['user_matricule'] === "E5099999") { return false; }else{ return true; } } }

Please Log in or Create an account to join the conversation.

More
4 years 4 months ago #341560 by nicolas
Bonjour,

Vous avez deux problèmes:
- vous confondez $data et $input_data
- vous ne passez pas $input_data à la fonction check_matricule
Le deux problèmes sont corrigeable en changeant juste false par $input_data.
Le code devrait donc être:
Code:
<?php /** * @package HikaShop for Joomla! * @version 4.4.0 * @author hikashop.com * @copyright (C) 2010-2020 HIKARI SOFTWARE. All rights reserved. * @license GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html */ defined('_JEXEC') or die('Restricted access'); ?><?php class plgSystemMatricule extends JPlugin { function onBeforeHikaUserRegistration(&$data, $input_data, $mode) { $data['status'] = $this->checkMatricule($input_data); if(!$data['status']) $data['messages']['matricule'] = "stop"; } function checkMatricule(&$data){ if($data['user']['user_matricule'] === "E5099999") { return false; }else{ return true; } } }

Please Log in or Create an account to join the conversation.

More
4 years 4 months ago #341568 by must_de_cartier
Merci de votre implication Nicolas. Malheureusement le code que vous avait fourni ne marche pas non plus. Je m'en arrache les cheveux.
Vous voyez d'autres erreurs sur ce tout petit bout de code ?

Please Log in or Create an account to join the conversation.

More
4 years 4 months ago #341569 by nicolas
Bonjour,

Faites un
Code:
var_dump($data); exit;
Ainsi, lorsque vous ferez votre test vous verrez ce qu'il y a dans $data et si il y a bien
Code:
$data['user']['user_matricule']
de disponible.

Please Log in or Create an account to join the conversation.

Time to create page: 0.181 seconds
Powered by Kunena Forum