Jump to content

[RESOLU] 1.6 Rendre obligatoire la sélection des déclinaisons


Skygraphism

Recommended Posts

Bonjour la communauté! 

Bon voilà je reviens vers où pour une question technique! 

Je suis en train de créer une boutique de vente de véhicules où la plupart des produits ont 2 types de déclinaisons : couleur et montage (avec Oui ou Non pour cette dernière).

Ma question serait de savoir comment rendre obligatoire la sélection des deux déclinaisons. 

J'ai cherché mais n'ai rien trouvé de bien utile ou adaptable à la version 1.6.0.11 

 

Je voudrais savoir donc si quelqu'un c'était déjà essayé à faire ça ? ou sinon si quelqu'un saurait comment récupérer l'état (sélectionné ou pas ) d'une déclinaison ? 

Merci d'avance pour votre intérêt vos réponses! 

 

 

 

Edited by Skygraphism (see edit history)
Link to comment
Share on other sites

Bonjour,

 

Alors oui il y a bien une déclinaison par défaut mais il faut impérativement que la personne choisisse une couleur

 

Coté back-office mettez un attribut couleur par défaut dans la déclinaison par défaut.

 

Autrement il vous faudra intervenir sur le fichier ajax-cart.js du thème.

Link to comment
Share on other sites

@Pilou.biz : Pour le lien je travaille en local donc je peux en donner pour le moment. 

 

@doekia : ce que vous me dites là correspond au fait d'enlever l'ajout panier quand un produit a plusieurs déclinaisons quand on affiche les produits dans les catégories, moi je suis dans le cas où on est dans la fiche produit. 

 

@Yopixel : en fait je voudrais éviter que des clients ajoutent directement le produit au panier sans sélectionner la couleur ET s'ils veulent le montage ou pas . 

En fait idéalement il me faudrait avec 2 déclinaisons par défauts, j'ai déjà pensé à utiliser le générateur pour cela mais je me retrouve avec des soucis de stock (car le montage est une déclinaison qui n'a pas de stock). 

Je suis en train de voir pour essayer de mettre une condition dans l'affichage de l'ajout panier grâce à : 

$product->getAttributeCombinationsById($id_attribute, $this->context->language->id);

si j'ai bien compris ça renvoi un tableau avec la valeur des attributs en fonction de id_product_attribute, mais j'ai un peu de mal à exploiter le résultat en fait....

 

