THELIA Forum

Welcome to the THELIA support and discusssion forum

Announcement

Rejoignez la communauté sur le Discord Thelia : https://discord.gg/YgwpYEE3y3

Offline

#1 Lier des déclinaisons

(07-06-2017 14:50:26)


Je cherche à lier les déclinaisons de mes produits. C'est à dire que je n'affiche que les combinaisons possibles.

Un exemple pour etre plus clair.
J'ai un produit qui à les déclinaisons suivantes : Taille et Couleurs.
Dans le backoffice j'ai généré les combinaisons suivantes :
- Taille 38 avec Couleurs Bleu, Rouge et Vert
- Taille 40 avec Couleurs Bleu, Rose, Jaune

Ce que je voudrait faire c'est que quand
- je sélectionne la taille 38 je n'ai que les couleurs Bleu, Rouge et Vert qui s'affiche (par défaut tous s'affiche mais indique déclinaison inexistante quand pas possible)
- je sélectionne la taille 38 je n'ai que les couleurs Bleu, Rose et Jaune qui s'affiche

Comment je fait çà ?
Dans le fichier thelia.js (que j'avais gratter pour modifier mon affichage) ?

Merci pour vos pistes.

Last edited by timmy (07-06-2017 15:21:28)

Offline

#2 Re: Lier des déclinaisons

(07-06-2017 15:26:03)


Normalement, c'est le fonctionnement par défaut de l'affichage des déclinaisons dans le template de base : seules les combinaisons pertinentes sont proposées.


OpenStudio Toulouse

Offline

#3 Re: Lier des déclinaisons

(07-06-2017 15:32:05)


Perso sur une install de base de Thelia (justement je pensais avoir casser qqch) j'ai cà :
J'ai de liste déroulante qui me propose tout les entrées des déclinaisons possibles
Seulement quand je selectionne une combinaison j'ai l'infobulle.

Je voudrais que quand dans ma premiere liste je choisis un élément, la seconde soit automatiquement mise à jour pour afficher que les déclinaisons compatible avec la premiere

Offline

#4 Re: Lier des déclinaisons

(07-06-2017 17:42:28)


En principe c'est comme ça que ça se passe.


OpenStudio Toulouse

Offline

#5 Re: Lier des déclinaisons

(08-06-2017 09:15:05)


alors la je comprend pas j'ai la boucle par défaut de thelia :

    {if $pse_count > 1}
                        {* We have more than 1 combination: custom form *}
                        <fieldset id="pse-options" class="product-options">
                            {loop name="attributes" type="attribute" product="$product_id" order="manual"}
                            <div class="option option-option">
                                <label for="option-{$ID}" class="option-heading">{$TITLE}</label>
                                <div class="option-content clearfix">
                                    <select id="option-{$ID}" name="option-{$ID}" class="form-control input-sm pse-option" data-attribute="{$ID}"></select>
                                </div>
                            </div>
                            {/loop}
                            <div class="option option-fallback">
                                <label for="option-fallback" class="option-heading">{intl l="Options"}</label>
                                <div class="option-content clearfix">
                                    <select id="option-fallback" name="option-fallback" class="form-control input-sm pse-option pse-fallback" data-attribute="0"></select>
                                </div>
                            </div>
                        </fieldset>
                    {/if}

mais mes listes sont toujours complètes.
Liste déclinaison 1 : 1 - 2 - 3
Liste déclisnaion 2: a - b - c quelquesoit la seletion


Mon idée est de faire une sorte de relation maitre-esclave : avec la déclinaison 1 qui serait maitre et donc toujours visible et la déclinaison 2 serait esclave et n'afficherai que les elements compatibles avec le choix de la déclinaison 1.

Last edited by timmy (08-06-2017 09:17:44)

Offline

#6 Re: Lier des déclinaisons

(08-06-2017 11:34:36)


Mon idée est de faire une sorte de relation maitre-esclave

Tu vas dire que je me répète, hein, mais c'est à ça que sert le Javascript à partir de la ligne 25 de thelia.js. Tu as peut-être cassé quelque chose de ce côté là ?

Ça fonctionne avec le template par défaut ?


OpenStudio Toulouse

Offline

#7 Re: Lier des déclinaisons

(08-06-2017 13:24:39)


c'est bien ca le problème ca ne marche pas avec le template par défaut.

Je vais gratter un peu plus pour voir de ce coté la.

Last edited by timmy (08-06-2017 13:24:59)

Offline

#8 Re: Lier des déclinaisons

(06-04-2021 16:24:14)


Ce post n'est pas tout récent, mais il correspond bien au problème que je rencontre.
J'ai bien compris ta réponse, Roadster, mais sur mon template (qui n'est pas le template par défaut, mais je l'ai testé aussi), ça ne fonctionne pas... J'ai exactement le même problème que Timmy.
Hélas, je ne vois pas comment il a été résolu...
Pour info, je n'ai pas touché le thelia.js.
Si quelqu'un a déjà rencontré ce pb et lui a trouvé sa solution, je suis preneuse !
Al.


v. 1.5.4 - v 2.3.4 - v 2.4.3

Offline

#9 Re: Lier des déclinaisons

(06-04-2021 22:20:40)


ça ne fonctionne pas.

C'est à dire ? Que se passe-t-il exactement ?

Pour info, si tu as une erreur javascript dans la console, ça casse le bon fonctionnement de la gestion des déclinaisons en front, tout simplement parce que le code qui gère ces déclinaison n'est pas exécuté : l'inteprèteur JS s'arrète dès qu'il rencontre une erreur.

Donc vérifie que ta console est vierge de toute erreur JS.


OpenStudio Toulouse

Offline

#10 Re: Lier des déclinaisons

(07-04-2021 08:16:25)


Effectivement, j'avais des erreurs javascript ! Je les ai corrigées et rechargé ma page. Le problème n'a pas été résolu...
Pour mieux expliquer : j'ai un produit avec 2 déclinaisons (longueur et couleur).
Ce produit existe en bobine de 50m, couleur noire. Puis en bobine de 100m, en blanc et marine.
Par défaut, je suis sur 50m / noir.
Quand je sélectionne 100m, la déclinaison couleur indique toujours noir (qui n'existe pas dans cette longueur) et j'ai donc le message qui s'affiche "cette déclinaison n'existe pas".
Si j'ai bien compris, (ou en tout cas, c'est ce que j'aurais souhaité), le comportement normal est : lorsque tu sélectionnes 100m, seules les couleurs marine et blanc s'affichent. Et là, sur mon produit, ça n'arrive pas. Toutes les couleurs restent affichées ainsi que toutes les longueurs.
je suis en version 2.4.3


v. 1.5.4 - v 2.3.4 - v 2.4.3

Offline

#11 Re: Lier des déclinaisons

(07-04-2021 14:07:57)


outes les couleurs restent affichées ainsi que toutes les longueurs

C'est que le javascript qui gère ça n'est pas exécuté. Vérifie que tout est bien OK côté exécution JS, utilise le débugger de ton navigateur au besoin.


OpenStudio Toulouse

Offline

#12 Re: Lier des déclinaisons

(08-04-2021 18:24:29)


Tout est ok côté exécution JS, aucun message, aucune alerte.
Le débugger de mon navigateur (mes navigateurs, j'en ai testé plusieurs) ne me signale rien.
J'avoue que je sèche complétement !


v. 1.5.4 - v 2.3.4 - v 2.4.3

Offline

#13 Re: Lier des déclinaisons

(09-04-2021 07:54:51)


Salut!

Pour ma part, j'ai eu le même tour... j'ai vidé les caches Thelia et navigateur et hop c'était nickel


Aide les autres, ils t'aideront en retour.

Offline

#14 Re: Lier des déclinaisons

(09-04-2021 08:27:46)


J'ai vidé les caches (Thélia et navigateur) et le problème persiste.
J'ai pensé que j'avais peut-être un conflit au niveau des modules, j'ai donc désactivé les modules que j'avais installé, au cas où. Cela n'a rien changé.
C'est frustrant de ne pas comprendre pourquoi ce javascript n'est pas exécuté !
Je vais essayer l'appel à un ami aujourd'hui, en espérant qu'il y verra plus clair que moi...


v. 1.5.4 - v 2.3.4 - v 2.4.3

Offline

#15 Re: Lier des déclinaisons

(15-04-2021 15:28:02)


Elyos wrote:

Salut!

Pour ma part, j'ai eu le même tour... j'ai vidé les caches Thelia et navigateur et hop c'était nickel


Erratum!!! ça ne marche pas...!

Si l'ensemble des listes déroulantes ne correspondent pas à une déclinaison possible, il y a l'infobulle... ça ne met pas à jour les listes déroulantes en fonction des choix possibles... (mais ça bloque l'ajout panier)

D'ailleurs (voir un autre post) j'ai du compilé le thelia.js car le min.js n'était pas le même (change.pse manquant).

Donc il doit y a avoir un souci quelque part... update thelia qui a oublié de récupérer le bon fichier js ?

Sinon dans le code :

function updateProductForm() {
        var pseId = null,
            selection;

        if (PSE_COUNT > 1) {

            if ($pse.useFallback) {
                pseId = $pse.fallback.val();
            } else {
                // get form data
                selection = getFormSelection();
                // get the pse
                pseId = pseExist(selection);

                if ( ! pseId ) {
                    // not exists, revert
                    displayNotice();
                    setPseForm();
                } else {
                    $pse.validity.hide();
                }
            }

            // Trigger a change event to give the modules a change to detect PSE ID change.
            $pse.id.val(pseId).trigger('change.pse', pseId);
            $pse.pseId = pseId;
        }

        // Update UI
        updateProductUI();
    }

nulle part ça met à jour les "options"... ça bloque c'est tout

Last edited by Elyos (15-04-2021 15:30:36)


Aide les autres, ils t'aideront en retour.

Offline

#16 Re: Lier des déclinaisons

(15-04-2021 16:06:49)


D'ailleurs ligne 124 y'a une erreur :

$pse.fallbak.val(pse.id);

au lieu de

$pse.fallback.val(pse.id);

manque un c à fallback...


Aide les autres, ils t'aideront en retour.

Offline

#17 Re: Lier des déclinaisons

(16-04-2021 08:23:25)


alazais wrote:

Effectivement, j'avais des erreurs javascript ! Je les ai corrigées et rechargé ma page. Le problème n'a pas été résolu...
Pour mieux expliquer : j'ai un produit avec 2 déclinaisons (longueur et couleur).
Ce produit existe en bobine de 50m, couleur noire. Puis en bobine de 100m, en blanc et marine.
Par défaut, je suis sur 50m / noir.
Quand je sélectionne 100m, la déclinaison couleur indique toujours noir (qui n'existe pas dans cette longueur) et j'ai donc le message qui s'affiche "cette déclinaison n'existe pas".
Si j'ai bien compris, (ou en tout cas, c'est ce que j'aurais souhaité), le comportement normal est : lorsque tu sélectionnes 100m, seules les couleurs marine et blanc s'affichent. Et là, sur mon produit, ça n'arrive pas. Toutes les couleurs restent affichées ainsi que toutes les longueurs.
je suis en version 2.4.3

En fait, je voulais faire comme toi... sauf QUE en y réfléchissant si je suis ton raisonnement... (celui que j'ai eu aussi) :

Longueur :
- 50m
- 100m

Couleur :
- Noir
- Blanc
- Marine

Combinaison réelle possible :
- 50m/Noir
- 100m/Blanc
- 100m/Marine

Par défaut :
- Combinaison : 50m et noir
- Toutes les autres combinaisons sont possibles

Ce qui veut dire que même si tu n'as pas de 50m/Banc tu peux le sélectionner et obtenir le message "cette déclinaison n'existe pas".

Donc déjà par défaut, il faudrait selon ton raisonnement ne pas afficher Blanc et Marine.

Je sélectionne 100m et je devrais n'affiche que Blanc et Marine et masquer Noir.

Jusque là, ça peut être jouable (je te passe les configurations à 3,4,5,... options/liste)

Mais si, le client préfère d'abord choisir sa couleur...

Par défaut, on aurait que 50m (avec 100m possible) et la couleur Noir... de ce fait je me dis... tiens je veux du Blanc... ah bah ça n'existe pas en Blanc...
Mais comme je ne veux que 50m je ne cherche pas plus loin...

En gros c'est un vrai casse-tête si je veux un t-shirt Rouge avec un Logo type A en taille S je fais comment à part jouer avec toutes les possibilités...

Surtout qu'après ça dépend l'ordre d'affichage des options...

Je vais tenter de griser quand c'est pas possible plutôt que de masquer et d'afficher les combinaisons possibles en fonction de l'option dernièrement modifiée...


Aide les autres, ils t'aideront en retour.

Offline

#18 Re: Lier des déclinaisons

(16-04-2021 08:27:05)


D'ailleurs en testant le comportement par défaut, quand j'ai le message ça remet la valeur précédente... sauf que si je refais le même choix, j'ai à nouveau le message mais ça garde la valeur choisie...


Aide les autres, ils t'aideront en retour.

Offline

#19 Re: Lier des déclinaisons

(16-04-2021 10:24:44)


Grisé les déclinaisons non dispo est une excellente idée, c'est vrai.
Il ne reste plus qu'à trouver comment faire ça et tester.
Mais je continue à trouver étonnant que nous n'arrivions pas à avoir le comportement "par défaut", vu que je n'ai aucune erreur d'execution.
Il y a des choses qui s'éxécutent et d'autres pas, en fait. Par exemple, quand je clique sur l'image du produit, il ne se passe rien non plus. Je n'ai pas le comportement attendu à partir de la ligne 586. Je vais gérer autrement, mais voilà, ça m'interroge...


v. 1.5.4 - v 2.3.4 - v 2.4.3

Offline

#20 Re: Lier des déclinaisons

(20-04-2021 14:03:04)


C'est un vrai casse tête... parce que "griser" ça va peut être induire en erreur le client qui va se dire "c'est pas dispo"...

Là je travaille sur un exemple :
Couleurs : Noir / Multicolore
Option : Adulte / Enfant

Et je n'ai que deux combinaisons possibles :
Noir + Adulte
Multicolore / Enfant

Par défaut, j'ai Noir+Adulte mais si je grise Multicolore et Enfant, le client va peut être se dire que c'est pas dispo...

Et là en état, je peux rien changer j'ai toujours le message de la fonction displayNotice (après modification du code ligne 187) : ajout de la condition if(pseId) pour remettre à l'état précédent...

 // Trigger a change event to give the modules a change to detect PSE ID change.
if (pseId) {
  $pse.id.val(pseId).trigger('change.pse', pseId);
  $pse.pseId = pseId;
}

là j'essaye de faire en sorte que le changement d'une option (liste déroulante) modifie les valeurs des autres options (liste déroulante) si la sélection (combinaison) n'existe pas. Avec deux listes c'est jouable... mais pour plus... je me casse la tête là ^^'

Last edited by Elyos (20-04-2021 14:04:43)


Aide les autres, ils t'aideront en retour.

Offline

#21 Re: Lier des déclinaisons

(20-04-2021 15:08:14)


[EDIT] voir post https://forum.thelia.net/viewtopic.php?pid=78589#p78589 [/EDIT]


Du coup, j'ai fait en sorte que le changement d'une option met à jour les autres...
Si l'ensemble des options donnent un pse existant => on ne fait rien
Sinon, on vérifie les combinaisons pour savoir quelle option n'est pas bonne (ou plusieurs) et on leur attribue la première valeur existante en fonction de l'option qui a été modifiée (je sais pas si je suis clair ^^')


J'ai modifié comme ça :

//ligne 86 (modif)

$("#pse-options .pse-fallback").on("change", function() {
	updateProductForm($(this));
});

//ligne 98 (modif)

$option.on("change", function() {
  updateProductForm($(this));
});

//ligne 136 (modif)

function updateProductForm(obj) {

//ligne 149 (ajout)

if (!pseId) {
  pseId = updateOptions(obj);
}

//ligne 169 (ajout) [EDIT]voir post https://forum.thelia.net/viewtopic.php?pid=78589#p78589 [/EDIT]

function updateOptions(obj) {
	if (obj == undefined) {
	  obj = $pse['options'][Object.keys(PSE_COMBINATIONS)[0]];
	}
	var combinationIdSelected = obj.data("attribute");
	var combinationValueSelected = obj.val();
	var existingCombinations = [];
	var optionsChanged = [];
	for (pse in PSE) {
	  pseId = pse;
	  combinations = PSE[pse].combinations;
	  if (undefined !== combinations) {
		if (combinations[(combinationIdSelected - 1)] == combinationValueSelected) {
		  existingCombinations.push(combinations);
		}
	  }
	}
	for (pse_combination in PSE_COMBINATIONS) {
	  if (pse_combination != combinationIdSelected) {
		val = $pse['options'][pse_combination].val();
		find = false;
		for (var e = 0; e < existingCombinations.length; e++) {
		  if (existingCombinations[e][(pse_combination - 1)] == val) {
			find = true;
			break;
		  }
		}
		if (!find) {
		  $pse['options'][pse_combination].val(existingCombinations[0][(pse_combination - 1)]);
		  optionsChanged.push($pse['options'][pse_combination]);
		  for (var e = 1; e < existingCombinations.length; e++) {
			if (existingCombinations[e][(pse_combination - 1)] != existingCombinations[0][(pse_combination - 1)]) {
			  existingCombinations.splice(e, 1);
			}
		  }
		}
	  }
	}
	$.each(optionsChanged, function(index,option) {
	  option.addClass('changed');
	});
	setTimeout(function() {
	  $.each(optionsChanged, function(index,option) {
		option.removeClass('changed');
	  });
	}, 250);
	// get form data
	selection = getFormSelection();
	// get the pse
	return pseExist(selection);
}

ce qui donne pour thelia.js (uniquement pseManager) [EDIT]voir post https://forum.thelia.net/viewtopic.php?pid=78589#p78589 [/EDIT]

var pseManager = (function($){

    // cache dom elements
    var manager = {};
    var $pse = {};

    function init(){
        $pse = {
            "id": $("#pse-id"),
            "product": $("#product"),
            "name": $("#pse-name"),
            "ref": $("#pse-ref"),
            "ean": $("#pse-ean"),
            "availability": $("#pse-availability"),
            "validity": $("#pse-validity"),
            "quantity": $("#quantity"),
            "promo": $("#pse-promo"),
            "new": $("#pse-new"),
            "weight": $("#pse-weight"),
            "price": $("#pse-price"),
            "priceOld": $("#pse-price-old"),
            "submit": $("#pse-submit"),
            "options": {},
            "pseId": null,
            "useFallback": false,
            "fallback": $("#pse-options .pse-fallback")
        };
    }

    function buildProductForm() {
        var pse = null,
            combinationId = null,
            combinationValue = null,
            combinationValueId = null,
            combinations = null,
            combinationName = [],
            i;

        // initialization for the first default pse
        $pse.pseId = $pse.id.val();

        if (PSE_COUNT > 1) {
            // Use fallback method ?
            $pse.useFallback = useFallback();

            if ($pse.useFallback) {
                $("#pse-options .option-option").remove();

                for (pse in PSE){
                    combinations = PSE[pse].combinations;

                    combinationName = [];
                    if (undefined !== combinations) {
                        for (i = 0; i < combinations.length; i++){
                            combinationName.push(PSE_COMBINATIONS_VALUE[combinations[i]][0]);
                        }
                    }
                    $pse.fallback
                        .append("<option value='" + pse + "'>" + combinationName.join(', ') + "</option>");
                }

                $("#pse-options .pse-fallback").on("change", function() {
				  updateProductForm($(this));
				});

            } else {
                $("#pse-options .option-fallback").remove();

                // get the select for options
                $("#pse-options .pse-option").each(function(){
                    var $option = $(this);
                    if ( $option.data("attribute") in PSE_COMBINATIONS){
                        $pse['options'][$option.data("attribute")] = $option; // jshint ignore:line
                        $option.on("change", function() {
						  updateProductForm($(this));
						});
                    } else {
                        // not affected to this product -> remove
                        $option.closest(".option").remove();
                    }
                });

                // build select
                for (combinationValueId in PSE_COMBINATIONS_VALUE) {
                    combinationValue = PSE_COMBINATIONS_VALUE[combinationValueId];
                    $pse.options[combinationValue[1]]
                        .append("<option value='" + combinationValueId + "'>" + combinationValue[0] + "</option>");
                }

                setPseForm();
            }
        }
    }

    function setPseForm(id) {
        var pse = null,
            combinationValueId;
        pse = PSE[id || $pse.pseId];

        if (undefined !== pse) {
            if ($pse.useFallback) {
                $pse.fallbak.val(pse.id);
            } else {
                for (var i = 0; i < pse.combinations.length; i++) {
                    combinationValueId = pse.combinations[i];
                    $pse['options'][PSE_COMBINATIONS_VALUE[combinationValueId][1]].val(pse.combinations[i]) // jshint ignore:line
                }
            }
        }
    }

    function updateProductForm(obj) {
        var pseId = null,
            selection;

        if (PSE_COUNT > 1) {

            if ($pse.useFallback) {
                pseId = $pse.fallback.val();
            } else {
                // get form data
                selection = getFormSelection();
                // get the pse
                pseId = pseExist(selection);
				if (!pseId) {
				  pseId = updateOptions(obj);
				}
                if ( ! pseId ) {
					// not exists, revert
					displayNotice();
					setPseForm();
                } else {
                    $pse.validity.hide();
                }
            }

            // Trigger a change event to give the modules a change to detect PSE ID change.
            $pse.id.val(pseId).trigger('change.pse', pseId);
            $pse.pseId = pseId;
        }

        // Update UI
        updateProductUI();
    }
	function updateOptions(obj) {
		if (obj == undefined) {
		  obj = $pse['options'][Object.keys(PSE_COMBINATIONS)[0]];
		}
		var combinationIdSelected = obj.data("attribute");
		var combinationValueSelected = obj.val();
		var existingCombinations = [];
		var optionsChanged = [];
		for (pse in PSE) {
		  pseId = pse;
		  combinations = PSE[pse].combinations;
		  if (undefined !== combinations) {
			if (combinations[(combinationIdSelected - 1)] == combinationValueSelected) {
			  existingCombinations.push(combinations);
			}
		  }
		}
		for (pse_combination in PSE_COMBINATIONS) {
		  if (pse_combination != combinationIdSelected) {
			val = $pse['options'][pse_combination].val();
			find = false;
			for (var e = 0; e < existingCombinations.length; e++) {
			  if (existingCombinations[e][(pse_combination - 1)] == val) {
				find = true;
				break;
			  }
			}
			if (!find) {
			  $pse['options'][pse_combination].val(existingCombinations[0][(pse_combination - 1)]);
			  optionsChanged.push($pse['options'][pse_combination]);
			  for (var e = 1; e < existingCombinations.length; e++) {
				if (existingCombinations[e][(pse_combination - 1)] != existingCombinations[0][(pse_combination - 1)]) {
				  existingCombinations.splice(e, 1);
				}
			  }
			}
		  }
		}
		$.each(optionsChanged, function(index,option) {
		  option.addClass('changed');
		});
		setTimeout(function() {
		  $.each(optionsChanged, function(index,option) {
			option.removeClass('changed');
		  });
		}, 250);
		// get form data
		selection = getFormSelection();
		// get the pse
		return pseExist(selection);
	}

    function displayNotice() {
        var $validity = $pse.validity;
        $validity.stop().show('fast', function(){
            setTimeout(function(){
                $validity.stop().hide('fast');
            }, 3000);
        });
    }

    function updateProductUI() {
        var pse = PSE[$pse.pseId],
            name = [],
            pseValueId,
            i
            ;

        if (undefined !== pse) {

            $pse.ref.html(pse.ref);
            // $pse.ean.html(pse.ean);
            // name
            if (PSE_COUNT > 1) {

                for (i = 0; i < pse.combinations.length; i++) {
                    pseValueId = pse.combinations[i];
                    name.push(
                        //PSE_COMBINATIONS[PSE_COMBINATIONS_VALUE[pseValueId][1]].name +
                        //":" +
                        PSE_COMBINATIONS_VALUE[pseValueId][0]
                    );
                }

                $pse.name.html(" - " + name.join(", ") + "");
            }

            // promo
            if (pse.isPromo) {
                $pse.product.addClass("product--is-promo");
            } else {
                $pse.product.removeClass("product--is-promo");
            }

            // new
            if (pse.isNew) {
                $pse.product.addClass("product--is-new");
            } else {
                $pse.product.removeClass("product--is-new");
            }

            // availability
            if (pse.quantity > 0 || !PSE_CHECK_AVAILABILITY) {
                setProductAvailable(true);

                if (parseInt($pse.quantity.val()) > pse.quantity) {
                    $pse.quantity.val(pse.quantity);
                }
                if (PSE_CHECK_AVAILABILITY) {
                    $pse.quantity.attr("max", pse.quantity);
                } else {
                    $pse.quantity.attr("max", PSE_DEFAULT_AVAILABLE_STOCK);
                    $pse.quantity.val("1");
                }

            } else {
                setProductAvailable(false);
            }

            // price
            if (pse.isPromo) {
                $pse.priceOld.html(pse.price);
                $pse.price.html(pse.promo);
            } else {
                $pse.priceOld.html("");
                $pse.price.html(pse.price);
            }
        }
        else {
            setProductAvailable(false);
        }
    }

    function setProductAvailable(available) {

        if (available) {
            $pse.availability
                .removeClass("out-of-stock")
                .addClass("in-stock")
                .attr("href", "http://schema.org/InStock");

            $pse.submit.prop("disabled", false);
        }
        else {
            $pse.availability.removeClass("in-stock")
                .addClass("out-of-stock")
                .attr("href", "http://schema.org/OutOfStock");

            $pse.submit.prop("disabled", true);
        }
    }

    function pseExist(selection) {
        var pseId,
            pse = null,
            combinations,
            i,
            j,
            existCombination;

        for (pse in PSE){
            pseId = pse;
            combinations = PSE[pse].combinations;

            if (undefined !== combinations) {
                for (i = 0; i < selection.length; i++) {
                    existCombination = false;
                    for (j = 0; j < combinations.length; j++) {
                        if (selection[i] == combinations[j]) {
                            existCombination = true;
                            break;
                        }
                    }
                    if (existCombination === false) {
                        break;
                    }
                }
                if (existCombination) {
                    return pseId;
                }
            }
        }

        return false;
    }

    function useFallback() {
        var pse = null,
            count = -1,
            pseCount = 0,
            combinations,
            i;

        for (pse in PSE){
            combinations = PSE[pse].combinations;

            if (undefined !== combinations) {
                pseCount = 0;
                for (i = 0; i < combinations.length; i++) {
                    pseCount += PSE_COMBINATIONS_VALUE[combinations[i]][1];
                }
                if (count == -1) {
                    count = pseCount;
                } else if (count != pseCount) {
                    return true;
                }
            }
        }

        return (count <= 0);
    }

    function getFormSelection() {
        var selection = [],
            combinationId;

        for (combinationId in $pse.options){
            selection.push($pse.options[combinationId].val());
        }

        return selection;
    }

    manager.load = function(){
        init();
        buildProductForm();
        updateProductForm();
    };

    return manager;

}(jQuery));

Last edited by Elyos (22-04-2021 08:48:46)


Aide les autres, ils t'aideront en retour.

Offline

#22 Re: Lier des déclinaisons

(21-04-2021 17:53:15)


J'ai testé avec tes modifs de thelia.js et ça ne marche pas chez moi. Je n'ai plus le message "cette déclinaison n'existe pas" mais j'ai toujours toutes les valeurs de déclinaisons disponibles, sans tenir compte de la combinaison.
Par exemple : bobines de 25m -> toutes les couleurs sont dispos
bobines de 50m -> uniquement en noir et kaki.
Quand je sélectionne 50m, j'ai toutes les couleurs dispos.
Si je sélectionne 50m / blanc (alors que je ne devrais pas avoir cette possibilité puisqu'en 50m, il n'y a que du noir ou du kaki) : je peux cliquer sur le panier mais c'est la bobine de 25m qui est retenue. Donc, pour mon cas, ça ne convient pas.
Chez toi, ça fonctionne comme tu veux ?
On va bien finir par trouver ! ou peut-être qu'on va passer en 2.5 (dès que c'est sorti) et que tout sera réglé ;-)
Al.


v. 1.5.4 - v 2.3.4 - v 2.4.3

Offline

#23 Re: Lier des déclinaisons

(22-04-2021 08:12:18)


Je regarde parce que j'avais testé et ça fonctionnait... maintenant j'ai une erreur javascript... ^^'


Aide les autres, ils t'aideront en retour.

Offline

#24 Re: Lier des déclinaisons

(22-04-2021 08:47:24)


C'est bon!

Quand ça marchait c'est parce que je testais sur un cas particulier où les "id" était égaux aux indexs...

Code corrigé :

function updateOptions(obj) {
	if (obj == undefined) {
	  obj = $pse['options'][Object.keys(PSE_COMBINATIONS)[0]];
	}
	var combinationIdSelected = obj.attr("data-attribute");
	var combinationValueSelected = obj.val();
	var indexSelected = Object.keys(PSE_COMBINATIONS).indexOf(combinationIdSelected);
	var existingCombinations = [];
	var optionsChanged = [];
	for (pse in PSE) {
	  pseId = pse;
	  combinations = PSE[pse].combinations;
	  if (undefined !== combinations) {
		if (combinations[indexSelected] == combinationValueSelected) {
		  existingCombinations.push(combinations);
		}
	  }
	}
	for (pse_combination in PSE_COMBINATIONS) {
	  if (pse_combination != combinationIdSelected) {
		var val = $pse['options'][pse_combination].val();
		var index = Object.keys(PSE_COMBINATIONS).indexOf(pse_combination);
		find = false;
		for (var e = 0; e < existingCombinations.length; e++) {
		  if (existingCombinations[e][index] == val) {
			find = true;
			break;
		  }
		}
		if (!find) {
		  $pse['options'][pse_combination].val(existingCombinations[0][index]);
		  optionsChanged.push($pse['options'][pse_combination]);
		  for (var e = 1; e < existingCombinations.length; e++) {
			if (existingCombinations[e][index] != existingCombinations[0][index]) {
			  existingCombinations.splice(e, 1);
			}
		  }
		}
	  }
	}
	$.each(optionsChanged, function(index,option) {
	  option.addClass('changed');
	});
	setTimeout(function() {
	  $.each(optionsChanged, function(index,option) {
		option.removeClass('changed');
	  });
	}, 250);
	// get form data
	selection = getFormSelection();
	// get the pse
	return pseExist(selection);
}

pseManager complet :

var pseManager = (function($){

    // cache dom elements
    var manager = {};
    var $pse = {};

    function init(){
        $pse = {
            "id": $("#pse-id"),
            "product": $("#product"),
            "name": $("#pse-name"),
            "ref": $("#pse-ref"),
            "ean": $("#pse-ean"),
            "availability": $("#pse-availability"),
            "validity": $("#pse-validity"),
            "quantity": $("#quantity"),
            "promo": $("#pse-promo"),
            "new": $("#pse-new"),
            "weight": $("#pse-weight"),
            "price": $("#pse-price"),
            "priceOld": $("#pse-price-old"),
            "submit": $("#pse-submit"),
            "options": {},
            "pseId": null,
            "useFallback": false,
            "fallback": $("#pse-options .pse-fallback")
        };
    }

    function buildProductForm() {
        var pse = null,
            combinationId = null,
            combinationValue = null,
            combinationValueId = null,
            combinations = null,
            combinationName = [],
            i;

        // initialization for the first default pse
        $pse.pseId = $pse.id.val();

        if (PSE_COUNT > 1) {
            // Use fallback method ?
            $pse.useFallback = useFallback();

            if ($pse.useFallback) {
                $("#pse-options .option-option").remove();

                for (pse in PSE){
                    combinations = PSE[pse].combinations;

                    combinationName = [];
                    if (undefined !== combinations) {
                        for (i = 0; i < combinations.length; i++){
                            combinationName.push(PSE_COMBINATIONS_VALUE[combinations[i]][0]);
                        }
                    }
                    $pse.fallback
                        .append("<option value='" + pse + "'>" + combinationName.join(', ') + "</option>");
                }

                $("#pse-options .pse-fallback").on("change", function() {
				  updateProductForm($(this));
				});

            } else {
                $("#pse-options .option-fallback").remove();

                // get the select for options
                $("#pse-options .pse-option").each(function(){
                    var $option = $(this);
                    if ( $option.data("attribute") in PSE_COMBINATIONS){
                        $pse['options'][$option.data("attribute")] = $option; // jshint ignore:line
                        $option.on("change", function() {
						  updateProductForm($(this));
						});
                    } else {
                        // not affected to this product -> remove
                        $option.closest(".option").remove();
                    }
                });

                // build select
                for (combinationValueId in PSE_COMBINATIONS_VALUE) {
                    combinationValue = PSE_COMBINATIONS_VALUE[combinationValueId];
                    $pse.options[combinationValue[1]]
                        .append("<option value='" + combinationValueId + "'>" + combinationValue[0] + "</option>");
                }

                setPseForm();
            }
        }
    }

    function setPseForm(id) {
        var pse = null,
            combinationValueId;
        pse = PSE[id || $pse.pseId];

        if (undefined !== pse) {
            if ($pse.useFallback) {
                $pse.fallbak.val(pse.id);
            } else {
                for (var i = 0; i < pse.combinations.length; i++) {
                    combinationValueId = pse.combinations[i];
                    $pse['options'][PSE_COMBINATIONS_VALUE[combinationValueId][1]].val(pse.combinations[i]) // jshint ignore:line
                }
            }
        }
    }

    function updateProductForm(obj) {
        var pseId = null,
            selection;

        if (PSE_COUNT > 1) {

            if ($pse.useFallback) {
                pseId = $pse.fallback.val();
            } else {
                // get form data
                selection = getFormSelection();
                // get the pse
                pseId = pseExist(selection);
				if (!pseId) {
				  pseId = updateOptions(obj);
				}
                if ( ! pseId ) {
					// not exists, revert
					displayNotice();
					setPseForm();
                } else {
                    $pse.validity.hide();
                }
            }

            // Trigger a change event to give the modules a change to detect PSE ID change.
            $pse.id.val(pseId).trigger('change.pse', pseId);
            $pse.pseId = pseId;
        }

        // Update UI
        updateProductUI();
    }
	function updateOptions(obj) {
		if (obj == undefined) {
		  obj = $pse['options'][Object.keys(PSE_COMBINATIONS)[0]];
		}
		var combinationIdSelected = obj.attr("data-attribute");
		var combinationValueSelected = obj.val();
		var indexSelected = Object.keys(PSE_COMBINATIONS).indexOf(combinationIdSelected);
		var existingCombinations = [];
		var optionsChanged = [];
		for (pse in PSE) {
		  pseId = pse;
		  combinations = PSE[pse].combinations;
		  if (undefined !== combinations) {
			if (combinations[indexSelected] == combinationValueSelected) {
			  existingCombinations.push(combinations);
			}
		  }
		}
		for (pse_combination in PSE_COMBINATIONS) {
		  if (pse_combination != combinationIdSelected) {
			var val = $pse['options'][pse_combination].val();
			var index = Object.keys(PSE_COMBINATIONS).indexOf(pse_combination);
			find = false;
			for (var e = 0; e < existingCombinations.length; e++) {
			  if (existingCombinations[e][index] == val) {
				find = true;
				break;
			  }
			}
			if (!find) {
			  $pse['options'][pse_combination].val(existingCombinations[0][index]);
			  optionsChanged.push($pse['options'][pse_combination]);
			  for (var e = 1; e < existingCombinations.length; e++) {
				if (existingCombinations[e][index] != existingCombinations[0][index]) {
				  existingCombinations.splice(e, 1);
				}
			  }
			}
		  }
		}
		$.each(optionsChanged, function(index,option) {
		  option.addClass('changed');
		});
		setTimeout(function() {
		  $.each(optionsChanged, function(index,option) {
			option.removeClass('changed');
		  });
		}, 250);
		// get form data
		selection = getFormSelection();
		// get the pse
		return pseExist(selection);
	}

    function displayNotice() {
        var $validity = $pse.validity;
        $validity.stop().show('fast', function(){
            setTimeout(function(){
                $validity.stop().hide('fast');
            }, 3000);
        });
    }

    function updateProductUI() {
        var pse = PSE[$pse.pseId],
            name = [],
            pseValueId,
            i
            ;

        if (undefined !== pse) {

            $pse.ref.html(pse.ref);
            // $pse.ean.html(pse.ean);
            // name
            if (PSE_COUNT > 1) {

                for (i = 0; i < pse.combinations.length; i++) {
                    pseValueId = pse.combinations[i];
                    name.push(
                        //PSE_COMBINATIONS[PSE_COMBINATIONS_VALUE[pseValueId][1]].name +
                        //":" +
                        PSE_COMBINATIONS_VALUE[pseValueId][0]
                    );
                }

                $pse.name.html(" - " + name.join(", ") + "");
            }

            // promo
            if (pse.isPromo) {
                $pse.product.addClass("product--is-promo");
            } else {
                $pse.product.removeClass("product--is-promo");
            }

            // new
            if (pse.isNew) {
                $pse.product.addClass("product--is-new");
            } else {
                $pse.product.removeClass("product--is-new");
            }

            // availability
            if (pse.quantity > 0 || !PSE_CHECK_AVAILABILITY) {
                setProductAvailable(true);

                if (parseInt($pse.quantity.val()) > pse.quantity) {
                    $pse.quantity.val(pse.quantity);
                }
                if (PSE_CHECK_AVAILABILITY) {
                    $pse.quantity.attr("max", pse.quantity);
                } else {
                    $pse.quantity.attr("max", PSE_DEFAULT_AVAILABLE_STOCK);
                    $pse.quantity.val("1");
                }

            } else {
                setProductAvailable(false);
            }

            // price
            if (pse.isPromo) {
                $pse.priceOld.html(pse.price);
                $pse.price.html(pse.promo);
            } else {
                $pse.priceOld.html("");
                $pse.price.html(pse.price);
            }
        }
        else {
            setProductAvailable(false);
        }
    }

    function setProductAvailable(available) {

        if (available) {
            $pse.availability
                .removeClass("out-of-stock")
                .addClass("in-stock")
                .attr("href", "http://schema.org/InStock");

            $pse.submit.prop("disabled", false);
        }
        else {
            $pse.availability.removeClass("in-stock")
                .addClass("out-of-stock")
                .attr("href", "http://schema.org/OutOfStock");

            $pse.submit.prop("disabled", true);
        }
    }

    function pseExist(selection) {
        var pseId,
            pse = null,
            combinations,
            i,
            j,
            existCombination;

        for (pse in PSE){
            pseId = pse;
            combinations = PSE[pse].combinations;

            if (undefined !== combinations) {
                for (i = 0; i < selection.length; i++) {
                    existCombination = false;
                    for (j = 0; j < combinations.length; j++) {
                        if (selection[i] == combinations[j]) {
                            existCombination = true;
                            break;
                        }
                    }
                    if (existCombination === false) {
                        break;
                    }
                }
                if (existCombination) {
                    return pseId;
                }
            }
        }

        return false;
    }

    function useFallback() {
        var pse = null,
            count = -1,
            pseCount = 0,
            combinations,
            i;

        for (pse in PSE){
            combinations = PSE[pse].combinations;

            if (undefined !== combinations) {
                pseCount = 0;
                for (i = 0; i < combinations.length; i++) {
                    pseCount += PSE_COMBINATIONS_VALUE[combinations[i]][1];
                }
                if (count == -1) {
                    count = pseCount;
                } else if (count != pseCount) {
                    return true;
                }
            }
        }

        return (count <= 0);
    }

    function getFormSelection() {
        var selection = [],
            combinationId;

        for (combinationId in $pse.options){
            selection.push($pse.options[combinationId].val());
        }

        return selection;
    }

    manager.load = function(){
        init();
        buildProductForm();
        updateProductForm();
    };

    return manager;

}(jQuery));

thelia.min.js :

!function(){for(var t,o=function(){},i=["assert","clear","count","debug","dir","dirxml","error","exception","group","groupCollapsed","groupEnd","info","log","markTimeline","profile","profileEnd","table","time","timeEnd","timeStamp","trace","warn"],n=i.length,e=window.console=window.console||{};n--;)e[t=i[n]]||(e[t]=o)}();var pseManager=function(t){var o={},i={};function n(){var o,n=null,s=null,r=null,c=null,l=[];if(i.pseId=i.id.val(),PSE_COUNT>1)if(i.useFallback=function(){var t,o,i=null,n=-1,e=0;for(i in PSE)if(void 0!==(t=PSE[i].combinations)){for(e=0,o=0;o<t.length;o++)e+=PSE_COMBINATIONS_VALUE[t[o]][1];if(-1==n)n=e;else if(n!=e)return!0}return n<=0}(),i.useFallback){for(n in t("#pse-options .option-option").remove(),PSE){if(l=[],void 0!==(c=PSE[n].combinations))for(o=0;o<c.length;o++)l.push(PSE_COMBINATIONS_VALUE[c[o]][0]);i.fallback.append("<option value='"+n+"'>"+l.join(", ")+"</option>")}t("#pse-options .pse-fallback").on("change",function(){a(t(this))})}else{for(r in t("#pse-options .option-fallback").remove(),t("#pse-options .pse-option").each(function(){var o=t(this);o.data("attribute")in PSE_COMBINATIONS?(i.options[o.data("attribute")]=o,o.on("change",function(){a(t(this))})):o.closest(".option").remove()}),PSE_COMBINATIONS_VALUE)s=PSE_COMBINATIONS_VALUE[r],i.options[s[1]].append("<option value='"+r+"'>"+s[0]+"</option>");e()}}function e(t){var o,n;if(void 0!==(o=PSE[t||i.pseId]))if(i.useFallback)i.fallbak.val(o.id);else for(var e=0;e<o.combinations.length;e++)n=o.combinations[e],i.options[PSE_COMBINATIONS_VALUE[n][1]].val(o.combinations[e])}function a(t){var o,n=null;PSE_COUNT>1&&(i.useFallback?n=i.fallback.val():((n=c(l()))||(n=s(t)),n?i.validity.hide():((o=i.validity).stop().show("fast",function(){setTimeout(function(){o.stop().hide("fast")},3e3)}),e())),i.id.val(n).trigger("change.pse",n),i.pseId=n),function(){var t,o,n=PSE[i.pseId],e=[];if(void 0!==n){if(i.ref.html(n.ref),PSE_COUNT>1){for(o=0;o<n.combinations.length;o++)t=n.combinations[o],e.push(PSE_COMBINATIONS_VALUE[t][0]);i.name.html(" - "+e.join(", "))}n.isPromo?i.product.addClass("product--is-promo"):i.product.removeClass("product--is-promo"),n.isNew?i.product.addClass("product--is-new"):i.product.removeClass("product--is-new"),n.quantity>0||!PSE_CHECK_AVAILABILITY?(r(!0),parseInt(i.quantity.val())>n.quantity&&i.quantity.val(n.quantity),PSE_CHECK_AVAILABILITY?i.quantity.attr("max",n.quantity):(i.quantity.attr("max",PSE_DEFAULT_AVAILABLE_STOCK),i.quantity.val("1"))):r(!1),n.isPromo?(i.priceOld.html(n.price),i.price.html(n.promo)):(i.priceOld.html(""),i.price.html(n.price))}else r(!1)}()}function s(o){null==o&&(o=i.options[Object.keys(PSE_COMBINATIONS)[0]]);var n=o.attr("data-attribute"),e=o.val(),a=Object.keys(PSE_COMBINATIONS).indexOf(n),s=[],r=[];for(pse in PSE)pseId=pse,combinations=PSE[pse].combinations,void 0!==combinations&&combinations[a]==e&&s.push(combinations);for(pse_combination in PSE_COMBINATIONS)if(pse_combination!=n){var u=i.options[pse_combination].val(),d=Object.keys(PSE_COMBINATIONS).indexOf(pse_combination);find=!1;for(var p=0;p<s.length;p++)if(s[p][d]==u){find=!0;break}if(!find){i.options[pse_combination].val(s[0][d]),r.push(i.options[pse_combination]);for(p=1;p<s.length;p++)s[p][d]!=s[0][d]&&s.splice(p,1)}}return t.each(r,function(t,o){o.addClass("changed")}),setTimeout(function(){t.each(r,function(t,o){o.removeClass("changed")})},250),selection=l(),c(selection)}function r(t){t?(i.availability.removeClass("out-of-stock").addClass("in-stock").attr("href","http://schema.org/InStock"),i.submit.prop("disabled",!1)):(i.availability.removeClass("in-stock").addClass("out-of-stock").attr("href","http://schema.org/OutOfStock"),i.submit.prop("disabled",!0))}function c(t){var o,i,n,e,a,s=null;for(s in PSE)if(o=s,void 0!==(i=PSE[s].combinations)){for(n=0;n<t.length;n++){for(a=!1,e=0;e<i.length;e++)if(t[n]==i[e]){a=!0;break}if(!1===a)break}if(a)return o}return!1}function l(){var t,o=[];for(t in i.options)o.push(i.options[t].val());return o}return o.load=function(){i={id:t("#pse-id"),product:t("#product"),name:t("#pse-name"),ref:t("#pse-ref"),ean:t("#pse-ean"),availability:t("#pse-availability"),validity:t("#pse-validity"),quantity:t("#quantity"),promo:t("#pse-promo"),new:t("#pse-new"),weight:t("#pse-weight"),price:t("#pse-price"),priceOld:t("#pse-price-old"),submit:t("#pse-submit"),options:{},pseId:null,useFallback:!1,fallback:t("#pse-options .pse-fallback")},n(),a()},o}(jQuery);!function(t){var o={"address.delete":function(o){t.post(o.attr("href"),function(t){t.success?o.closest("tr").remove():bootbox.alert(t.message)})}};t(document).ready(function(){var i=t('<div class="loader"></div>');t("body").append(i),t(document).ajaxStart(function(){i.show()}).ajaxStop(function(){i.hide()}).ajaxError(function(){i.hide()});var n=t(window).width()>768;t(".navbar").on("click.subnav","[data-toggle=dropdown]",function(o){if(t(this).parent().hasClass("open")&&t(this).is(o.target))return!1}).on("mouseenter.subnav",".dropdown",function(){t(this).hasClass("open")||t(this).addClass("open")}).on("mouseleave.subnav",".dropdown",function(){var o=t(this);o.hasClass("open")&&(0===o.find(":input:focus").length?o.removeClass("open"):o.find(":input:focus").one("blur",function(){o.trigger("mouseleave.subnav")}))}),t("body").tooltip({selector:"[data-toggle=tooltip]"}),t(document).on("click.confirm","[data-confirm]",function(){var i=t(this),n=i.attr("href"),e=i.attr("data-confirm-callback"),a=""!==i.attr("data-confirm")?i.attr("data-confirm"):"Are you sure?";return bootbox.confirm(a,function(a){if(a)if(e&&t.isFunction(o[e]))o[e](i);else if(n)window.location.href=n;else{var s=i.closest("form");s.size()>0&&s.submit()}}),!1}),t(document).on("click.product-quickview",".product-quickview",function(){if(n)return t.get(this.href,function(o){bootbox.hideAll(),bootbox.dialog({message:t("#product",o),onEscape:function(){bootbox.hideAll()}}),window.pseManager.load()}),!1}),void 0!==window.PSE_FORM&&window.pseManager.load(),t(document).on("submit.form-product",".form-product",function(){if(n){var o=t(this).attr("action"),i=t("input[name$='product_id']",this).val(),e=t("input.pse-id",this).val(),a=t("#quantity",this).val();return t.ajax({type:"POST",data:t(this).serialize(),url:o,success:function(o){t(".cart-container").html(t(o).html()),t.ajax({url:addCartMessageUrl,data:{product_id:i,pse_id:e,quantity:a},success:function(t){bootbox.hideAll(),bootbox.dialog({message:t,onEscape:function(){bootbox.hideAll()}})}})},error:function(t){console.log("Error.",t)}}),!1}});var e=t("#category-products").parent();e.on("click.view-mode","[data-toggle=view]",function(){if(!(t(this).hasClass("btn-grid")&&e.hasClass("grid")||t(this).hasClass("btn-list")&&e.hasClass("list")))return i.show(),setTimeout(function(){e.toggleClass("grid").toggleClass("list"),i.hide()},400),!1});var a=t("#form-login");a.on("change.account",":radio",function(){"0"===t(this).val()?t("#password",a).val("").prop("disabled",!0):t("#password",a).prop("disabled",!1)}).find(":radio:checked").trigger("change.account"),t("#form-newsletter-mini").on("submit.newsletter",function(){return t.ajax({url:t(this).attr("action"),type:t(this).attr("method"),data:t(this).serialize(),dataType:"json",success:function(t){bootbox.alert(t.message)},error:function(o){try{bootbox.alert(t.parseJSON(o.responseText).message)}catch(t){bootbox.alert(o.responseText)}}}),!1}),t("#form-filters").each(function(){var o=t(this);o.on("change.filter",":checkbox",function(){i.show(),o.submit()}).find(".group-btn > .btn").addClass("sr-only")}),t(document).on("click.thumbnails","#product-thumbnails .thumbnail",function(){if(t(this).hasClass("active"))return!1;var o=t(this).closest("#product-gallery");return t(".product-image > img",o).attr("src",t(this).attr("href")),t(".thumbnail",o).removeClass("active"),t(this).addClass("active"),!1}),t("#product-gallery").each(function(){t(".item",this).size()>1&&t("#product-thumbnails",this).carousel({interval:!1}).find(".carousel-control").show()}),t("#payment-method").each(function(){var o=t("label",this);o.on("change",":radio",function(){o.removeClass("active"),o.filter('[for="'+t(this).attr("id")+'"]').addClass("active")}).filter(":has(:checked)").addClass("active")}),t("#form-contact, #form-register, #form-address").validate({highlight:function(o){t(o).closest(".form-group").addClass("has-error")},unhighlight:function(o){t(o).closest(".form-group").removeClass("has-error")},errorElement:"span",errorClass:"help-block"}),t("#content").on("change.toolbarfilter","#limit-top, #sortby-top",function(){window.location=t(this).val()}),a.each(function(){var o=t('input[type="email"]',a),i=t("#account1",a);o.on("keypress",function(){i.click()})})})}(jQuery),function(t){t(document).ready(function(){(initialize=function(o){var i={};i.state=t(o),i.stateId=i.state.val(),i.country=t(i.state.data("thelia-country")),i.countryId=i.country.val(),i.block=t(i.state.data("thelia-toggle")),i.states=i.state.children().clone(),i.state.children().remove();var n=function(){var o=i.country.val(),n=i.state.val(),e=!1;null!==n&&""!==n&&(i.stateId=n),i.state.children().remove(),i.states.each(function(){var n=t(this);n.data("country")==o&&(n.appendTo(i.state),e=!0)}),e?(i.state.val(i.stateId),i.block.removeClass("hidden")):i.block.addClass("hidden")};i.country.on("change",n),n()},{init:function(){t("[data-thelia-state]").each(function(){initialize(this)})}}).init()})}(jQuery);

Teste et dis moi wink

Last edited by Elyos (22-04-2021 08:47:38)


Aide les autres, ils t'aideront en retour.

Offline

#25 Re: Lier des déclinaisons

(26-04-2021 10:18:59)


Super ! ça fonctionne !
C'est dommage pour le grisé (grisé les déclinaisons non dispo) donc je vais continuer de chercher de ce côté-là...
En tout cas, ça fonctionne nickel !
Merci beaucoup Elyos !


v. 1.5.4 - v 2.3.4 - v 2.4.3