[Résolu] Shipping methods modification

  • Posts: 28
  • Thank you received: 1
5 years 4 months ago #308549

-- HikaShop version -- : 4.1.0
-- Joomla version -- : 3.9.10
-- PHP version -- : 7.2

Hello.

I've created shipping methods for my site, and I want to display them as a drop-down list, rather than radio buttons.

So I changed the show_block_shipping view of my template, and it works: I have a drop-down list, and when I select a delivery method, the "You have chosen the delivery method:" message at the bottom of the page is updated.

But I have two problems:

  1. I'm unable to validate my form: the page is reloaded, no error message is displayed, but it's impossible to proceed to the payment (If I return to the display with the radio buttons, the access to the payment is ok).
  2. I would like to have multiple delivery mode selectors, depending on what items customers order. Technically, changing the view is quite simple, and I can easily view a drop-down list by article or group of articles. On the other hand, I ask myself the question of the treatment with the validation of the form: is it possible to save several delivery modes?

Thanks in advance for your help

David

Last edit: 5 years 4 months ago by plastic1st.

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
5 years 4 months ago #308551

Bonjour,

1. Difficile de vous aider sans reproduire le problème. Pourriez-vous fournir un lien vers le site avec les instructions nécessaires pour reproduire le soucis ?

2. Dans ce cas vous voulez créer un "entrepôt" par groupe de produit. Dans les produits et dans les méthodes de livraison, vous pourrez ainsi sélectionner l'entrepôt correspondant. Ainsi, avec la vue par défaut, vous verrez que vous aurez un groupe de radios par entrepôt en fonction des produits dans le panier. Et il vous suffira de gérer l'affichage en dropdown pour chaque groupe.

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

  • Posts: 28
  • Thank you received: 1
5 years 4 months ago #308639

Bonjour Nicolas.

Merci pour votre réponse.
J'ai fini par résoudre le problème N°1 tout seul.

Mon problème venait de l'attribut 'name' de mon select.
Je l'avais nommé initialement "checkout[shipping]", ce qui fait qu'on moment de la validation, je récupérais :

$data['shipping'] = <mon id>

alors que dans le fichier administrator/components/com_hikashop/helpers/checkout/shipping.php, on attend un tableau :
$shipping_ids = array();
foreach($data['shipping'] as $group => $shipping) {
	if(!isset($shipping['id']))
		continue;
	if(is_numeric($group))
		$group = (int)$group;
	if(is_numeric($shipping['id']))
		$shipping['id'] = (int)$shipping['id'];
	$shipping_ids[$group] = $shipping['id'];
}

J'ai renommé mon select comme suit, et cela fonctionne
echo JHTML::_('select.genericlist', $selector['values'], 'checkout[shipping]['. $shipping_group_key .'][id]', 'class="hikashop_field_dropdown" data-hk-checkout="' . $this->escape(json_encode($selector['input_data'])) . '" onchange="window.checkout.shippingSelected(this);"', 'value', 'text', $shipping_json[$shipping_group_key], 'hikashop_shipping_selector_'.$this->step.'_'.$this->module_position);


Reste le problème N°2 à résoudre...

Je ne suis pas sûr de pouvoir le résoudre avec la solution que vous proposez, car les points de retrait des marchandises sont évolutifs.
Chaque vendeur peut choisir des points de retrait à sa guise parmi une liste de points de retrait disponibles (il peut modifier sa liste quand il le souhaite).

