Hika+Moodle+Joomdle --> synchro champs supplémentaires pour une catégorie

  • Posts: 246
  • Thank you received: 5
4 years 10 months ago #306953

-- HikaShop version -- : 3.5.1
-- Joomla version -- : 3.9.5
-- PHP version -- : 7.1.26

Bonjour,

Contexte:
Nous utilisons Hikashop business pour vendre, entre autre, des formations. HikaShop est couplé à Moodle via Joomdle. Tout fonctionne bien.
Joomdle offre la possibilité de synchroniser des champs entre Joomla et Moodle. Cela peut-être des champs joomla (table users, contacts) ou des champs HikaShop (table "address").

Objectifs:
"Forcer" les étudiants s'inscrivant pour la première fois à remplir un dossier d'inscription (parcours, diplôme, motivations..) et transmettre ces informations à Moodle.

Contraintes:
Ne pas rendre ces champs obligatoires/visibles pour les utilisateurs achetant d'autres produits que les cours de premières années (catégorie X).
Faire en sorte que ces champs à remplir soient proposés dans le cadre de l'achat lui-même et que leur saisie conditionne le fait de pouvoir acheter.

Nous avons mené divers essais. La transmission vers Moodle se passe bien.
Hikashop ne permet pas de restreindre l'affichage de champs supplémentaires "address" à une catégorie de produits (ce qui est "normal").

La solution "idéale" serait de restreindre l'affichage de ces champs à un groupe d'utilisateurs (les étudiants de première année). Hikashop permet d'affecter l'utilisateur d'un produit donné à un groupe Joomla. Mais cette affectation se fait après que l'achat soit terminé... trop tard pour demander les infos à ce groupe...

Il faudrait avoir le processus suivant (si nouvel utilisateur) :
infos de login Joomla --> inscription aux groupes joomla fonction des produits dans le panier --> remplissage des champs obligatoires réservés au groupe "Y" --> finalisation achat.

or je pense qu'actuellement on a :
infos de login Joomla --> remplissage des champs obligatoires réservés au groupe "Y" (?? comment ?) --> finalisation achat --> inscription aux groupes joomla fonction des produits dans le panier.

Il y a une option dans la configuration du check-out qui permet de choisir le groupe auquel la personne qui s'enregistre va être affectée mais cela s'applique à tout le monde, quoiqu'ils achètent.

Auriez-vous une suggestion pour arriver au résultat ?

Merci,

Laurent

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

  • Posts: 81484
  • Thank you received: 13062
  • MODERATOR
4 years 10 months ago #306973

Bonjour,

Sans développement je ne vois pas de solution.
Avec développement, je vois une solution:
- désactiver l'option "requis" de ces champs
- rajouter un peu de PHP à la vue affichant le formulaire d'adresse avec un override de vue pour cacher les champs lorsqu'ils ne sont pas utile (en regardant les produits dans le panier).
- développer un plugin HikaShop implémentant "onBeforeAddressCreate" et "onBeforeAddressUpdate" pour invalider la création/modification de l'adresse si les champs ne sont pas fourni en fonction du contenu du panier.

Last edit: 4 years 10 months ago by nicolas.

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

  • Posts: 246
  • Thank you received: 5
4 years 10 months ago #306991

Merci pour le retour pertinent.
Je vais déjà travailler sur l'override de vue et je verrai pour ajouter le contrôle via le plugin.

Laurent

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

  • Posts: 246
  • Thank you received: 5
4 years 9 months ago #308308

Bonjour,

La partie "affichage" fonctionne bien (modif de la vue).
Pour la partie "contrôle" (le plugin). Voici ce que j'ai "pondu" :

<?php
defined('_JEXEC') or die('Access Deny');
//
// on veut proposer des champs spécifiques qui doivent être remplis par l'utilisateur. Mais ces champs ne doivent être visibles que
// si l'acheteur a dans son panier un cours (il s'inscrit à la formation "lourde" de APCHEA, généralement en première année).
// en pratique s'il a dans son panier un produit appartenant à une catégorie dont la case "afficher le formulaire d'inscription" est cochée.
// Comme on affiche ou pas ces champs selon le contenu du panier, on ne peut pas utiliser la fonction native d'Hika "required".
// en effet les utilisateurs qui n'achètent pas ce type de produit seraient bloqués dans leurs achats à cause de cette contrainte portant
// sur des champs qui ne sont pas affichés !....
//
// donc ce plugin vérifie, après coup, que les contenus de ces champs sont "réalistes" si le panier contient un produit en rapport
//

define ('_MIN_CAR_REQUIRED_FIELDS', 15);

class plgHikashopAPCHEArequiredFieldsCheck extends JPlugin
{
	public function __construct(&$subject, $config) {
		parent::__construct($subject, $config);
	}

