Joomladay francophone 2018 à Paris 18 et 19 mai

Stock à trois états pour Virtuemart

Réduire
X
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Problème] Stock à trois états pour Virtuemart

    Bonjour,
    Je souhaite transformer la gestion actuelle des stocks dans Virtuemart en une gestion à trois états :

    - ÉTAT 1 : Disponible (les clients peuvent commander le produit indéfiniment, aucune décrémentation n'est nécessaire)
    - ÉTAT 2 : Rupture de stock (les commandes sont toujours possibles mais une icône "disponible dans x semaines" est affichée)
    - ÉTAT 3 : Épuisé (il n'est plus du tout possible de commander le produit qui reste malgré tout visible. Cet état pouvant s'appliquer soit à toute une catégorie de produit, soit à un produit parent, ou encore à un produit enfant spécifique)

    Quelqu'un aurait-il une petite idée de comment offrir ces trois options pour la gestion des stocks dans l'administration?

    Merci

  • #2
    bonjour,

    je reviens sur ce post 2 ans plus tard,

    quelqu'un aurait il trouvé la solution ?

    merci d'avance
    Lylene

    Commentaire


    • #3
      petit up pour cette problématique qui frise l'importantissime, de mon modeste point de vue

      Commentaire


      • #4
        J'ai peut être un début de réponse.
        Je cherchais à afficher le bouton de notification en cas de rupture de stock tout en conservant l'ajout au panier. Voilà ce que j'ai fait !

        Il est nécessaire d'activer la gestion des stocks. Ensuite , tout se passe dans le fichier addtocart_form.tpl situé dans /www/components/com_virtuemart/themes/default/templates/product_details/includes/

        on remplace

        Code:
        $button_lbl = $VM_LANG->_('PHPSHOP_CART_ADD_TO');
            $button_cls = 'addtocart_button';
            if( CHECK_STOCK == '1' && !$product_in_stock ) {
             	$button_lbl = $VM_LANG->_('VM_CART_NOTIFY');
             	$button_cls = 'notify_button';
        par
        Code:
        $button_lbl = $VM_LANG->_('PHPSHOP_CART_ADD_TO');
            $button_cls = 'addtocart_button';
            if( CHECK_STOCK == '1' && !$product_in_stock ) {
             	$button_lbl2 = $VM_LANG->_('VM_CART_NOTIFY');
             	$button_cls2 = 'notify_button';
        puis on remplace :

        Code:
         <input type="submit" class="<?php echo $button_cls ?>" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
        par

        Code:
        <input type="submit" class="<?php echo $button_cls2 ?>" value="<?php echo $button_lbl2 ?>" title="<?php echo $button_lbl2 ?>" /> <input type="submit" class="<?php echo $button_cls ?>" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
        Pour le problème spécifique posé ici je crois qu'il faut mettre un stock très élevé pour l'Etat 1 (millions ou plus pour s'assurer que le stock ne sera jamais à 0)

        Pour les Etat 2 et 3 et je crois qu'on peut jouer sur la date de disponibilité

        en langage naturel ça donnerait

        on affiche "ajouter au panier"
        si le produit est en stock
        ou si le produit est hors stock et la date de dispo > date du jour

        Il reste à traduire ça en langage php, et à inclure le code dans le fichier addtocart_form.tpl.

        Je ne suis pas un as en programmation mais je vais tenter la modif, elle semble à ma portée

        Commentaire


        • #5
          Merci fab !
          Je teste asap ta solution !

          Commentaire


          • #6
            Cela ne fonctionne pas. j'affiche bien le bouton d'ajout au panier et le bouton de notification en même temps, mais quand on clique sur ajouter au panier , ca ouvre la page de notification.

            Il y avait une erreur dans la modif que j'ai faite. J'ai retravaillé sur le fichier afin d'avoir deux form, l'un pour le panier l'utre pour la notification , mais là encore quand on clique sur l'ajout au panier c'est la notification qui s'ouvre (voir ci dessous)

            Code:
            <?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
            
            <div class="vmCartContainer">
                
            <?php
            mm_showMyFileName(__FILE__);
            // This function lists all product children ( = Items)
            // or, when not children are defined, the product_id
            // SO LEAVE THIS IN HERE!
            list($html,$children) = $ps_product_attribute->list_attribute( ( $product_parent_id > 0 )  ? $product_parent_id : $product_id );
            
            if ($children != "multi") { 
            
                if( CHECK_STOCK == '1' && !$product_in_stock && $product_available_date > time()) {
                 	$notify = true;
                } else {
                	$notify = false;
                }
            
            ?>
                <form action="<?php echo $mm_action_url ?>index.php" method="post" name="addtocart" id="<?php echo uniqid('addtocart_') ?>" class="addtocart_form" <?php if( $this->get_cfg( 'useAjaxCartActions', 1 ) && !$notify ) { echo 'onsubmit="handleAddToCart( this.id );return false;"'; } ?>>
            
            <?php
            }
            echo $html;
            
            if (USE_AS_CATALOGUE != '1' && $product_price != "" && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )) {
            	?>
                    <?php if ($children != "multi") { ?> 
                <div style="float: right;vertical-align: middle;"> <?php 
                if ($children == "drop") { 
                	echo $ps_product_attribute->show_quantity_box($product_id,$product_id);
                } 
                if ($children == "radio") {
            		echo $ps_product_attribute->show_radio_quantity_box();
                }
              if(CHECK_STOCK == '1' && ($product_in_stock>0  || (!$product_in_stock && $product_available_date > time()))) {
            $button_lbl = $VM_LANG->_('PHPSHOP_CART_ADD_TO');
                $button_cls = 'addtocart_button';
            } 
                ?>    
                <input type="submit" class="<?php echo $button_cls ?>" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
                </div>
                <?php  } ?>    
                <input type="hidden" name="flypage" value="shop.<?php echo $flypage ?>" />
            	<input type="hidden" name="page" value="shop.cart" />
                <input type="hidden" name="manufacturer_id" value="<?php echo $manufacturer_id ?>" />
                <input type="hidden" name="category_id" value="<?php echo $category_id ?>" />
                <input type="hidden" name="func" value="cartAdd" />
                <input type="hidden" name="option" value="<?php echo $option ?>" />
                <input type="hidden" name="Itemid" value="<?php echo $Itemid ?>" />
                <input type="hidden" name="set_price[]" value="" />
                <input type="hidden" name="adjust_price[]" value="" />
                <input type="hidden" name="master_product[]" value="" />
                <?php
            }
            
            // début formulaire notification
            
            if ($children != "multi") { 
            
                if( CHECK_STOCK == '1' && !$product_in_stock && $product_available_date > time()) {
                 	$notify = true;
                } else {
                	$notify = false;
                }
            
            ?>
                <form action="<?php echo $mm_action_url ?>index.php" method="post" name="addtocart" id="<?php echo uniqid('addtocart_') ?>" class="addtocart_form" <?php if( $this->get_cfg( 'useAjaxCartActions', 1 ) && !$notify ) { echo 'onsubmit="handleAddToCart( this.id );return false;"'; } ?>>
            
            <?php
            }
            echo $html;
            
            if (USE_AS_CATALOGUE != '1' && $product_price != "" && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )) {
            	?>
                    <?php if ($children != "multi") { ?> 
                <div style="float: right;vertical-align: middle;"> <?php 
                if ($children == "drop") { 
                	echo $ps_product_attribute->show_quantity_box($product_id,$product_id);
                } 
                if ($children == "radio") {
            		echo $ps_product_attribute->show_radio_quantity_box();
                }
                if( CHECK_STOCK == '1' && !$product_in_stock ) {
                 	$button_lbl2 = $VM_LANG->_('VM_CART_NOTIFY');
                 	$button_cls2 = 'notify_button';
                }
                ?>    
                <input type="submit" class="<?php echo $button_cls2 ?>" value="<?php echo $button_lbl2 ?>" title="<?php echo $button_lbl2 ?>" />
                </div>
                <?php  } ?>    
                <input type="hidden" name="flypage" value="shop.<?php echo $flypage ?>" />
            	<input type="hidden" name="page" value="shop.cart" />
                <input type="hidden" name="manufacturer_id" value="<?php echo $manufacturer_id ?>" />
                <input type="hidden" name="category_id" value="<?php echo $category_id ?>" />
                <input type="hidden" name="func" value="cartAdd" />
                <input type="hidden" name="option" value="<?php echo $option ?>" />
                <input type="hidden" name="Itemid" value="<?php echo $Itemid ?>" />
                <input type="hidden" name="set_price[]" value="" />
                <input type="hidden" name="adjust_price[]" value="" />
                <input type="hidden" name="master_product[]" value="" />
                <?php
            }
            
            // fin formulaire notification
            
            if ($children != "multi") { ?>
            	</form>
            <?php 
            } 
                if($children == "radio") { ?>
                
                <script language="JavaScript" type="text/javascript">//<![CDATA[
                function alterQuantity(myForm) {
                    for (i=0;i<myForm.selItem.length;i++){
                        setQuantity = myForm.elements['quantity'];
                        selected = myForm.elements['selItem'];
                        j = selected[i].id.substr(7);
                        k= document.getElementById('quantity' + j);
                        if (selected[i].checked==true){
                            k.value = myForm.quantity_adjust.value; }
                        else {
                            k.value  = 0;
                        }
                    }
                }
            	//]]>   
            	</script>
            <?php } ?>
            </div>
            Brefff . Je sèche . le fichier addtocart_form.tpl.php doit faire appel à un autre script , mais j'ignore ou chercher.

            Commentaire


            • #7
              Envoyé par fab4u67 Voir le message
              Cela ne fonctionne pas. j'affiche bien le bouton d'ajout au panier et le bouton de notification en même temps, mais quand on clique sur ajouter au panier , ca ouvre la page de notification.

              Il y avait une erreur dans la modif que j'ai faite. J'ai retravaillé sur le fichier afin d'avoir deux form, l'un pour le panier l'utre pour la notification , mais là encore quand on clique sur l'ajout au panier c'est la notification qui s'ouvre (voir ci dessous)

              Code:
              <?php if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' ); ?>
              
              <div class="vmCartContainer">
                  
              <?php
              mm_showMyFileName(__FILE__);
              // This function lists all product children ( = Items)
              // or, when not children are defined, the product_id
              // SO LEAVE THIS IN HERE!
              list($html,$children) = $ps_product_attribute->list_attribute( ( $product_parent_id > 0 )  ? $product_parent_id : $product_id );
              
              if ($children != "multi") { 
              
                  if( CHECK_STOCK == '1' && !$product_in_stock && $product_available_date > time()) {
                   	$notify = true;
                  } else {
                  	$notify = false;
                  }
              
              ?>
                  <form action="<?php echo $mm_action_url ?>index.php" method="post" name="addtocart" id="<?php echo uniqid('addtocart_') ?>" class="addtocart_form" <?php if( $this->get_cfg( 'useAjaxCartActions', 1 ) && !$notify ) { echo 'onsubmit="handleAddToCart( this.id );return false;"'; } ?>>
              
              <?php
              }
              echo $html;
              
              if (USE_AS_CATALOGUE != '1' && $product_price != "" && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )) {
              	?>
                      <?php if ($children != "multi") { ?> 
                  <div style="float: right;vertical-align: middle;"> <?php 
                  if ($children == "drop") { 
                  	echo $ps_product_attribute->show_quantity_box($product_id,$product_id);
                  } 
                  if ($children == "radio") {
              		echo $ps_product_attribute->show_radio_quantity_box();
                  }
                if(CHECK_STOCK == '1' && ($product_in_stock>0  || (!$product_in_stock && $product_available_date > time()))) {
              $button_lbl = $VM_LANG->_('PHPSHOP_CART_ADD_TO');
                  $button_cls = 'addtocart_button';
              } 
                  ?>    
                  <input type="submit" class="<?php echo $button_cls ?>" value="<?php echo $button_lbl ?>" title="<?php echo $button_lbl ?>" />
                  </div>
                  <?php  } ?>    
                  <input type="hidden" name="flypage" value="shop.<?php echo $flypage ?>" />
              	<input type="hidden" name="page" value="shop.cart" />
                  <input type="hidden" name="manufacturer_id" value="<?php echo $manufacturer_id ?>" />
                  <input type="hidden" name="category_id" value="<?php echo $category_id ?>" />
                  <input type="hidden" name="func" value="cartAdd" />
                  <input type="hidden" name="option" value="<?php echo $option ?>" />
                  <input type="hidden" name="Itemid" value="<?php echo $Itemid ?>" />
                  <input type="hidden" name="set_price[]" value="" />
                  <input type="hidden" name="adjust_price[]" value="" />
                  <input type="hidden" name="master_product[]" value="" />
                  <?php
              }
              
              // début formulaire notification
              
              if ($children != "multi") { 
              
                  if( CHECK_STOCK == '1' && !$product_in_stock && $product_available_date > time()) {
                   	$notify = true;
                  } else {
                  	$notify = false;
                  }
              
              ?>
                  <form action="<?php echo $mm_action_url ?>index.php" method="post" name="addtocart" id="<?php echo uniqid('addtocart_') ?>" class="addtocart_form" <?php if( $this->get_cfg( 'useAjaxCartActions', 1 ) && !$notify ) { echo 'onsubmit="handleAddToCart( this.id );return false;"'; } ?>>
              
              <?php
              }
              echo $html;
              
              if (USE_AS_CATALOGUE != '1' && $product_price != "" && !stristr( $product_price, $VM_LANG->_('PHPSHOP_PRODUCT_CALL') )) {
              	?>
                      <?php if ($children != "multi") { ?> 
                  <div style="float: right;vertical-align: middle;"> <?php 
                  if ($children == "drop") { 
                  	echo $ps_product_attribute->show_quantity_box($product_id,$product_id);
                  } 
                  if ($children == "radio") {
              		echo $ps_product_attribute->show_radio_quantity_box();
                  }
                  if( CHECK_STOCK == '1' && !$product_in_stock ) {
                   	$button_lbl2 = $VM_LANG->_('VM_CART_NOTIFY');
                   	$button_cls2 = 'notify_button';
                  }
                  ?>    
                  <input type="submit" class="<?php echo $button_cls2 ?>" value="<?php echo $button_lbl2 ?>" title="<?php echo $button_lbl2 ?>" />
                  </div>
                  <?php  } ?>    
                  <input type="hidden" name="flypage" value="shop.<?php echo $flypage ?>" />
              	<input type="hidden" name="page" value="shop.cart" />
                  <input type="hidden" name="manufacturer_id" value="<?php echo $manufacturer_id ?>" />
                  <input type="hidden" name="category_id" value="<?php echo $category_id ?>" />
                  <input type="hidden" name="func" value="cartAdd" />
                  <input type="hidden" name="option" value="<?php echo $option ?>" />
                  <input type="hidden" name="Itemid" value="<?php echo $Itemid ?>" />
                  <input type="hidden" name="set_price[]" value="" />
                  <input type="hidden" name="adjust_price[]" value="" />
                  <input type="hidden" name="master_product[]" value="" />
                  <?php
              }
              
              // fin formulaire notification
              
              if ($children != "multi") { ?>
              	</form>
              <?php 
              } 
                  if($children == "radio") { ?>
                  
                  <script language="JavaScript" type="text/javascript">//<![CDATA[
                  function alterQuantity(myForm) {
                      for (i=0;i<myForm.selItem.length;i++){
                          setQuantity = myForm.elements['quantity'];
                          selected = myForm.elements['selItem'];
                          j = selected[i].id.substr(7);
                          k= document.getElementById('quantity' + j);
                          if (selected[i].checked==true){
                              k.value = myForm.quantity_adjust.value; }
                          else {
                              k.value  = 0;
                          }
                      }
                  }
              	//]]>   
              	</script>
              <?php } ?>
              </div>
              Brefff . Je sèche . le fichier addtocart_form.tpl.php doit faire appel à un autre script , mais j'ignore ou chercher.
              Le script qui gère la suite après appuis sur le bouton est dans l'admin classes fichier ps_cart.php
              function add(&$d)
              http://www.st42.fr : Astuce et téléchargement d’extension Joomla! et virtuemart
              http://shop.st42.fr Catalogue extentions gratuit et Pro pour Virtuemart et Joomla

              Commentaire


              • #8
                Désoler pour le remontage de TOPIC mais j'aimerais bien que les gens puisse ajouter au panier meme quand il n'y a pas de stock !
                Les solution au desus sont t'elles bonne ?

                Sinon un autre technique merci beaucoup !

                Commentaire


                • #9
                  Re : Stock à trois états pour Virtuemart

                  Cette possibilité de stock à 3 états m’intéresserait aussi...
                  J'ai bien essayé de m'attaquer au ps_cart.php mais je ne vois pas bien quelles modifications effectuer...

                  Quelqu'un aurait-il un début de solution?

                  Merci

                  Commentaire


                  • #10
                    Re : Stock à trois états pour Virtuemart

                    Même chose e ce qui me concerne. Cà fait un candidat de plus pour une idée ou une piste pour effectuer cette modif.

                    A la rigueur, un truc plus simple me suffirait: c'est de pouvoir lier le délai de livraison au stock:
                    stock>0 : délai = 2 à 3jours
                    stock=0 : délai = 1 à 4 semaines

                    Quelqu'un aurait-il une idée, çà me parait aussi super utile pour la gestion des commandes en flux tendu.
                    http://www.mach-shop.com : Maquettes Avions de Combat Historiques, le spécialiste du warbird à l'échelle!

                    Commentaire


                    • #11
                      Re : Stock à trois états pour Virtuemart

                      Je relance ce sujet parce que c'est un vrai problème pour les boutiques VM qui veulent vendre des produits sur commande.

                      Actuellement je change manuellement le délai de livraison quand un produit arrive à stock=0 mais à un moment ou un autre, 2 clients à la suite vont commander le même produit et j'aurai pas eu le temps de mettre à jour le délai de livraison.

                      Existe-t-il une modif qui permettrait d'ajuster automatiquement le délai de livraison en fonction du stock? (exemple: stock>0 => délai=2 à 3 jours, stock=0 => délai=1 à 4 semaines)
                      http://www.mach-shop.com : Maquettes Avions de Combat Historiques, le spécialiste du warbird à l'échelle!

                      Commentaire


                      • #12
                        Re : Stock à trois états pour Virtuemart

                        ici une soluce qui marche mais il faut tricher un chouilla sur le stock

                        Commentaire


                        • #13
                          Re : Stock à trois états pour Virtuemart

                          OK merci je mets ma réponse sur l'autre post.
                          http://www.mach-shop.com : Maquettes Avions de Combat Historiques, le spécialiste du warbird à l'échelle!

                          Commentaire

                          Annonce

                          Réduire
                          1 sur 2 < >

                          C'est [Réglé] et on n'en parle plus ?

                          A quoi ça sert ?
                          La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

                          Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

                          Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
                          Comment ajouter la mention [Réglé] à votre discussion ?
                          1 - Aller sur votre discussion et éditer votre premier message :


                          2 - Cliquer sur la liste déroulante Préfixe.

                          3 - Choisir le préfixe [Réglé].


                          4 - Et voilà… votre discussion est désormais identifiée comme réglée.

                          2 sur 2 < >

                          Assistance au forum - Outil de publication d'infos de votre site

                          Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

                          Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

                          Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

                          UTILISER À VOS PROPRES RISQUES :
                          L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

                          Problèmes connus :
                          FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

                          Installation :

                          1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

                          Archive zip : https://github.com/AFUJ/FPA/zipball/master

                          2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

                          3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

                          4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

                          5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

                          6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
                          et remplacer www. votresite .com par votre nom de domaine


                          Exemples:
                          Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
                          Télécharger le script fpa-fr.php dans: /public_html/
                          Pour executer le script: http://www..com/fpa-fr.php

                          Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
                          Télécharger le script fpa-fr.php dans: /public_html/cms/
                          Pour executer le script: http://www..com/cms/fpa-fr.php

                          En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

                          Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
                          Voir plus
                          Voir moins
                          Travaille ...
                          X