Lorsque l'acheteur sélectionne une marchandise, je veux lui proposer la pré-selection du vendeur, et lui laisser la possibilité de choisir le point de retrait qui lui convient le mieux.
Si l'acheteur achète plusieurs marchandises (différents vendeurs possibles), au moment de l'affichage du panier, je récupère la liste des points de retrait de tous les vendeurs concernés, et je veux proposer à l'acheteur :
- soit une seule liste des points de retrait en commun (afin que l'acheteur récupère tous ses marchandises au même endroit),
- soit une liste de points de retrait pour chaque marchandise si aucun point de retrait en commun.


En parcourant le forum hikashop, j'ai lu qu'il valait mieux créer des modes de livraison que des entrepôts. J'ai donc créé des modes de livraison pour chacun de mes points de retrait, et je pensais ensuite désactiver les points de retrait non retenus par les vendeurs au moment d'afficher le panier.

Avec ce descriptif plus détaillé de mon besoin, partiriez-vous toujours sur des entrepôts ?
Je ne suis pas sûr d'avoir bien compris votre explication : est-ce que les entrepôts s'affichent dans la zone de livraison, à la place des modes de livraison ?

Merci d'avance pour votre aide.

David

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
5 years 4 months ago #308663

Bonjour,

En effet, dans votre cas, l'utilisation des entrepôts ne semble pas adéquat.
Vous pouvez en effet créer une méthode de livraison manuelle par point relai avec l'option "shipping price per product" activée dans les méthodes de livraison.
Ainsi, lorsque le vendeur crée/édite ses produits, il aura une zone "shipping prices" où il pourra bloquer certaines méthodes de livraison (points relai) pour le produit en question.
Durant le passage en caisse, le système triera ensuite les produits automatiquement et proposera plusieurs sélection de méthode de livraison si nécessaire.

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

  • Posts: 28
  • Thank you received: 1
5 years 4 months ago #308704

Merci pour votre réponse.
Je vais partir sur cette solution.

Je laisse ce sujet ouvert au cas où je rencontrerais des problèmes, et aurais besoin de précisions.
Je le fermerai au plus tard dans 1 ou 2 jours.

Encore merci !

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

  • Posts: 28
  • Thank you received: 1
5 years 4 months ago #308835

Bonjour Nicolas.

J'ai suivi vos conseils, et il doit y avoir un point que je n'ai pas compris, car cela ne fonctionne pas.

  • Dans mes modes de livraison, j'ai activé l'option "Utiliser le prix par produits" (voir screenshot)
  • Dans les produits, j'ai bloqué un point relais (voir screenshot)

Cela n'a aucune influence sur mon panier : on me propose toujours les 2 points relais (voir screenshot).

De plus, j'ai peut-être mal compris vos explications, mais j'avais compris que, si le client sélectionne 2 produits :
  • produit 1 : dispo dans point relais 1 et 2
  • produit 2 : dispo dans point relais 3 et 4
J'aurais 2 groupes de bouton radio pour la sélection du point relais :
  • relais 1/relais 2 pour le produit 1
  • relais 3/relais 4 pour le produit 2

Ai-je mal compris ? (ce n'est pas ce que j'obtiens).

Petite précision : pour le test, j'ai supprimé mes modifs dans show_block_shipping, pour partir de la configuration native d'Hikashop.

Attachments:
Last edit: 5 years 4 months ago by plastic1st.

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
5 years 4 months ago #308838

Bonjour,

Notez que les groupes de produits pour la sélection de la méthode de livraison sont formés soit par entrepôt soit par vendeur. Donc si vous avez vos méthodes de livraison qui ne sont limités ni par vendeur ni par entrpôts, alors tous vos produits seront dans le même groupe de sélection. Et donc si vous bloquez certaines méthodes de livraison pour certains produits, alors elles ne seront pas disponibles pour les autres non plus.
Donc dans votre exemple, en supposant que les 2 produits soient dans le panier, vous n'auriez aucune méthode de livraison de disponible. Il faudrait mettre les deux produits dans des entrepôts différents pour obtenir le résultat souhaité.
Après cela n'explique pas pourquoi vous voyez la livraison N°1 si elle est bloquée pour un produit du panier.
Peut-être que vos produits ont des variantes et la méthode de livraison n'est pas bloqué sur les variantes ou quelque chose du genre. Il faudrait plus d'information sur la situation pour pouvoir en dire d'avantage.
Mais en tout cas, je crains que ce que vous voulez faire soit impossible avec juste des entrepôts ou juste des méthodes de livraison.
Et les 2 ensemble ne vont pas être pratiques non plus si j'ai pas saisi la problématique.
Dans ce cas, le mieux serait de faire un champs personnalisé de la table "produit" pour la sélection des points relai et ensuite développer un plugin pour remplir les sélections de méthodes de livraison de manière dynamique durant la chargement du panier en mémoire en fonction des points relai des différents produits. En fait, il faudrait presque avoir un groupe de sélection par produit vu qu'il suffit d'un point relai de différences entre deux produits pour que la sélection du point relai doive être différente pour les deux produits.

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

  • Posts: 28
  • Thank you received: 1
5 years 4 months ago #308894

Donc dans votre exemple, en supposant que les 2 produits soient dans le panier, vous n'auriez aucune méthode de livraison de disponible. Il faudrait mettre les deux produits dans des entrepôts différents pour obtenir le résultat souhaité.


C'est bien ce que j'avais compris, donc. Et dans mon cas, malgré le blocage des méthodes de livraison, elles apparaissent quand même dans mon panier...

Dans ce cas, le mieux serait de faire un champs personnalisé de la table "produit" pour la sélection des points relai et ensuite développer un plugin pour remplir les sélections de méthodes de livraison de manière dynamique durant la chargement du panier en mémoire en fonction des points relai des différents produits. En fait, il faudrait presque avoir un groupe de sélection par produit vu qu'il suffit d'un point relai de différences entre deux produits pour que la sélection du point relai doive être différente pour les deux produits.


Cette solution me convient. C'est d'ailleurs sur cette piste que j'étais parti à l'origine : j'ai déjà modifié la vue checkout/show_block_shipping.php, de façon à afficher autant de sélecteurs de points-relais que nécessaire, en regroupant les produits. Je bloquais sur la sauvegarde des points de livraisons sélectionnés. Je pense que la solution que vous proposez (champ personnalisé dans la table produit) répondrait à mon besoin.

Est-ce que je peux ajouter directement un champ à la table produit , ou est-ce qu'il y a une méthode prévue pour l'ajout d'un champ personnalisé ?

Dernière question, au sujet du plugin : j'ai consulté la doc développeur , et je me demande quelle méthode utiliser (onShippingSave ? onAfterProcessShippings ? onAfterOrderConfirm ?). Si vous avez un conseil, je suis preneur.

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
5 years 4 months ago #308898

Bonjour,

Le mieux, c'est de créer un champs personnalisé "produit" via le menu Affichage>Champs personnalisés.
En faisant ainsi, vous avez le champs utilisable dans l'interface d'édition du produit sur le backend et sur le frontend d'HikaMarket (pour les vendeurs). Si vous faites en rajoutant un champs dans la base de données il va aussi falloir modifier les différentes vues, gérer la sauvegarde, etc. Je pense que c'est beaucoup d'ennui comparé à un champs personnalisé HikaShop.

Concernant le plugin, il y a plusieurs façons de voir les choses.
Ce que je ferais, c'est de garder une méthode de livraison par point relai, je développerais un plugin du groupe "hikashop" et j'implémenterais le trigger onShippingWarehouseFilter(&$shipping_groups, &$order, &$rates) pour générer les groupes en fonction des produits dans le panier.
Dans $order->products vous avez les produits du panier, dans $rates vous avez les méthodes de livraison disponibles et dans $shipping_groups vous pouvez rajouter à l'array un objet par groupe de cette manière:
$g = new stdClass();
$g->name = 'Nom du groupe';
$g->products = array($keyprod1 => $prod1, $keyprod2 => $prod2);
$g->shippings = array(); // vous pouvez laisser
Ensuite, vous voulez aussi implementer onShippingDisplay(&$order, &$rates, &$usable_rates, &$errors) pour mettre dans $usable_rates les méthodes de livraison disponibles pour les produits du groupe courant dan $order->products (la fonction sera appelée une fois par groupe).

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

  • Posts: 28
  • Thank you received: 1
5 years 4 months ago #309053

Bonjour Nicolas,

Désolé pour le temps de réponse.
Je manque de temps en ce moment...
Merci pour vos conseils. Je reprendrais tout ça plus tard.

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

Time to create page: 0.072 seconds
Powered by Kunena Forum