2012-01-27 23 views
48

Estoy trabajando en la visualización de la disponibilidad de existencias en la página del producto (individual) de mi tema de Magento, y hay algo que no entiendo completamente acerca de esto.¿Cuál es la diferencia entre isSaleable() y isAvailable()?

veo dos métodos que se utilizan en las plantillas para comprobar si un producto está a la venta:

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

Mis propias conclusiones:
veo que isSalable() (que a su vez es llamado por isSaleable()) llama al 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 se muestra el producto como "en existencia" o "agotado"; isSaleable() se utiliza para decidir algo así como si mostrar un botón "Agregar al carro".

En la parte interna me he dado cuenta de que cuando la cantidad de existencias se convierte en cero y los pedidos pendientes son no autorizadas, la disponibilidad de existencias de un producto va a "agotado". Cuando la cantidad de stock se vuelve cero y los pedidos pendientes son permitidos, la disponibilidad de stock a del producto permanece sin cambios.

Pregunta:
las propiedades "disponibilidad de existencias" y "cantidad de stock" obviamente están vinculados entre sí y con los métodos mencionados PHP. Me gustaría saber:

  • lo que la semántica diferencia entre los métodos de PHP isAvailable() y isSaleable() es y para qué lo usaría uno sobre el otro;

  • qué es lo que aparenta no saber aún sobre su relación con estas propiedades y el comportamiento de Magento.

Gracias.

EDIT:
que he probado todas las combinaciones relevantes de la cantidad de stock (-1,0,1), disponibilidad de existencias (en/fuera de) y los pedidos pendientes (on/off) para un producto, y esto 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 

Sólo por el bien de la integridad:

 
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 la disponibilidad en Magento que controla el valor de retorno de todos los métodos PHP, pero cuando los pedidos pendientes a el apagado y la cantidad de stock cae por debajo de 1, la disponibilidad del stock se restablecerá automáticamente a 'agotado' (de ahí las filas N/A).

Respuesta

-1

Veo 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 yo puedo decir, parece que isAvailable comprueba una instancia de tipo de producto para ver si el tipo de producto podría estar a la venta si es de hecho disponibles.

lo tanto, para aventurar una hipótesis sobre cuándo se puede elegir uno sobre el otro:

Si está mirando un producto individual para ver si dicho producto es realmente listo para la venta, debe utilizar isSalable(), como lo hará llama al isAvailable().

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

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

isSalable() comprueba si un producto es vendible.

isSaleable() es un alias de isSalable().

+1

Entiendo la diferencia semántica entre tener algo en stock y poder vender algo, pero todavía no sé cuál es la diferencia semántica entre isSaleable()/isSalable() y isAvailable(). ¿Por qué utilizar uno sobre el otro, cuando en cada situación que puedo pensar, hacen lo mismo (ver la pregunta editada)? Digo "que puedo pensar" porque me gustaría saber si hay situaciones en las que no he pensado que puedan hacer una distinción entre estos métodos, porque ahora tengo la sensación de que uno de ellos es inútil, lo que creo que es un poco rápido para juzgar. – pancake

+0

En su pregunta editada, que ha escrito cuando los pedidos pendientes están apagadas y la cantidad de gotas por debajo de 1, la disponibilidad de existencias será automáticamente ajustará a 'fuera de stock' También hay un 'stock_is_changed_automatically' bandera, que utilizo para mostrar artículos que (técnicamente) no están inventariados, y están explícitamente en stock, pedidos pendientes, y cantidad = 0 – elcash

+0

Esa es información útil, gracias por eso. No quiero parecer ingrato, pero aún no sé cuándo usar isSaleable y cuándo usar isAvailable, cuando * parecen * hacer lo mismo. Actualmente estoy creando un tema, así que me gustaría hacerlo bien. – pancake

-4

isAvailable() se utiliza para decidir si se debe mostrar el producto como en stock o fuera de stock, mientras isSaleable() se utiliza para decidir si se debe mostrar una Añadir a la cesta botón o no.

-3

En lo que a mi preocupación, isSaleable() significa que se está comprobando la mayoría del producto superior que está listo para la venta. Mientras, isAvailable() significa que está verificando el producto de las listas disponibles.

2

isSaleable() Mientras trabajaba con Magento plantillas que definitivamente tropezado con isSalable() método se aplica a objetos 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, toda la extraña cosas en Magento es realizado por los observadores. Mage_Cataloginventory está observando evento catalog_product_load_after y no se llega a 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 indexación. Ignore stock_id, que es una especie de funcionalidad inacabada que también aparecerá más tarde.

Así que acaban en un lugar ningún desarrollador de Magento en su sano juicio va a ir voluntariamente .. 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á en condiciones de venderse o no. Aunque la consulta puede parecer masiva, la lógica detrás no es complicada.

La parte más importante del código aquí es otra vez esta materia 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ó.

Así, 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 gestión de existencias. Las consultas para productos configurables y agrupados varían un poco debido a las especificaciones del tipo de producto.

Cuestiones relacionadas