Mise à jour de la quantité produit en fonction d'un champ perso

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355002

Bonjour,
Je suis en train de configurer un shop pour des réservations de camps pour enfants.

L'admin du site veut avoir les infos des enfants (nom, prénom, date de naissance et remarques) lors de l'achat.
Je peux facilement créer des champs persos sur le produit, avec par ex un sélecteur pour ne nb d'enfants. Si il choisit 3, alors les champs perso pour 3 enfants s'affichent (j'affiche les champs en fonction du choix du nombre d'enfants).

Mais pour que le client ne se mélange pas les pinceaux entre le nombre d'inscrit et le nombre de produits à acheter (donc le nombre de place de camps qui doit correspondre au nombre d'enfants qu'il inscrit), j'aimerais pouvoir mettre à jour le champ de quantité produit en fonction du nombre d'enfants inscrits. Est-ce possible ? Si oui, il faut que cela soit le cas pour cette catégorie (les camps), mais pas en général sur le shop, le client pouvant vendre des produits standards également.

Actuellement, sur son shop existant (woo...) il prend ces infos sur le passage de commande, mais ce n'est pas top à mon sens. Donc si je peux faire mieux.


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
1 year 2 months ago #355003

Bonjour,

Je pense que le plus simple ça serait de mettre l'option "quantity input" de ces produits à "none" pour ne par permettre à l'utilisateur de sélectionner la quantité du produit. Et ensuite, avec le plugin www.hikashop.com/marketplace/product/148...ce-calculations.html vous pouvez utiliser la formule {price}*{xxx} où xxx est le nom de colonne du champ personnalisé de la table "item" permettant de sélectionner le nombre d'inscrit sur la page produit. Ainsi, le prix calculé sera automatiquement le prix du produit multiplié par le nombre d'inscrit sélectionné dans le champ.

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355007

Bonjour,
Oui, cela me paraît bien. Je vais prendre ce plugin.
Mais je ne comprend pas ou mettre "none" pour la quantité par contre.


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355008

J'ai un autre petit soucis avec les champs.
En fait, comment faire avec la liste simple pour qu'en backend, si je prend 2 ou 3, les champs qui sont affectés à "enfant 1" s'affichent aussi ? Car je ne peux pas faire de sélection multiple dans le backend pour affecter mes champs...


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355010

A et 3ème point (désolé) j'espère que ça agit toujours sur le stock avec cette formule ?¨

EDIT : j'ai trouvé pour le champs quantité. Reste mes 2 autres points.


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde
Last edit: 1 year 2 months ago by thefbi.

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

  • Posts: 4747
  • Thank you received: 644
  • MODERATOR
1 year 2 months ago #355011

Bonjour,

Vous trouverez cette option dans chacun de vos formulaire backend de vos produits, plus précisément dans la partie "Display" :


En fait, comment faire avec la liste simple pour qu'en backend, si je prend 2 ou 3, les champs qui sont affectés à "enfant 1" s'affichent aussi ? Car je ne peux pas faire de sélection multiple dans le backend pour affecter mes champs...

Changez temporairement le type du champs en checkbox pour pouvoir éditer les autres champs et sélectionner plusieurs valeurs.

A et 3ème point (désolé) j'espère que ça agit toujours sur le stock avec cette formule ?¨

Cela agit sur le stock, mais avec une quantité de 1, peu importe ce qui est sélectionné dans le champ. Si vous avez besoin de gérer le stock en fonction du nombre de participant alors cette méthode ne fonctionnera pas pour vous.
Dans ce cas, il va falloir aussi faire en sorte que le champ quantité soit mis à jour en fonction de la valeur dans le champ personnalisé avec du javascript personnalisé.
Ce n'est pas compliqué. Dans show_block_custom_item vous pouvez rajouter ce genre de code:
<script>
var dropdown = document.getElementById('xxx');
if(dropdown) {
 dropdown.addEventListerner('change', function() {
  document.getElementById('yyy').value = dropdown.value;
 });
}</script>
where xxx is the id of the number of participant dropdown and yyy the id of the quantity input field. You can find these by inspecting the HTML with your browser:
hashthemes.com/find-element-id-from-insp...-different-browsers/

Cordialement

Last edit: 1 year 2 months ago by nicolas.

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355020

OK, pour les cases à cocher, ça ne fonctionne pas.
Si je change temporairement et que je coche 1-2-3, il faut alors que les 3 cases soient cochées pour afficher mon champs.
Donc en passant à nouveau sur liste simple, en cochant la case 1, le champ de n'affiche pas...

