Magento 1.9 – mostrar productos sin existencias

Imaginemos un producto configurable (“Camiseta”) con varios productos simples asociados, de diversas tallas (“Camiseta-M”, “Camiseta-XL”). Imaginemos que tenemos 5 unidades de Camiseta-M pero ninguna de Camiseta-L.

Por defecto, si tenemos marcada en Magento la opción de configuración de no mostrar productos sin stock, Magento solo mostrará en el desplegable de tallas las tallas para las que haya stock.

¿Cómo mostrar las tallas para las que no hay stock?

Hay dos posibles soluciones:

1) Por código

: crear un nuevo módulo y en el config.xml del módulo añadir 2 eventos dentro del tag :

    <events>
        <controller_action_layout_render_before_catalog_product_view>
            <observers>
                <[namespace]_[module]>
                    <class>[module]/observer</class>
                    <method>showOutOfStock</method>
                </[namespace]_[module]>
            </observers>
        </controller_action_layout_render_before_catalog_product_view>
        <controller_action_layout_render_before_checkout_cart_configure>
            <observers>
                <[namespace]_[module]>
                    <class>[module]/observer</class>
                    <method>showOutOfStock</method>
                </[namespace]_[module]>
            </observers>
        </controller_action_layout_render_before_checkout_cart_configure>
    </events>

A continuación crear un observer en app/code/local/[Namespace]/[Module]/Model/Observer.php

class [Namespace]_[Module]_Model_Observer {
    public function showOutOfStock($observer){
        Mage::helper('catalog/product')->setSkipSaleableCheck(true);
    }
}

2) Solución por extensión (la que he aplicado yo)

– Descargar e instalar la extensión EasyLifeSwitcher para Magento: https://github.com/tzyganu/Switcher (mirror)
– Configurarla (más info aqui) para que permita mostrar y seleccionar prods simples sin stock

easylife_switcher

– Editar js/easylife_switcher/product.js y reemplazar:

/**
     * rewrite fillSelect to transform elements to labels
     * @param $super
     * @param element
     */
    fillSelect: function($super, element){
        $super(element);
        //if (this.config.transform_dropdowns){
        var transformed = this.transformDropdown(element);
        if (!transformed && !this.getConfigValue(this.config, 'allow_no_stock_select', false)) {
            var attributeId = element.id.replace(/[a-z]*/, '');
            var options = this.getAttributeOptions(attributeId);
            for (var i in options) {
                if (options.hasOwnProperty(i)){
                    var optVal = options[i].id;
                    var inStock = this.isInStock(attributeId, optVal);
                    $(element).select('option').each (function(elem){
                        if ($(elem).value == optVal && !inStock) {
                            $(elem).disabled="disabled";
                        }
                    });
                }
            }
        }
    },

Por:

/**
     * rewrite fillSelect to transform elements to labels
     * @param $super
     * @param element
     */
    fillSelect: function($super, element){
        $super(element);
        //if (this.config.transform_dropdowns){
        var transformed = this.transformDropdown(element);
        if (!transformed && !this.getConfigValue(this.config, 'allow_no_stock_select', false)) {
            var attributeId = element.id.replace(/[a-z]*/, '');
            var options = this.getAttributeOptions(attributeId);
            for (var i in options) {
                if (options.hasOwnProperty(i)){
                    var optVal = options[i].id;
                    var inStock = this.isInStock(attributeId, optVal);
                    $(element).select('option').each (function(elem){
                        if ($(elem).value == optVal && !inStock) {
                            $(elem).disabled="disabled";
                            // este evento solo se dispara si allow_no_stock_select=0 (NO Permitir seleccionar productos sin existencias)
                            //alert("debug product.js");
                        }
                    });
                }
            }
        }
        // para añadir etiqueta "sin stock" - esto se ejecuta solo si allow_no_stock_select=1 (Permitir seleccionar productos sin existencias)
        if (!transformed && this.getConfigValue(this.config, 'allow_no_stock_select', false)) {
            var attributeId = element.id.replace(/[a-z]*/, '');
            var options = this.getAttributeOptions(attributeId);
            for (var i in options) {
                if (options.hasOwnProperty(i)){
                    var optVal = options[i].id;
                    var inStock = this.isInStock(attributeId, optVal);
                    $(element).select('option').each (function(elem){
                        if ($(elem).value == optVal && !inStock) {
                            //$(elem).label = "Sin stock";
                            $(elem).classList.add("sin-stock-actual");
                        }
                    });
                }
            }
        } // HASTA AQUI ACERTIUS NUEVO
    },

– Editar nuestro archivo de estilos y añadir las reglas:

 /* para mostrar en rojo los productos sin stock */
 .sin-stock-actual{ color: red; }
 .sin-stock-actual::after{content: " - ¡Existencias agotadas!"; }

De esta forma nuestros desplegables de tallas mostrarán todas las tallas:

easylife_switcher_custom_css

2 Thoughts on “Magento 1.9 – mostrar productos sin existencias

  1. Manu on 04/02/2016 at 11:51 said:

    Hola, he buscado por mil sitios y gracias a ti he podido encontrar la solución a este problema, lo unico es que no consigo que aparezca la frase – existencias agotadas al lado de las opciones sin stock, podrias ayudarme?
    Tambien me gustaria saber si es posible cambiar el color de las opciones con stock (del gris claro al verde)

    Muchas gracias de antemano, un saludo!

  2. Manu on 11/08/2016 at 09:29 said:

    Hola muy buen post, pero me gustaría que cuando la opción de ” NO seleccionar las tallas sin stock” estuviera habilitada también pudiera ponerlas en rojo, habría que cambiar algo en el archivo JS?

    Muchas gracias de antemano

Leave a Reply

Your email address will not be published. Required fields are marked *

Post Navigation