2012-01-27 9 views
48

Sto lavorando alla visualizzazione della disponibilità di magazzino sulla pagina del prodotto (individuale) del mio tema Magento, e c'è qualcosa che non capisco completamente di questo.Qual è la differenza tra isSaleable() e isAvailable()?

vedo due metodi utilizzati nei modelli per verificare se un prodotto è disponibile per la vendita:

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

mie scoperte:
vedo che isSalable() (che a sua volta è chiamato da isSaleable()) chiama isAvailable() ma invia anche due eventi (catalog_product_is_salable_before e catalog_product_is_salable_after).

Sul fronted ho notato che nel modello base di Magento isAvailable() viene utilizzato per decidere se visualizzare il prodotto come "disponibile" o "non disponibile"; isSaleable() viene utilizzato per decidere qualcosa come se mostrare un pulsante "Aggiungi al carrello".

Sul backend ho notato che quando la quantità di magazzino diventa zero ei backorder sono non consentiti, la disponibilità di magazzino di un prodotto va a "esaurito". Quando la quantità di magazzino diventa zero ei backorder sono consentiti, la disponibilità di magazzino di un prodotto rimane invariata.

Domanda:
La proprietà "disponibilità di magazzino" e "quantità di riserva" sono ovviamente collegati tra loro e metodi PHP citati. Vorrei sapere:

  • ciò che il semantica differenza tra i metodi di PHP isAvailable() e isSaleable() è e perché vorrei utilizzare uno sopra l'altro;

  • cos'è che sembra non sapere ancora sulla loro relazione con queste proprietà e il comportamento di Magento.

Grazie.

EDIT:
Ho provato ogni combinazione di rilevanti quantità di stock (-1,0,1), disponibilità di magazzino (in/out) e ordini arretrati (on/off) per un prodotto, e questo è il risultato:

 
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 per ragioni di completezza:

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

E 'l'interruttore magazzino disponibilità in Magento che controlla il valore di ritorno di tutti i metodi di PHP, ma quando ordini arretrati a la quantità di magazzino scende al di sotto di 1, la disponibilità di magazzino verrà automaticamente reimpostata su "esaurito" (quindi le righe N/A).

risposta

-1

Vedo quelli con differenze semantiche. Un articolo che non è in magazzino può ancora essere vendibile se detto articolo è impostato per consentire ordini in arretrato.

Per quanto posso dire, sembra che isAvailable controlli un'istanza tipo di prodotto per vedere se il tipo di prodotto potrebbe essere in vendita se è davvero disponibile.

Così, ad azzardare un'ipotesi in cui è possibile scegliere uno sopra l'altro:

Se si sta verificando un singolo prodotto per vedere se tale prodotto è in realtà pronto per la vendita, si dovrebbe usare isSalable(), come sarà chiama isAvailable().

Per verificare se un prodotto (di cui non si conosce il tipo a portata di mano) potrebbe essere venduto, e suppongo che saltare la fase di controllo del tipo di prodotto, è possibile chiamare isAvailable() sul prodotto.

isAvailable() controlla se il tipo di un prodotto è vendibile.

isSalable() controlla se un prodotto è vendibile.

isSaleable() è uno pseudonimo di isSalable().

+1

Comprendo la differenza semantica tra l'avere qualcosa in magazzino e la possibilità di vendere qualcosa, ma non so ancora quale sia la differenza semantica tra isSaleable()/isSalable() e isAvailable(). Perché usarne uno sull'altro, quando in ogni situazione che posso pensare fanno la stessa cosa (vedi domanda modificata)? Dico "che posso pensare" perché vorrei sapere se ci sono situazioni che non ho pensato che potrebbero fare una distinzione tra questi metodi, perché ora ho la sensazione che uno di loro sia inutile, il che penso sia un po 'veloce per giudicare. – pancake

+0

Nella tua domanda modificata, hai scritto quando i backorder sono disattivati ​​e la quantità di stock scende sotto 1, la disponibilità di magazzino verrà automaticamente ripristinata a "esaurito" C'è anche una bandiera "stock_is_changed_automatically", che uso per mostrare articoli che sono (tecnicamente) non inventariati e che sono esplicitamente disponibili, ordini arretrati off e qty = 0 – elcash

+0

Queste sono informazioni utili, grazie per questo. Non voglio sembrare ingrato, ma non so ancora quando usare isSaleable e quando usare isAvailable, quando * sembrano * fare la stessa cosa. Attualmente sto costruendo un tema, quindi mi piacerebbe farlo bene. – pancake

-4

isAvailable() viene utilizzato per decidere se visualizzare il prodotto come in magazzino o esaurito, mentre isSaleable() viene utilizzato per decidere se mostrare un Aggiungi al carrello pulsante o no.

-3

Per quanto mi riguarda, isSaleable() significa che si sta verificando la maggior parte dei prodotti più pronti per la vendita. Mentre, isAvailable() significa che stai controllando il prodotto dagli elenchi disponibili.

2

isSaleable() Mentre si lavora con Magento Templates sicuramente inciampato su isSalable metodo() applicato a oggetto prodotto. Il metodo esiste fisicamente ma controlla solo se il prodotto ha abilitato lo stato e il controllo vendibile non deve essere saltato. Quindi viene restituita la proprietà is_salable dell'oggetto prodotto.

La domanda ovvia è quando questa proprietà è impostata. Dopo che il prodotto è stato caricato, è già impostato sul modello ma non è un attributo e non è una colonna nella tabella piatta del prodotto.

Come al solito, tutte le cose bizzarre di Magento sono fatte dagli osservatori. Mage_Cataloginventory sta osservando evento catalog_product_load_after e là si scende ad Mage_CatalogInventory_Model_Resource_Stock_Status :: getProductStatus e la seguente query:

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

E 'chiaramente visibile che la decisione se il prodotto è vendibile o non è fatto durante la reindicizzazione. E ignorare stock_id che è una sorta di funzionalità incompleta che verrà visualizzata anche in seguito.

Quindi siamo finiti in un posto in cui nessuno sviluppatore Magento volentieri andrà volentieri .. l'indicizzatore. Indicizzatore di inventario del catalogo nel nostro caso. Dopo un rapido viaggio nel labirinto di Mage_CatalogInventory_Model_Indexer_Stock :: _ processEvent, Mage_Index_Model_Indexer_Abstract :: reindexAll e Mage_CatalogInventory_Model_Resource_Indexer_Stock :: reindexScopriamo che ogni tipo di prodotto ha il proprio indicizzatore di azioni che risiede in app/code/core/Mage/CatalogInventory/Model/Resource/Indexer /Azione.

Ogni tipo ha un metodo _getStockStatusSelect in cui una query SQL decide infine se il prodotto è vendibile o meno. Anche se la query può sembrare massiccia, la logica dietro non è complicata.

La maggior parte del codice è di nuovo questa roba rudimentale. Sembra che gli sviluppatori principali abbiano fatto un buon tentativo per consentire di avere diversi livelli di scorte per diversi siti Web, ma per qualche motivo questa funzionalità non è mai stata completata.

Quindi, ad esempio, la verifica della disponibilità di magazzino di prodotti semplici contiene solo la verifica del fatto che il prodotto è abilitato e la quantità è ottimizzata con un indicatore di gestione delle scorte. Le query per prodotti configurabili e raggruppati variano leggermente a causa delle specifiche del tipo di prodotto.