L'idée serait que si mon tableau est null (ou du moins que la valeur de l'attribut pour l'id couleur ou montage est null) alors on cache le panier, j'ajouterais cette condition dans le fichier product.tpl ici (pour moi c'est ligne 386) : 

<div{if (!$allow_oosp && $product->quantity <= 0) || !$product->available_for_order || (isset($restricted_country_mode) && $restricted_country_mode) || $PS_CATALOG_MODE || ma_condition } class="unvisible"{/if}>

qu'est-ce que vous en pensez? 
quelqu'un a déjà utilisé  getAttributeCombinationsById ?

Edited by Skygraphism (see edit history)
Link to comment
Share on other sites

Heu 2 déclinaisons par défaut? C'est la couleur blouge ça!

 

Désactive le bouton d'ajout au panier sur la fiche produit à l'affichage de cette dernière. Dès que l'internaute aura sélectionné une déclinaison le bouton s'active de manière "magique"

 

Franchement que signifie "par défaut" ? Si rien n'a été précisé !

  • Like 1
Link to comment
Share on other sites

Quand je parle de 2 déclinaisons par défauts je veux parler par exemple d'une couleur et du montage....pas de 2 couleurs ensemble...

 

Ta solution pourrait être bien mais rien ne me dit que le client va pas cliquer sur une des deux déclinaisons déjà sélectionnées (apparemment il y a toujours une déclinaison par défaut définie par prestashop de ce que j'ai vu).

 
Moi je cherche à vérifier que les clients ont bien sélectionné une valeur pour chacune des déclinaisons afin qu'ils puissent ajouter dans le panier.
C'est pour ça que j'ai la valeur d'une des déclinaisons par défaut de sélectionnée et que je voudrais vérifier que l'autre a bien été sélectionner par la suite. 

Link to comment
Share on other sites

Comme je l'ai déjà expliqué je ne peux pas faire ça, c'est pas faute d'y avoir pensé (et de ce fait la question ne se poserait même plus) . 

J'utilise la gestion des stocks avancée et comme expliqué dans un message précédent la déclinaison qui correspond au Montage n'a pas de stock (il y a pas de quantité limite de montage ou pas), donc je vais vite avoir des soucis dans ma gestion des stocks si j'utilise cette solution. 

Link to comment
Share on other sites

Alors tu fait un champ de customisation montage: oui/non obligatoire

Avec un bon formatage template il ressemblera à une option

Et tant qu'il n'est pas rempli, étant obligatoire l'ajout au panier n'est pas possible.

 

Je te dis ça parce que ce que je vois que tu t'apprète à écrire me semble:

1/ pas pérenne du tout

2/ un remède où il n'y a pas de problème

Link to comment
Share on other sites

Désolé pour le temps de réponse , voilà la partie concernant les déclinaisons dans mon product.tpl (rien de modifié encore)

 

{if isset($groups)}<!-- attributes -->
<div id="attributes">
<div class="clearfix"></div>
{foreach from=$groups key=id_attribute_group item=group}
{if $group.attributes|@count}
<fieldset class="attribute_fieldset">
<label class="attribute_label" {if $group.group_type != 'color' && $group.group_type != 'radio'}for="group_{$id_attribute_group|intval}"{/if}>{$group.name|escape:'html':'UTF-8'} </label>
{assign var="groupName" value="group_$id_attribute_group"}
<div class="attribute_list">
{if ($group.group_type == 'select')}
<select name="{$groupName}" id="group_{$id_attribute_group|intval}" class="form-control attribute_select no-print">
{foreach from=$group.attributes key=id_attribute item=group_attribute}
<option value="{$id_attribute|intval}"{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if} title="{$group_attribute|escape:'html':'UTF-8'}">{$group_attribute|escape:'html':'UTF-8'}</option>
{/foreach}
</select>
{elseif ($group.group_type == 'color')}
<ul id="color_to_pick_list" class="clearfix">
{assign var="default_colorpicker" value=""}
{foreach from=$group.attributes key=id_attribute item=group_attribute}
{assign var='img_color_exists' value=file_exists($col_img_dir|cat:$id_attribute|cat:'.jpg')}
<li{if $group.default == $id_attribute} class="selected"{/if}>
<a href="{$link->getProductLink($product)|escape:'html':'UTF-8'}" id="color_{$id_attribute|intval}" name="{$colors.$id_attribute.name|escape:'html':'UTF-8'}" class="color_pick{if ($group.default == $id_attribute)} selected{/if}"{if !$img_color_exists && isset($colors.$id_attribute.value) && $colors.$id_attribute.value} style="background:{$colors.$id_attribute.value|escape:'html':'UTF-8'};"{/if} title="{$colors.$id_attribute.name|escape:'html':'UTF-8'}">
{if $img_color_exists}
<img src="{$img_col_dir}{$id_attribute|intval}.jpg" alt="{$colors.$id_attribute.name|escape:'html':'UTF-8'}" title="{$colors.$id_attribute.name|escape:'html':'UTF-8'}" width="20" height="20" />
{/if}
</a>
</li>
{if ($group.default == $id_attribute)}
{$default_colorpicker = $id_attribute}
{/if}
{/foreach}
</ul>
<input type="hidden" class="color_pick_hidden" name="{$groupName|escape:'html':'UTF-8'}" value="{$default_colorpicker|intval}" />
{elseif ($group.group_type == 'radio')}
<ul>
{foreach from=$group.attributes key=id_attribute item=group_attribute}
<li>
<input type="radio" class="attribute_radio" name="{$groupName|escape:'html':'UTF-8'}" value="{$id_attribute}" {if ($group.default == $id_attribute)} checked="checked"{/if} />
<span>{$group_attribute|escape:'html':'UTF-8'}</span>
</li>
{/foreach}
</ul>
{/if}
</div> <!-- end attribute_list -->
</fieldset>
{/if}
{/foreach}
</div> <!-- end attributes -->
 

 

Edited by Skygraphism (see edit history)
Link to comment
Share on other sites

Donc, à supprimer:

{if (isset($smarty.get.$groupName) && $smarty.get.$groupName|intval == $id_attribute) || $group.default == $id_attribute} selected="selected"{/if}

{if $group.default == $id_attribute} class="selected"{/if}

{if ($group.default == $id_attribute)} selected{/if}

{if ($group.default == $id_attribute)}
{$default_colorpicker = $id_attribute}
{/if}

{if ($group.default == $id_attribute)} checked="checked"{/if}

Ensuite videz votre cache smarty et affichez votre page

Link to comment
Share on other sites

Merci Eolia pour la précision ! 

Alors on approche du but le bouton Ajouter au panier s'affiche bien lorsque une des déclinaisons est sélectionnée. 

Me resterais à faire en sorte que le bouton ne s'affiche que si les 2 types de déclinaisons possible : une couleur, et si c'est Oui ou Non pour le montage 
Il est impératif pour moi de faire ça afin d'éviter toute commande sans couleur ou sans précision sur le montage. 

 

Mais je sais pas comment vérifier si oui ou non une déclinaison est sélectionnée ou pas. 

 

En fait pour être plus précis ce que je voudrais faire serait de rajouter une condition à l'affichage du bouton "Ajouter au panier" qui, il me semble, se fait ici : 

<div class="box-cart-bottom">
<div{if (!$allow_oosp && $product->quantity <= 0) || !$product->available_for_order || (isset($restricted_country_mode) && $restricted_country_mode) || $PS_CATALOG_MODE} class="unvisible"{/if}>
<p id="add_to_cart" class="buttons_bottom_block no-print">
<button type="submit" name="Submit" class="exclusive">
<span>{if $content_only && (isset($product->customization_required) && $product->customization_required)}{l s='Customize'}{else}{l s='Add to cart'}{/if}</span>
</button>
</p>
</div>

Cette condition vérifierait si l'article est bien un véhicule et si les déclinaisons ont bien été sélectionnées pour afficher le bouton. 
Mais pour ça me faudrait savoir comment vérifier si une déclinaison est sélectionnée ou pas en fonction de son Id.

 

Et comme je disais plus haut je pensais utiliser cette fonction : 

$product->getAttributeCombinationsById($id_attribute, $this->context->language->id);

Mais j'ai un peu de mal à l'utiliser et l'exploiter. Quelqu'un l'a déjà utilisé? ou si vous avez une meilleure idée je suis preneur ! 

Edited by Skygraphism (see edit history)
Link to comment
Share on other sites

Vous vous compliquez la vie^^

 

Apparament vous avez ajouté vos déclinaisons à la mano, donc Prestashop n'a pas géré leurs combinaisons

 

Il faut créer un groupe couleur et un groupe montage

Il faut leur ajouter des valeurs (rouge, jaune, aucune... et oui, non)

Il faut ensuite utiliser le générateur de déclinaisons

 

Maintenant, sur votre page produit, si les 2 options ne sont pas sélectionnées, le bouton ne s'affichera pas :)

Link to comment
Share on other sites

Oui j'aime bien me compliquer la vie ! :) 

Mais non j'ai pas créé les déclinaisons à la main, j'ai bien utilisé Prestashop pour gérer les attributs et le problème du générateur de déclinaisons va survenir lors de la gestion des stocks, en effet je n'ai pas un stock de véhicules montés et un stock de véhicules non montés, on les monte en fonction des commandes , de ce fait en utilisant la gestion des stock avec le générateur de déclinaisons je vais me retrouver avec un stock pour les véhicules montés et un stock avec les véhicules non monté...

 

Après le soucis restera le même avec ma situation actuelle j'aurais toujours le stock de montage oui non à gérer, mais je pense que ce sera toujours mieux d'avoir juste ces deux à gérer pour tous les véhicules que toutes les déclinaisons de tous les véhicules pouvant être générées par le générateur  (car les couleurs diffèrent en fonction des véhicules).

 

D'ailleurs j'en profite pour demander si vous avez une idée d'où il faudrait que je regarde pour décrémenter le stock de plusieurs attributs d'un produit lors d'une commande? (et déjà aussi si c'est vraiment faisable...)

Link to comment
Share on other sites

Alors j'ai réussi à trouver ma solution grâce au forum en anglais : https://www.prestashop.com/forums/topic/367953-required-attribute-selection-disallow-add-to-cart-with-default-attributes/?p=1827786

 

Solution que j'ai appliqué à mon problème et que j'explicite ici .

 

Etape 1: themes\default-bootstrap\js\product.js:

 

1. Tout en haut du fichier, après  var colors = []; ajouter les lignes suivantes :

var combinationColorSelected = false;
var combinationAttrSelected = false;
var combinationRatioSelected = false;

2. Scrollez plus bas, pour moi c'est vers la ligne 243 et remplacez le code suivant:

  1.     $(document).on('click', '.color_pick', function(e){
            e.preventDefault();
            colorPickerClick($(this));
            getProductAttribute();
        });
    
         $(document).on('change', '.attribute_select', function(e){
            e.preventDefault();
            findCombination();
            getProductAttribute();
        });
    
         $(document).on('click', '.attribute_radio', function(e){ 
            e.preventDefault();
            findCombination();
            getProductAttribute();
        });

par

$(document).on('click', '.color_pick', function(e){
e.preventDefault();
colorPickerClick($(this));
getProductAttribute();
combinationColorSelected = true;
});


$(document).on('change', '.attribute_select', function(e){
e.preventDefault();
findCombination();
getProductAttribute();
combinationAttrSelected = true;
});


$(document).on('click', '.attribute_radio', function(e){
e.preventDefault();
findCombination();
getProductAttribute();
combinationRatioSelected = true;}); 

 

 

Etape 2: themes\default-bootstrap\js\modules\block-cart\ajax-cart.js:

 

Trouver la ligne suivante, pour moi c'est vers la ligne 144:

  1.         //for product page 'add' button...       
     $(document).on('click', '#add_to_cart button', function(e){
                e.preventDefault();
                ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null);
            });