Concernant le script à mettre, j'imagine que vous parlez de le mettre dans la vue dans la config ?


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
1 year 2 months ago #355023

Bonjour,

1. En effet, c'est une logique AND et pas une logique OR.
Mmm. Du coup, je ne suis pas sûr de ce qu'il faut faire pour faire tout cela.
Dans ce genre de cas, il aurait été possible de faire des dropdown oui / non avec le label "ajouter un second/troisième/quatrième enfant", mais dans ce cas là, il n'y a pas de système pour calculer le nombre total.
Il faudrait alors faire du javascript plus compliqué, pour regarder les différents dropdown "ajouter un second/troisième/quatrième enfant" pour savoir combien cela fait en tout avant de mettre à jour le champ quantité. Et ensuite, vous pourriez utiliser la formule {price}*{cart_product_quantity}. Le problème que je vois avec cela, c'est que l'utilisateur pourrait augmenter la quantité dans le panier sans avoir à remplir les champs pour les enfants en plus.

Une autre solution, ca serait de ne pas avoir les champs dans le produit, mais durant le passage en caisse avec des champs de type "commande". Dans ce cas, vous pouvez utiliser la restriction de catégorie ou produit pour limiter les champs en fonction des produits dans le panier. Et vous pouvez également utiliser les limites de poids avec des méthodes de livraison "manual", et utiliser la restriction par méthode de livraison dans les champs personnalisés pour afficher les champs en fonction de la méthode de livraison affichée, qui dépendra du poids des produits dans le panier, qui lui-même dépendra de la quantité du produit dans le panier.
C'est un peu tirer par les cheveux comme configuration, mais cela permet d'avoir une solution avec zéro code custom, qui gère le stock, et les champs en fonction de la quantité acheté. Donc ça me semble être une option intéressante à creuser. Par contre, cela veut dire que les champs ne sont pas sur la page produit, mais sur le passage en caisse.

2. Oui, dans la vue show_block_custom_item via le menu Display>Views.

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355030

OK. Bon... ça se complique donc.

L'autre solution que je vois, si je veux vraiment utiliser les champs sur le produit, c'est de créer des champs par groupe de choix :
Si nb enfant = 1 => champs nom/prénom 1 / Date de naissance 1 / Allergies 1 (donc 1x les champs)
Si nb enfant = 2 => champs nom/prénom 2+3 / Date de naissance 2+3 / Allergies 2+3 (donc je refais 2x les champs)
Si nb enfant = 3 => champs nom/prénom 4+5+6 / Date de naissance 4+5+6 / Allergies 4+5+6 (donc je refais 3x les champs).
Je dois donc créer 18 champs.

Cela me fait faire plus de champs, mais ça devrait pouvoir fonctionner ? Couplé avec le code pour le calcul pour le stock, cela ferais une solution qui n'est pas plus tirée par les cheveux que la dernière...

Ou alors je réuni les infos dans un seul champ au lieu de 3, ce qui me fais faire moins de champs.


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
1 year 2 months ago #355039

Cela me fait faire plus de champs, mais ça devrait pouvoir fonctionner ? Couplé avec le code pour le calcul pour le stock, cela ferais une solution qui n'est pas plus tirée par les cheveux que la dernière...

En effet.

Sinon, une autre solution encore, c'est de ne pas permettre à l'utilisateur de sélectionner le nombre d'enfant sur la page produit et de ne pas afficher le champ quantité, avec un seul set de champs. Ainsi, pour chaque enfant, il faut qu'il clic sur le bouton "ajouter au panier" pour valider. C'est beaucoup plus facile à gérer pour vous, mais c'est moins sympa pour l'utilisateur.

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355040

Bonjour,
J'ai ajouté tous mes champs. J'ai mis le code javascript comme indiqué, mais cela ne fonctionne pas. J'imagine que je devrais voir le champ quantité se mettre à jours tout seul lorsque je change le nb d'inscrit ?

J'ai utilise Chat GPT pour m'aider dans l'integration du code dans la page, il m'a dit qu'il y avait une erreur avec addEventListerner au lieu de addEventListener (est-ce bien le cas ?).

Voici mon code (en bas de page) :

<?php
/**
 * @package	HikaShop for Joomla!
 * @version	4.7.5
 * @author	hikashop.com
 * @copyright	(C) 2010-2023 HIKARI SOFTWARE. All rights reserved.
 * @license	GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
 */
