web-dev-qa-db-fra.com

Quelle est la différence entre isSaleable () et isAvailable ()?

Je travaille sur l'affichage de la disponibilité des stocks sur la page produit (individuelle) de mon thème Magento, et il y a quelque chose que je ne comprends pas complètement à ce sujet.

Je vois deux méthodes utilisées dans les modèles pour vérifier si un produit est disponible à la vente:

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

Mes propres découvertes:
Je vois que isSalable() (qui à son tour est appelée par isSaleable()) appelle isAvailable() mais envoie également deux événements (catalog_product_is_salable_before et catalog_product_is_salable_after).

Sur le front, j'ai remarqué que dans le modèle de base de Magento, isAvailable() est utilisé pour décider d'afficher le produit comme "en stock" ou "en rupture de stock"; isSaleable() est utilisé pour décider quelque chose comme s'il faut afficher un bouton "Ajouter au panier".

Sur le backend, j'ai remarqué que lorsque la quantité en stock devient nulle et que les commandes en souffrance ne sont pas interdites , la disponibilité en stock d'un produit passe en "rupture de stock" ". Lorsque la quantité en stock devient nulle et que les commandes en souffrance sont autorisées , la disponibilité en stock a du produit reste inchangée.

Question:
Les propriétés "disponibilité des stocks" et "quantité des stocks" sont évidemment liées les unes aux autres et aux méthodes PHP PHP mentionnées. J'aimerais savoir:

  • quelle est la différence sémantique entre les méthodes PHP isAvailable() et isSaleable() est et pourquoi j'utiliserais l'un sur l'autre;

  • ce que je pense ne semble pas encore connaître leur relation avec ces propriétés et le comportement de Magento.

Je vous remercie.

MODIFIER:
J'ai essayé toutes les combinaisons pertinentes de quantité de stock (-1,0,1), de disponibilité de stock (entrée/sortie) et de commandes en souffrance (marche/arrêt) pour un produit, et voici le résultat:

 St.Qu BckOrd St.Av isSalable () isSaleable () isAvailable () 
 -1 0 0 0 0 0 
 -1 0 1 N/AN/AN/A 
 -1 1 0 0 0 0 
 -1 1 1 1 1 1 
 0 0 0 0 0 0 
 0 0 1 N/AN/AN/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 

Juste pour être complet:

 St.Av 0 = en rupture de stock 
 St.Av 1 = en stock 
 BckOrd 0 = aucune commande en souffrance 
 BckOrd 1 = les commandes en souffrance sont autorisées 

C'est le commutateur de disponibilité des stocks dans Magento qui contrôle la valeur de retour de toutes les méthodes PHP, mais lorsque les commandes en souffrance sont désactivées et que la quantité de stock tombe en dessous de 1, la disponibilité du stock sera automatiquement réinitialisée à ' en rupture de stock "(d'où les lignes N/A).

49
pancake

isSaleable() En travaillant avec les modèles Magento, vous êtes définitivement tombé sur la méthode isSalable () appliquée à l'objet produit. La méthode existe physiquement, mais elle vérifie uniquement si le produit a activé le statut et la vérification vendable ne doit pas être ignorée. Puis le is_salable la propriété de l'objet produit est retournée.

La question évidente est de savoir quand cette propriété est définie. Une fois le produit chargé, il est déjà défini sur le modèle, mais il ne s'agit pas d'un attribut ni d'une colonne dans la table plate du produit.

Comme d'habitude, tout ce qui est bizarre dans Magento est fait par des observateurs. Mage_Cataloginventory observe l'événement catalog_product_load_after et là, cela revient à Mage_CatalogInventory_Model_Resource_Stock_Status::getProductStatus et la requête suivante:

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;

Il est clairement visible que la décision de vendre ou non le produit est prise lors de la réindexation. Et ignorez stock_id qui est une sorte de fonctionnalité inachevée qui apparaîtra également plus tard.

Nous nous retrouvons donc dans un endroit où aucun développeur sain d'esprit de Magento n'ira volontiers .. l'indexeur. Indexeur d'inventaire de catalogue dans notre cas. Après un voyage rapide à travers le labyrinthe de Mage_CatalogInventory_Model_Indexer_Stock::_processEvent, Mage_Index_Model_Indexer_Abstract::reindexAll et Mage_CatalogInventory_Model_Resource_Indexer_Stock::reindexAll nous découvrons que chaque type de produit possède son propre indexeur de titres qui réside dans app/code/core/Mage/CatalogInventory/Model/Resource/Indexer/Stock.

Chaque type a un _getStockStatusSelect méthode où une requête SQL décide finalement si le produit est en vente ou non. Même si la requête peut sembler massive, la logique derrière n'est pas compliquée.

La grande partie du code ici est encore une fois ce truc rudimentaire. On dirait que les développeurs principaux ont fait une belle tentative pour permettre d'avoir différents niveaux de stock pour différents sites Web, mais pour une raison quelconque, cette fonctionnalité n'a jamais été terminée.

Ainsi, par exemple, la vérification de la disponibilité des stocks de produits simples ne consiste qu'à vérifier que le produit est activé et que la quantité est épicée positivement avec un indicateur de gestion des stocks. Les requêtes pour les produits configurables et groupés varient un peu en raison des spécificités du type de produit.

3
krishna