et remplacer par:

 

//for product page 'add' button...
$(document).on('click', '#add_to_cart button', function(e){
e.preventDefault();
if ( !combinationColorSelected || !combinationRatioSelected)
                       {
if (!combinationColorSelected)    alert('Merci de sélectionner une couleur.');
else  alert('Merci de sélectionner une option de montage (Oui ou Non).'); 
}
                        else
         ajaxCart.add($('#product_page_product_id').val(), $('#idCombination').val(), true, null, $('#quantity_wanted').val(), null);
});

Cela m'affiche donc un message d'alerte si le client n'a pas sélectionné un des deux attributs ! :)

 

Il me restera plus qu'à appliquer cette vérification aux pages produits correspondant à des véhicules! 
 

Je passe le topic en résolu! Merci à tous pour votre aide et contributions ;) 

    

Edited by Skygraphism (see edit history)
Link to comment
Share on other sites

  • 10 months later...

Bonjour,

 

effectivement ce code marche, cependant il empêche d'ajouter aussi les produits qui n'ont pas de déclinaisons. J'ai fais le tour de tous les forums et impossible de trouver ce qu'il me faut. 

 

J'ai besoin d'afficher un message d'alerte mais il faut aussi que je puisse choisir sur quelle catégorie de produit l'activée. Un petit coup de main svp

 

