2012-01-27 18 views
48

Pracuję nad wyświetlaniem dostępności zapasów na (indywidualnej) stronie produktu mojego tematu Magento i jest coś, czego nie całkiem rozumiem.Jaka jest różnica między isSaleable() i isAvailable()?

widzę dwie metody wykorzystywane w szablonach, aby sprawdzić czy produkt jest dostępny na sprzedaż:

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

Własne półfabrykaty:
widzę, że isSalable() (co z kolei jest nazywany przez isSaleable()) wywołuje isAvailable(), ale także wywołuje dwa zdarzenia (catalog_product_is_salable_before i catalog_product_is_salable_after).

Na froncie zauważyłem, że w podstawowym szablonie Magento użyto szablonu isAvailable(), aby zdecydować, czy wyświetlić produkt jako "w magazynie", czy "na stanie"; isSaleable() służy do decydowania, czy wyświetlić przycisk "Dodaj do koszyka".

Na zapleczu zauważyłem, że gdy ilość zapasów wynosi zero, a zaległe zamówienia to , a nie, dostępność zapasów produktu przechodzi do stanu "brak w magazynie". Gdy ilość zapasów wynosi zero, a zaległe zamówienia to , są dozwolone, dostępność zapasów produktu pozostaje niezmieniona.

Pytanie:
Własności „dostępność ręki” i „ilość ręki” są oczywiście połączone ze sobą i z wymienionych metod PHP. Chciałbym wiedzieć:

  • co semantyczny różnica między metodami PHP isAvailable() i isSaleable() i dlaczego chciałbym użyć jeden nad drugim;

  • co to jest, wydaje mi się, że jeszcze nie wiem o ich związku z tymi właściwościami i zachowaniem Magento.

Dziękuję.

EDIT:
Próbowałem wszelkich odpowiednich kombinacji ilości akcji (-1,0,1), dostępności zapasów (w/poza) i zaległych zamówień (on/off) na produkt, a to jest wynikiem:

 
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 

tylko dla kompletności wywodu:

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

jest to przełącznik dostępność towaru w Magento, który kontroluje wartość zwracaną wszystkie metody PHP, ale kiedy Zaległości a ponownie, a ilość zapasów spadnie poniżej 1, dostępność zapasów zostanie automatycznie zresetowana do "brak w magazynie" (stąd wiersze N/A).

Odpowiedz

-1

Widzę te, które mają różnice semantyczne. Przedmiot, którego nie ma w magazynie, może być nadal dostępny do sprzedaży, jeśli ten element jest ustawiony na zezwalanie na zaległości.

O ile mogę powiedzieć, że wygląda isAvailable kontroli instancji rodzaj produktu, aby zobaczyć, czy rodzaj produktu mógłby być na sprzedaż, jeśli jest rzeczywiście dostępny.

Tak więc, aby zaryzykować, kiedy można wybrać jeden nad drugim:

Jeśli sprawdzanie indywidualny produkt, aby zobaczyć czy wspomniany produkt jest rzeczywiście gotowy do sprzedaży, należy użyć isSalable(), jak to będzie zadzwoń pod numer isAvailable().

Aby sprawdzić, czy produkt (którego typ nie wiesz od ręki) może zostać sprzedany, i przypuszczam, że pominiemy krok sprawdzania typu produktu, możesz zadzwonić pod numer isAvailable() na produkcie.

isAvailable() sprawdza, czy rodzaj produktu można sprzedawać.

isSalable() sprawdza, czy produkt można zbywalne.

isSaleable() to pseudonim isSalable().

+1

Rozumiem semantyczną różnicę między posiadaniem czegoś w magazynie a możliwością sprzedaży, ale nadal nie wiem jaka jest różnica semantyczna między isSaleable()/isSalable() i isAvailable(). Po co używać jednego z drugim, kiedy w każdej sytuacji, o której myślę, że robią to samo (patrz pytanie edytowane)? Mówię "o czym mogę myśleć", ponieważ chciałbym się dowiedzieć, czy są sytuacje, o których nie myślałem, które mogłyby wprowadzić rozróżnienie między tymi metodami, ponieważ teraz mam wrażenie, że jedno z nich jest bezużyteczne, co uważam za trochę szybka do osądzenia. – pancake