defined('_JEXEC') or die('Restricted access');
?><div id="hikashop_product_custom_item_info" class="hikashop_product_custom_item_info">
	<table class="hikashop_product_custom_item_info_table">
<?php
$after = array();
foreach ($this->itemFields as $fieldName => $oneExtraField) {
	if(empty($this->element->$fieldName))
		$this->element->$fieldName = $oneExtraField->field_default;
	$itemData = hikaInput::get()->getString('item_data_' . $fieldName, $this->element->$fieldName);
	$onWhat='onchange';
	if($oneExtraField->field_type=='radio')
		$onWhat='onclick';
	$oneExtraField->product_id = $this->element->product_id;
	$html = $this->fieldsClass->display(
		$oneExtraField,
		$itemData,
		'data[item]['.$oneExtraField->field_namekey.']',
		false,
		' class="'.HK_FORM_CONTROL_CLASS.'" '.$onWhat.'="window.hikashop.toggleField(this.value,\''.$fieldName.'\',\'item\',0);"',
		false,
		$this->itemFields
	);
	if($oneExtraField->field_type == 'hidden') {
		$after[] = $html;
		continue;
	}
?>
		<tr id="hikashop_item_<?php echo $oneExtraField->field_namekey; ?>" class="hikashop_item_<?php echo $oneExtraField->field_namekey;?>_line">
			<td class="key">
				<span id="hikashop_product_custom_item_name_<?php echo $oneExtraField->field_id;?>" class="hikashop_product_custom_item_name"><?php
					echo $this->fieldsClass->getFieldName($oneExtraField);
				?></span>
			</td>
			<td>
				<span id="hikashop_product_custom_item_value_<?php echo $oneExtraField->field_id;?>" class="hikashop_product_custom_item_value"><?php
					echo $html;
				?></span>
			</td>
		</tr>
<?php
}
?>
	</table>
<?php
if(count($after)) {
	echo implode("\r\n", $after);
}
?>
</div>
<!-- JavaScript code starts here -->
<script>
var dropdown = document.getElementById('18');
if(dropdown) {
 dropdown.addEventListener('change', function() {
  document.getElementById('hikashop_product_quantity_field_1').value = dropdown.value;
 });
}
</script>
<!-- JavaScript code ends here -->

Pour le id du quantity field, j'ai regardé avec l'outil Chrome, comme ci-dessous.


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde
Attachments:

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355043

Re,
Nos réponses se sont croisées...
Votre proposition est pas mal aussi. Mais j'aimerais pouvoir proposer les 2 au clients.

Donc, il faudrait tout de même que je puisse faire fonctionner le code pour le stock.

Et pour la solution 2, est-ce que l'on peut vider les champs une fois le "ajouter au panier" cliqué ?


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
1 year 2 months ago #355042

Bonjour,

En effet, il y avait une faute de frappe sur le nom de la fonction.
Pour l'id du champ quantité, c'est bon.
Par contre, pour l'id du dropdown de sélection du nombre d'enfant, ce n'est pas bon. Ce n'est pas l'id du champs personnalisé dans le backend qu'il faut mettre, mais l'id de l'élément HTML sur la page. Il faut le récupérer comme vous avez fait pour le champ quantité.

Et pour la solution 2, est-ce que l'on peut vider les champs une fois le "ajouter au panier" cliqué ?

Possible, mais cela demande un peu de développement javascript.
www.tutorialspoint.com/How-to-reset-or-c...he%20provided%20form .
www.w3schools.com/jsref/met_element_addeventlistener.asp

Last edit: 1 year 2 months ago by nicolas.

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355052

OK, ça marche avec le sélecteur maintenant.
Mais je vois que le champs de quantité doit être publié. Si je le cache, le stock utilisé est de 1.
Si le champs quantité est publié, il est modifié et donc ça fonctionne.

C'est bien ce qui est attendu ou j'ai raté un truc ?

EDIT : en fait j'avais pas compris, avec cette technique, je ne peux pas utiliser le plugin de calcul, c'est bien ça ?
EDIT 2 : Je vais utiliser la seconde idée, avec juste les 3 champs. Le client ajoutera les enfants par "ajout au panier". Vu avec mon client et effectivement sera plus simple.

[Moderator: S'il vous plaît, n'éditez pas vos messages longtemps après le post initial, cela risque de désorganiser notre service de ticket et d'entraîner des délais de réponse plus importants pour tout le monde, vous y compris.
Merci de votre compréhension.]


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde
Last edit: 1 year 2 months ago by Philip.

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355059