Merci

Link to comment
Share on other sites

On frise le ridicule quand même ... un petit coup de main alors que Skygraphism et le forum anglais donne une marche a suivre très avancée. Si on cherche à construire soit-même l'Empire State Building, faut quand même savoir tenir une truelle.

  • Like 1
Link to comment
Share on other sites

ça? :angry: je ne suis pas une chose.

 

Maintenant tu veux monter gratis ton réacteur RBMK1000 alors que tu n'as aucune idée de comment lire un plan de montage IKEA.

Donc oui le ça préfère que tu te sentes offusqué plutôt qu'un nouveau Pripiat.

Link to comment
Share on other sites

Euh... vous avez lu ce que j'ai mis plus haut ?

Trouver 

if (typeof combinations !== 'undefined' && combinations)

dans le code et mettre les conditions nécessaires, c'est trop dur ?

 

critiquer la communauté parce qu'elle ne vous donne pas le code tout cuit prêt à copier / coller c'est un peu fort aussi^^

Link to comment
Share on other sites

Tu me prends de haut avec ta première réponse! Ce que Skygraphism a mit dans ce topic ne me correspond pas donc je demande de l'aide à mon problème personnel ce que je trouve normal. 

 

Je veux simplement savoir comment afficher cette erreur sur des catégories définies et non sur tous mes produits. 

 

