2012-01-27 48 views
48

Tôi đang làm việc trên màn hình hiển thị của sự sẵn có cổ phiếu trên trang sản phẩm (cá nhân) của chủ đề Magento của tôi, và có một cái gì đó tôi không hoàn toàn hiểu về điều này.Sự khác nhau giữa isSaleable() và isAvailable() là gì?

tôi thấy hai phương pháp được sử dụng trong các mẫu để kiểm tra xem một sản phẩm có sẵn để bán:

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

phát hiện riêng của tôi:
Tôi thấy rằng isSalable() (mà lần lượt được gọi bởi isSaleable()) gọi isAvailable() nhưng cũng gửi hai sự kiện (catalog_product_is_salable_beforecatalog_product_is_salable_after).

Trên mặt trước, tôi nhận thấy rằng trong mẫu cơ sở của Magento isAvailable() được sử dụng để quyết định có hiển thị sản phẩm là "trong kho" hoặc "hết hàng" hay không; isSaleable() được sử dụng để quyết định điều gì đó giống như có hiển thị nút "Thêm vào giỏ hàng" hay không.

Trên chương trình phụ trợ, tôi nhận thấy rằng khi số lượng cổ phiếu trở thành 0 và quay lại là không phải là cho phép, tính sẵn có của sản phẩm được chuyển sang "hết hàng". Khi số lượng hàng tồn kho bằng 0 và ngược lại cho phép, tính sẵn có của một sản phẩm không thay đổi.

Câu hỏi:
Thuộc tính "tính sẵn có" và "số lượng cổ phiếu" rõ ràng được liên kết với nhau và các phương pháp PHP đã đề cập. Tôi muốn biết:

  • ngữ nghĩa sự khác biệt giữa các phương pháp PHP isAvailable()isSaleable() là gì và tại sao tôi sẽ sử dụng một trong khác;

  • những gì tôi xuất hiện chưa biết về mối quan hệ của họ với những thuộc tính này và hành vi của Magento.

Cảm ơn bạn.

EDIT:
Tôi đã thử mọi sự kết hợp có liên quan của số lượng cổ phiếu (-1,0,1), cổ phiếu sẵn có (in/out của) và backorders (on/off) cho một sản phẩm, và điều này là kết quả:

 
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 

Chỉ vì lợi ích của sự hoàn chỉnh:

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

đó là việc chuyển đổi cổ phiếu sẵn có trong Magento điều khiển giá trị trả về của tất cả các phương pháp PHP, nhưng khi backorders một tắt và số lượng cổ phiếu giảm xuống dưới 1, khả năng sẵn có của cổ phiếu sẽ tự động được đặt lại thành 'hết hàng' (do đó là N/A hàng).

Trả lời

-1

Tôi thấy những người có sự khác biệt ngữ nghĩa. Một mặt hàng không có trong kho vẫn có thể bán được nếu mặt hàng đó được đặt để cho phép backorders.

Theo như tôi có thể biết, có vẻ như isAvailable kiểm tra loại sản phẩm để xem loại sản phẩm có thể để bán nếu thực sự có sẵn.

Vì vậy, để mạo hiểm một đoán khi bạn có thể chọn một trong khác:

Nếu bạn đang kiểm tra một sản phẩm cá nhân để xem sản phẩm nói là thực sự sẵn sàng để bán, bạn nên sử dụng isSalable(), vì nó sẽ hãy gọi isAvailable().

Để kiểm tra xem sản phẩm (loại bạn không biết) có thể bán được không, và tôi cho rằng bỏ qua bước kiểm tra loại sản phẩm, bạn có thể gọi isAvailable() trên sản phẩm.

isAvailable() kiểm tra xem loại sản phẩm có thể bán được không.

isSalable() kiểm tra xem sản phẩm có được bán hay không.

isSaleable() là bí danh của isSalable().

+1

Tôi hiểu sự khác biệt ngữ nghĩa giữa việc có thứ gì đó trong kho và có thể bán thứ gì đó, nhưng tôi vẫn không biết sự khác biệt ngữ nghĩa giữa isSaleable()/isSalable() và isAvailable(). Tại sao lại sử dụng cái này qua cái kia, khi trong mọi tình huống mà tôi có thể nghĩ họ làm điều tương tự (xem câu hỏi đã chỉnh sửa)? Tôi nói "mà tôi có thể nghĩ đến" bởi vì tôi muốn biết nếu có những tình huống mà tôi chưa nghĩ đến có thể phân biệt giữa những phương pháp này, bởi vì bây giờ tôi có cảm giác một trong số đó là vô dụng, tôi nghĩ là một chút nhanh chóng để phán xét. – pancake