OK, c'est tout bon.
Merci pour les infos et les liens, j'ai réussi à faire fonctionner le fait de vider les champs au clic d'ajout au panier.
Je partage ici le code ajouté juste avant la fermeture de la div de la vue show_block_custom_item :

<script>
document.addEventListener('DOMContentLoaded', function() {
  var button = document.getElementById('hikashop_product_quantity_field_1_add_to_cart_button');
  if (button) {
    button.addEventListener('click', function() {
      
      var nomPrenomField = document.getElementById('nom_prenom');
      var dateNaissanceField = document.getElementById('date_naissance_input');
      var infosField = document.getElementById('infos');
      
      if (nomPrenomField) {
        nomPrenomField.value = '';
      }
      
      if (dateNaissanceField) {
        dateNaissanceField.value = '';
      }

      if (infosField) {
        infosField.value = '';
      }
      
    });
  }
});
</script>


[Moderator: S'il vous plaît, n'éditez pas vos messages longtemps après le post initial, cela risque de désorganiser notre service de ticket et d'entraîner des délais de réponse plus importants pour tout le monde, vous y compris.
Merci de votre compréhension.]


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde
Last edit: 1 year 2 months ago by Philip.

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
1 year 2 months ago #355056

Bonjour,

C'est bien ce qui est attendu ou j'ai raté un truc ?

Normalement avec "none" pour le quantity input, vous avez quand même un champ caché avec le même id pour la quantité et il devrait quand même être pris en compte pour la quantité ajoutée au panier. Donc normalement, cela devrait fonctionner de la même façon qu'avec le champ quantité visible.

Sinon, vous pouvez toujours le laisser visible, mais rajouter du code CSS pour cacher le champ quantité. Cela revient au même au final.

en fait j'avais pas compris, avec cette technique, je ne peux pas utiliser le plugin de calcul, c'est bien ça ?

Si, si vous utilisez un champ pour sélectionner le nombre d'enfant, et qu'ensuite vous multipliez les champs comme vous expliquiez ici www.hikashop.com/forum/5-support-en-fran...mp-perso.html#355030 alors cela devrait fonctionner avec le plugin de calcul qui se basera sur la valeur dans le champ.
Ou alors vous avez un autre problème avec le plugin de calcul auquel je n'ai pas pensé ?

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 2 months ago #355063

OK merci pour ces réponses.
Comme expliqué plus haut, je suis finalement parti pour votre dernière proposition, avec un seul groupe de champs. Cela sera bien plus simple à gérer.


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde
The following user(s) said Thank You: nicolas

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 1 month ago #355422

Bonjour,
Je reviens sur ce post, car je constate un problème avec le script pour vider les champs.
Il fonctionne correctement si je ne change rien aux sélections possibles, par contre, si je choisi une autre date ou un autre âge, lorsque je valide, les champs ne se vident pas. Est-ce que cela utilise une autre vue lors du choix d'un paramètres ?



Le script utilisé :
<script>
document.addEventListener('DOMContentLoaded', function() {
  var button = document.getElementById('hikashop_product_quantity_field_1_add_to_cart_button');
  if (button) {
    button.addEventListener('click', function() {
      
      var nomPrenomField = document.getElementById('nom_prenom');
      var dateNaissanceField = document.getElementById('date_naissance');
      var infosField = document.getElementById('infos');
      
      if (nomPrenomField) {
        nomPrenomField.value = '';
      }
      
      if (dateNaissanceField) {
        dateNaissanceField.value = '';
      }

      if (infosField) {
        infosField.value = '';
      }
      
    });
  }
});
</script>


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde
Attachments:

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

  • Posts: 82863
  • Thank you received: 13372
  • MODERATOR
1 year 1 month ago #355430

Bonjour,

Je ne sais pas. Pourriez vous fournir l'URL de la page en question ?

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

  • Posts: 361
  • Thank you received: 28
  • Hikashop Multisite
1 year 1 month ago #355442

OK, le site est verrouillé, mais je l'active le temps que vous y jetiez un oeil.
Si besoin de plus, je vous enverrais un accès.

kids-trip.test-dev.ch/product/camp-automne


“Si tu ne travaille pas pour tes rêves, quelqu'un t'embauchera pour travailler pour les siens" - Steeve Jobs
"La sagesse, c’est d’avoir des rêves suffisamment grands pour ne pas les perdre de vue quand on les poursuit." - Oscar Wilde

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

Time to create page: 0.102 seconds
Powered by Kunena Forum