Merci.

Link to comment
Share on other sites

Parce que ta question implique simplement de mettre en oeuvre un if et/ou un alert.

 

Donc:

- soit tu n'as pas le niveau pour pouvoir écrire ce genre de chose très simple (aucune honte à ça au demeurant), ce qui laisse envisager un liste sempiternelle de question très low level. Mais tu as déjà patché ton code à ce que je comprend,  ça va devenir difficile de te guider touche à touche.

- soit tu ne veux même pas respecter la 2nd règle du forum "Prendre la peine de s'aider soi-même avant de demander de l'aide". S'aider c'est aussi se documenter avant d'appliquer des "patch", les comprendre un minimum,  donc savoir mettre en oeuvre un test simple correspondant à la variation que tu souhaites.

 

C'est en effet ma 1ère réponse te concernant (même si j'ai à peine voilée celle-ci d'un on impersonnel), mais hélas ce n'est pas ma 1ere réponse sur ce forum où l'interlocuteur ne sait pas assez être autonome, et, comme ça va partir en vrille (coté code, car nous ne savons être omnicient) et l'on va y passer des heures/jours/semaines en frustrations mutuelles.

 

Je crois d'ailleurs que ce qui m'a fait bondir c'est le "petit coup de main" alors que tu veux ajuster un patch dans une zone un rien musclée.

D’ailleurs, ... catégorie ... tu te rends bien compte qu'un produit peut appartenir à plusieurs catégories? Quel est ton besoin dans ce cas?

 

Désolé de t'avoir chafouiné et bonne année 2016 quand même

Edited by doekia (see edit history)
Link to comment
Share on other sites

Effectivement Doekia je bloque sur le code a rentrer et dans quel fichier. J'ai déjà adapté à mes besoins le code qui est posté dans ce topic dans mon fichier Ajax-cart.js.

 

J'aurai juste donc besoin de comprendre comment faire apparaître cette erreur sur les catégories que je veux. 

 

Peux tu m'aider ou pas? 

 

Je sais qu'un produit peut-être attribué à plusieurs catégories, mais dans mon cas pas de soucis. 

 

Merci.

Link to comment
Share on other sites

D’ailleurs, ... catégorie ... tu te rends bien compte qu'un produit peut appartenir à plusieurs catégories? Quel est ton besoin dans ce cas?

 

Je sais qu'un produit peut-être attribué à plusieurs catégories, mais dans mon cas pas de soucis.

Dans le fichier product.js, comment faire pour accéder aux variables Prestashop? ex: ($category->id == 17), ($category_id == 17)

J'ai essayé plusieurs façon et ça ne fonctionne pas.

Nous voilà au coeur du problème. C'est pas un souci mais typiquement c'est bien ça le souci.

Donc $product contient un propriété qui se nomme id_category_default, qui peux contenir 17 dans le cas où c'est bien la catégorie par défaut de ce produit.

Sinon, tu vas devoir passer par la statique Product::getProductCategories($product->id) qui ramène un tableau et vérifier la présence de la 17.

if (in_array(17, Product::getProductCategories($product->id))) {
...
}

Mais ton problème semble non lié à catégorie dans l'obsolue mais au fait que certains produits n'ont pas de déclinaisons.

Tu dois détecter ce cas et prendre les mesures dans ton js pour ne PAS bloquer via alert() si

if ( !combinationColorSelected || !combinationRatioSelected) en effet, sans déclinaisons pas de variable combinationColorSelected et/ou tu la force à true dans ce cas

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...