+0

W edytowanym pytaniu napisałeś , gdy zaległości są wyłączone, a ilość zapasów spadnie poniżej 1, dostępność zapasów zostanie automatycznie zresetowana do stanu "niedostępny" Istnieje również flaga "stock_is_changed_automatically", której używam do wyświetlania przedmioty, które (technicznie) nie są zinwentaryzowane i są wyraźnie dostępne w magazynie, zaległe zlecenia i qty = 0 – elcash

+0

To przydatne informacje, dziękuję za to. Nie chcę wydawać się niewdzięczny, ale nadal nie wiem, kiedy używać isSaleable i kiedy używać JestAvailable, kiedy * wydają się * robić to samo. Obecnie buduję motyw, więc chciałbym to naprawić. – pancake

-4

isavailable() stosuje się zdecydować, czy wyświetlać produkt jako w magazynie lub niedostepny, natomiast isSaleable() służy zdecydować, czy pokazać Dodaj do koszyka przycisk albo nie.

-3

Jeśli chodzi o moje obawy, isSaleable() oznacza, że ​​sprawdzają się na najwyższym produkt, który jest gotowy do sprzedaży. Chociaż isAvailable() oznacza, że ​​sprawdzasz produkt z dostępnych list.

2

isSaleable() Pracując z Magento Szablony na pewno natknął isSalable() metoda stosowana do obiektu produktów. Metoda istnieje fizycznie, ale sprawdza tylko, czy produkt ma włączony status i nie można pominąć sprawdzania dostępności. Następnie zwracana jest właściwość is_salable obiektu produktu.

Oczywistym pytaniem jest, kiedy ta właściwość jest ustawiona. Po załadowaniu produktu jest już ustawiony na model, ale nie jest atrybutem i nie jest kolumną w płaskiej tabeli produktu.

Jak zwykle wszystkie dziwne rzeczy w Magento robią obserwatorzy. Mage_Cataloginventory obserwuje zdarzenie catalog_product_load_after i nie sprowadza się do Mage_CatalogInventory_Model_Resource_Stock_Status :: getProductStatus i następującym zapytaniem:

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); 

Widać wyraźnie, że decyzja, czy produkt jest chodliwy czy nie jest wykonywane w reindeksowania. I zignoruj ​​stock_id, który jest rodzajem niedokończonej funkcjonalności, która również pojawi się później.

Tak więc kończymy w miejscu, w którym żaden rozsądny deweloper z Magento chętnie nie pójdzie ... do indeksu. Spis katalogowy inwentarza w naszym przypadku. Po szybkiej podróży przez labirynt Mage_CatalogInventory_Model_Indexer_Stock :: _ processEvent, Mage_Index_Model_Indexer_Abstract :: reindexAll i Mage_CatalogInventory_Model_Resource_Indexer_Stock :: reindexWszyscy odkrywamy, że każdy rodzaj produktu ma swój własny indeks giełdowy, który znajduje się w app/code/core/Mage/CatalogInventory/Model/Resource/Indexer /Zbiory.

Każdy typ ma metodę _getStockStatusSelect, w której zapytanie SQL ostatecznie decyduje o tym, czy produkt jest dostępny do sprzedaży. Mimo że zapytanie może wydawać się masywne, logika nie jest skomplikowana.

Dużą częścią kodu jest znowu ta podstawowa treść. Wygląda na to, że główni programiści podjęli dokładną próbę zezwolenia na różne poziomy zapasów dla różnych stron internetowych, ale z jakiegoś powodu ta funkcja nigdy nie została zakończona.

Na przykład sprawdzanie dostępności zwykłych produktów w magazynie zawiera tylko weryfikację, czy produkt jest włączony, a ilość jest dodatnia z flagami zarządzania zapasami. Zapytania dotyczące konfigurowalnych i zgrupowanych produktów różnią się nieco ze względu na specyfikę rodzaju produktu.

Powiązane problemy