+0

Trong câu hỏi đã chỉnh sửa, bạn đã viết khi quay số bị tắt và số lượng cổ phiếu giảm xuống dưới 1, tính khả dụng của cổ phiếu sẽ tự động được đặt lại thành 'hết hàng' Ngoài ra còn có cờ 'stock_is_changed_automatically' các mục (về mặt kỹ thuật) không được kiểm kê, và rõ ràng là trong kho, backorders off, và qty = 0 – elcash

+0

Đó là thông tin hữu ích, cảm ơn bạn vì điều đó. Tôi không muốn có vẻ vô ơn, nhưng tôi vẫn không biết khi nào nên sử dụng isSaleable và khi nào thì sử dụng isAvailable, khi họ * dường như * làm điều tương tự. Tôi hiện đang xây dựng một chủ đề, vì vậy tôi muốn làm cho nó đúng. – pancake

-4

isAvailable() được sử dụng để quyết định có nên hiển thị các sản phẩm như trong kho hoặc hết hàng, trong khi isSaleable() được sử dụng để quyết định có nên hiển thị một Thêm vào giỏ hàng nút hay không.

-3

Theo như mối quan tâm của tôi, isSaleable() có nghĩa là bạn đang kiểm tra sản phẩm hàng đầu sẵn sàng để bán. Trong khi, isAvailable() có nghĩa là bạn đang kiểm tra sản phẩm từ danh sách có sẵn.

2

isSaleable() Khi làm việc với các mẫu Magento bạn chắc chắn gặp phải là phương thức Isalable() được áp dụng cho đối tượng sản phẩm. Phương pháp vật lý tồn tại nhưng nó chỉ kiểm tra nếu sản phẩm đã kích hoạt trạng thái và kiểm tra thương phẩm không nên bỏ qua. Sau đó, thuộc tính is_salable của đối tượng sản phẩm được trả về.

Câu hỏi hiển nhiên là khi thuộc tính này được đặt. Sau khi sản phẩm được tải, nó đã được thiết lập trên mô hình nhưng nó không phải là một thuộc tính và không phải là một cột trong bảng phẳng của sản phẩm.

Như thường lệ, tất cả các công cụ kỳ lạ trong Magento được thực hiện bởi các nhà quan sát. Mage_Cataloginventory được quan sát sự kiện catalog_product_load_after và có nó đi xuống đến Mage_CatalogInventory_Model_Resource_Stock_Status :: getProductStatus và truy vấn sau đây:

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

Đó là nhìn thấy rõ ràng rằng quyết định nếu sản phẩm là có thể bán được hoặc không được thực hiện trong reindexing. Và bỏ qua stock_id đó là loại chức năng chưa hoàn thành mà cũng sẽ bật ra sau đó.

Vì vậy, chúng tôi sẽ kết thúc ở một nơi không có nhà phát triển Magento lành mạnh nào sẽ sẵn sàng .. người lập chỉ mục. Trình chỉ mục khoảng không quảng cáo danh mục trong trường hợp của chúng tôi. Sau khi nhanh chóng đi qua mê cung của Mage_CatalogInventory_Model_Indexer_Stock :: _ processEvent, Mage_Index_Model_Indexer_Abstract :: reindexAll và Mage_CatalogInventory_Model_Resource_Indexer_Stock :: reindexTất cả chúng tôi phát hiện ra rằng mỗi loại sản phẩm có chỉ số chứng khoán riêng của nó, nằm trong app/code/core/Mage/CatalogInventory/Model/Resource/Indexer /Cổ phần.

Mỗi loại có phương thức _getStockStatusSelect trong đó truy vấn SQL cuối cùng cũng quyết định xem sản phẩm có được bán hay không. Mặc dù truy vấn có vẻ có vẻ logic lớn đằng sau không phức tạp.

Phần lớn mã ở đây lại là công cụ thô sơ này. Có vẻ như các nhà phát triển cốt lõi đã thực hiện một nỗ lực tốt để cho phép có mức cổ phiếu khác nhau cho các trang web khác nhau nhưng đối với một số lý do chức năng này chưa bao giờ kết thúc. Ví dụ:

Ví dụ: việc kiểm tra tính sẵn có của sản phẩm đơn giản chỉ chứa xác minh rằng sản phẩm được bật và số lượng được gia vị dương với cờ quản lý cổ phiếu. Các truy vấn cho các sản phẩm được cấu hình và được nhóm lại khác nhau một chút do các loại sản phẩm cụ thể.

Các vấn đề liên quan