	function onBeforeAddressCreate(&$element, &$do) {
		//
		// on regarde si un produit au moins appartient a une catégorie ayant la case "formulaire" cochée
		$cartClass = hikashop_get('class.cart');
		$cartData = $cartClass->loadFullCart(true);
		$showInscriptions = false;
		foreach ($cartData->products as $produit) {
			foreach ($produit->categories as $categorie) {
				// echo "<br />panier ?<pre>";print_r($categorie);echo "</pre>";
				if ($categorie->formulaire_inscription == 1) {
					$showInscriptions = true;
					break 2;
				}
			}
		}
		if ($showInscriptions) {
			// on récupère les infos de l'utilisateur
			$userClass = hikashop_get('class.user');
			$userData = $userClass->get($element->address_user_id);	
			//echo "<pre>";print_r($userData);echo "<pre>";
			//exit;

			// on vérifie que les champs spécifiques à l'inscription ont été remplis
			$abort = false;
			if (strlen($userData->motivation)		< _MIN_CAR_REQUIRED_FIELDS) $abort = true;
			if (strlen($userData->objectifs_futurs)	< _MIN_CAR_REQUIRED_FIELDS) $abort = true;		
			if (strlen($userData->votrecvparcours)	< _MIN_CAR_REQUIRED_FIELDS) $abort = true;
			if (strlen($userData->travail_actuel)	< _MIN_CAR_REQUIRED_FIELDS) $abort = true;				

			if ($abort) {
				//hikashop_display('Les champs d\'inscription doivent obligatoirement être renseignés avant de poursuivre votre inscription !');	
				JFactory::getApplication()->enqueueMessage('Les champs d\'inscription doivent obligatoirement être renseignés avant de poursuivre votre inscription !');	
				$do = false;
			}
		}
	}

}

Le problème c'est que si $do=false cela renvoie (logiquement ?) vers un formulaire de saisie des champs adresses. Or mes champs additionnels obligatoires sont dans le type "user". Il faudrait que cela bloque le workflow en affichant à nouveau le formulaire du profil utilisateur.

J'ai essayé onBeforeUserCreate mais $element ne contient pas (logiquement !) le user_id. Il ne contient pas non plus les champs additionnels (juste le minimum joomla).

Il faudrait récupérer les champs au moment où l'acheteur clique sur "enregistrer" (son profil) ou "suivant" (checkout), les vérifier et le laisser sur cette page tant que la condition n'est pas remplie.

C'est probablement "onBeforeUserCreate" mais comment récupérer les champs saisis ? Ils ne sont pas dans le panier et je ne sais pas chargé la classe "user" à ce stade....

Merci,

Laurent

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

  • Posts: 81484
  • Thank you received: 13062
  • MODERATOR
4 years 9 months ago #308311

Bonjour,

Je ne suis pas sûr de tout comprendre, mais si vous seul soucis avec ce code, c'est que cela ne renvoir pas sur la bonne page, alors la solution est facile.
Vous pouvez faire un

JFactory::getApplication()->redirect($url);
à la place du
$do = false;
où $url contient l'URL vers où vous voulez rediriger.

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

  • Posts: 246
  • Thank you received: 5
4 years 9 months ago #308837

Bonjour,

C'est mieux mais pas "top"....
J'ai fait cela à la place du $do = false;

$url = 'index.php?option=com_hikashop&ctrl=checkout&Itemid=681&lang=fr';
$Factory::getApplication()->redirect($url);	

Si la personne ne remplit pas l'un des champs obligatoires, elle est redirigée vers la même page qui affiche le panier, les infos de login, les champs supplémentaires et l'adresse (one page checkout) comme la première fois où elle clique sur "terminer ma commande".
C'est très bien, sauf qu'en fait son user a déjà été créé lors de la tentative initiale or le formulaire affiche à nouveau les champs email (pré-rempli) et mot de passe (vide).

Résultat, elle ne remplit que ce qui manque (les champs obligatoires qu'elle avait oubliés) et son mot de passe (resettés). Mais en cliquant sur "suivant", le système lui répond qu'il existe déjà un utilisateur avec cet identifiant. Et pour cause, il a été créé lors de la validation précédente. Cela l'oblige à mettre un autre email/mot de passe....

Ci-joint notre config du checkout.

Attachments:

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

  • Posts: 81484
  • Thank you received: 13062
  • MODERATOR
4 years 9 months ago #308842

Bonjour,

Dans ce cas, ce que vous pourriez faire, c'est soit:
- supprimer l'utilisateur avant la redirection
- connecter l'utilisateur avant la redirection

La suppression est faisable avec un requête MySQL sur la table users de Joomla.
La connexion est faisable avec une fonction Joomla:
stackoverflow.com/questions/12959065/joomla-login-function
Et le username / password devrait vous être disponible dans $_POST

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

Time to create page: 0.068 seconds
Powered by Kunena Forum