champs personnalisés et clé unique

  • Posts: 68
  • Thank you received: 0
  • Hikashop Business
1 year 11 months ago #341055

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.

  • Posts: 81363
  • Thank you received: 13037
  • MODERATOR
1 year 11 months ago #341058

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

$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
$data['status']
à false pour annuler l'enregistrement et mettre votre message d'erreur dans l'array
$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.

  • Posts: 68
  • Thank you received: 0
  • Hikashop Business
1 year 10 months ago #341474

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 :

<?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.

  • Posts: 81363
  • Thank you received: 13037
  • MODERATOR
1 year 10 months ago #341476

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.

  • Posts: 68
  • Thank you received: 0
  • Hikashop Business
1 year 10 months ago #341559

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 ??

<?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.

  • Posts: 81363
  • Thank you received: 13037
  • MODERATOR
1 year 10 months ago #341560

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:

<?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.

  • Posts: 68
  • Thank you received: 0
  • Hikashop Business
1 year 10 months ago #341568

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.

  • Posts: 81363
  • Thank you received: 13037
  • MODERATOR
1 year 10 months ago #341569

Bonjour,

Faites un

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
$data['user']['user_matricule']
de disponible.

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

Time to create page: 0.045 seconds
Powered by Kunena Forum