magento product stock

magento - ¿Cuál es la diferencia entre isSaleable() y isAvailable()?



product stock (4)

Estoy trabajando en la visualización de la disponibilidad de stock en la página de producto (individual) de mi tema de Magento, y hay algo que no entiendo completamente acerca de esto.

Veo dos métodos que se utilizan en las plantillas para verificar si un producto está disponible para la venta:

Mage_Catalog_Model_Product::isAvailable() Mage_Catalog_Model_Product::isSaleable()

Mis propios hallazgos:
Veo que isSalable() (que a su vez es llamado por isSaleable() ) llama a isAvailable() pero también despacha dos eventos ( catalog_product_is_salable_before y catalog_product_is_salable_after ).

En la parte frontal, he notado que en la plantilla base de Magento, isAvailable() se usa para decidir si mostrar el producto como "en existencia" o "agotado"; isSaleable() se usa para decidir si desea mostrar el botón "Agregar al carro".

En el back-end, he notado que cuando la cantidad de stock se vuelve cero y no se permiten los pedidos atrasados, la disponibilidad de stock de un producto se queda "agotada". Cuando la cantidad de stock se convierte en cero y se permiten pedidos atrasados, la disponibilidad de stock a del producto permanece sin cambios.

Pregunta:
Las propiedades "stock availability" y "stock amount" están obviamente vinculadas entre sí y con los métodos PHP mencionados. Me gustaría saber:

  • cuál es la diferencia semántica entre los métodos PHP isAvailable() e isSaleable() y por qué usaría uno sobre el otro;

  • qué es lo que todavía no sé sobre su relación con estas propiedades y el comportamiento de Magento.

Gracias.

EDITAR:
Probé todas las combinaciones relevantes de cantidad de stock (-1,0,1), disponibilidad de stock (entrada / salida) y pedidos pendientes (activado / desactivado) para un producto, y este es el resultado:

St.Qu BckOrd St.Av isSalable() isSaleable() isAvailable() -1 0 0 0 0 0 -1 0 1 N/A N/A N/A -1 1 0 0 0 0 -1 1 1 1 1 1 0 0 0 0 0 0 0 0 1 N/A N/A N/A 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1

Solo por el bien de la compleción:

St.Av 0 = out of stock St.Av 1 = in stock BckOrd 0 = no backorders allowed BckOrd 1 = backorders are allowed

Es el interruptor de disponibilidad de stock en Magento que controla el valor de retorno de todos los métodos de PHP, pero cuando los pedidos pendientes están desactivados y la cantidad de stock cae por debajo de 1, la disponibilidad de existencias se restablecerá automáticamente a ''agotado'' (de ahí la N/A filas).


En lo que a mí isSaleable() , isSaleable() significa que está revisando el producto más isSaleable() que está listo para la venta. Mientras, isAvailable() significa que está verificando el producto de las listas disponibles.


Veo aquellos que tienen diferencias semánticas. Un artículo que no está en stock todavía puede ser vendible si dicho artículo está configurado para permitir pedidos atrasados.

Por lo que puedo decir, parece que isAvailable verifica una instancia de tipo de producto para ver si el tipo de producto podría estar a la venta si está realmente disponible.

Entonces, aventúrese a adivinar cuándo puede elegir una sobre la otra:

Si está revisando un producto individual para ver si dicho producto está realmente listo para la venta, debe usar isSalable() , ya que se llamará isAvailable() .

Para verificar si un producto (cuyo tipo no conoce) puede venderse, y supongo que omitir el paso de verificar el tipo de producto, puede llamar a isAvailable() en el producto.

isAvailable() comprueba si el tipo de producto es vendible.

isSalable() comprueba si un producto es vendible.

isSaleable() es un alias de isSalable() .


isAvailable () se usa para decidir si mostrar el producto como en stock o fuera de stock , mientras que isSaleable () se usa para decidir si mostrar un botón Agregar al carrito o no.


isSaleable () Al trabajar con plantillas de Magento, definitivamente tropezó con el método isSalable () aplicado al objeto del producto. El método existe físicamente pero solo verifica si el producto tiene el estado habilitado y no se debe omitir la verificación vendible. A continuación, se devuelve la propiedad is_salable del objeto del producto.

La pregunta obvia es cuando se establece esta propiedad. Después de cargar el producto, ya está configurado en el modelo, pero no es un atributo y no es una columna en la tabla plana del producto.

Como de costumbre, todas las cosas extrañas en Magento son hechas por observadores. Mage_Cataloginventory está observando catalog_product_load_after event y ahi viene Mage_CatalogInventory_Model_Resource_Stock_Status :: getProductStatus y la siguiente consulta:

SELECT `cataloginventory_stock_status`.`product_id`, `cataloginventory_stock_status`.`stock_status` FROM `cataloginventory_stock_status` WHERE (product_id IN(''241319'')) AND (stock_id=1) AND (website_id=3);

Es claramente visible que la decisión de si el producto es vendible o no se realiza durante la reindexación. Ignore stock_id, que es una especie de funcionalidad inacabada que también aparecerá más tarde.

Así que estamos terminando en un lugar en el que ningún desarrollador de Magento estará dispuesto a ir ... el indexador. Indexador de inventario de catálogo en nuestro caso. Después de un viaje rápido por el laberinto de Mage_CatalogInventory_Model_Indexer_Stock :: _ processEvent, Mage_Index_Model_Indexer_Abstract :: reindexAll y Mage_CatalogInventory_Model_Resource_Indexer_Stock :: reindexAll descubrimos que cada tipo de producto tiene su propio indexador de inventario que se encuentra en la aplicación / code / core / Mage / CatalogInventory / Model / Resource / Indexer /Valores.

Cada tipo tiene un método _getStockStatusSelect donde una consulta SQL finalmente decide si el producto está disponible o no. Aunque la consulta puede parecer masiva, la lógica detrás no es complicada.

La gran parte del código aquí es de nuevo esta cosa rudimentaria. Parece que los desarrolladores principales hicieron un buen intento para permitir tener diferentes niveles de stock para diferentes sitios web, pero por alguna razón esta funcionalidad nunca se terminó.

Entonces, por ejemplo, la verificación de la disponibilidad de existencias de productos simples solo contiene la verificación de que el producto está habilitado y la cantidad es positiva especiada con indicadores de administración de existencias. Las consultas para productos configurables y agrupados varían un poco debido a las especificaciones del tipo de producto.