is_salable đến từ đâu?


27

Lưu ý: Nếu bạn đã chỉnh sửa sản phẩm bằng mã PHP, sau đó lập chỉ mục lại chúng trong quản trị viên, hãy tiết kiệm thời gian của bạn để cố gắng tìm ra lý do tại sao chúng không hiển thị như tôi bên dưới ...

Tôi đang đi vòng tròn trong các vòng tròn cố gắng tìm ra cách is_salablethiết lập cho một sản phẩm, và do đó tìm ra lý do tại sao các sản phẩm của tôi hiện đang hiển thị.

Chỉ có một nơi trong mã tôi có thể tìm thấy nó đặt:

$salable = $this->isAvailable();

nhưng tôi không thể tìm ra làm thế nào hoặc từ đâu có được điều này, vì khi tôi làm theo isAvailablenó dường như lặp lại xung quanh ....

/app/code/core/Mage/Catalog/Model/ Productt.php

    public function isSalable()
    {
        Mage::dispatchEvent('catalog_product_is_salable_before', array(
            'product'   => $this
        ));

        $salable = $this->isAvailable();

    $object = new Varien_Object(array(
        'product'    => $this,
        'is_salable' => $salable
    ));
    Mage::dispatchEvent('catalog_product_is_salable_after', array(
        'product'   => $this,
        'salable'   => $object
    ));
    return $object->getIsSalable();
}

theo $ this-> isAv Available () từ đây, nó đi một vài dòng:

**public function isAvailable()
{ 
    return $this->getTypeInstance(true)->isSalable($this);
}**

sau đó gọi ứng dụng / code / core / Mage / Catalog / Model / Product / Type / Configurable.php's isSalable

public function isSalable($product = null)
{
    $salable = parent::isSalable($product);

    if ($salable !== false) {
        $salable = false;
        if (!is_null($product)) {
            $this->setStoreFilter($product->getStoreId(), $product);
        }
        foreach ($this->getUsedProducts(null, $product) as $child) {
            if ($child->isSalable()) {
                $salable = true;
                break;
            }
        }
    }

    return $salable;
}

mà gọi cha mẹ: /app/code/core/Mage/Catalog/Model/Sản phẩm / Type / Abauge.php's isSalable:

public function isSalable($product = null)
{
    $salable = $this->getProduct($product)->getStatus() == Mage_Catalog_Model_Product_Status::STATUS_ENABLED;
    if ($salable && $this->getProduct($product)->hasData('is_salable')) {
        $salable = $this->getProduct($product)->getData('is_salable');
    }
    elseif ($salable && $this->isComposite()) {
        $salable = null;
    }

    return (boolean) (int) $salable;
}

mà chỉ có một cuộc gọi có / nhận dữ liệu trên giá trị is_salizable?!? Tôi đã theo dõi điều đó phải không? Giá trị này đến từ đâu?

Tôi đã ban hành một grep đệ quy trên bản cài đặt của mình cho is_salable, chắc chắn điều này sẽ hiển thị bất kỳ dòng nào được đặt nhưng tôi không thấy bất kỳ dòng nào ngay lập tức:

grep -r is_salable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:            $object = new Varien_Object(array('is_in_stock' => $product->getData('is_salable')));
app/code/core/Mage/XmlConnect/Block/Wishlist.php:                $itemXmlObj->addChild('is_salable', (int)$item->getProduct()->isSalable());
app/code/core/Mage/XmlConnect/Block/Catalog/Product.php:            $item->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', 0);
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_before', array(
app/code/core/Mage/Catalog/Model/Product.php:            'is_salable' => $salable
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_after', array(
app/code/core/Mage/Catalog/Model/Product.php:        if ($this->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product.php:            return $this->getData('is_salable');
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:        if ($salable && $this->getProduct($product)->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:            $salable = $this->getProduct($product)->getData('is_salable');

TÌM:

grep -r setIsSalable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:        $product->setIsSalable($stockStatus);
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:                    $product->setIsSalable($status);

Đó là setIsSalable mà tôi không nghĩ / biết để tìm kiếm hơn là chỉ setIsSalable .

Câu trả lời:


18

isAvailable() trông như thế này:

public function isAvailable()
{
    return $this->getTypeInstance(true)->isSalable($this)
        || Mage::helper('catalog/product')->getSkipSaleableCheck();
}

Điều này có nghĩa là kết quả của phương pháp phụ thuộc vào loại sản phẩm.
Mỗi loại sản phẩm có một isSalable()phương pháp:

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() - cho các sản phẩm được nhóm
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() - cho các sản phẩm cấu hình
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()- cho phần còn lại của các loại sản phẩm vì tất cả các loại sản phẩm mở rộng Mage_Catalog_Model_Product_Type_Abstract.
    Tôi nghĩ rằng cuộc gọi $this->getTypeInstance(true)làm bạn bối rối. Phương thức getTypeInstance()này không trả về một thể hiện của mô hình sản phẩm, mà là một thể hiện của một loại sản phẩm.

[EDIT]
Đối với một sản phẩm đơn giản, điều này được gọi là Mage_Catalog_Model_Product_Type_Grouped::isSalable(). Phương pháp này kiểm tra nếu sản phẩm được kích hoạt. Nếu không thì falseđược trả lại. Nếu nó được bật, thì nó sẽ kiểm tra xem nó có thuộc tính is_salablecó thể được đặt bởi một trong những người quan sát của bạn không.
Nếu nó không có thuộc tính như vậy thì nó sẽ kiểm tra nếu loại sản phẩm $this->isComposite(). Nếu có thì nó không thể bán được.
Đối với các sản phẩm có thể định cấu hình, nó sẽ kiểm tra xem các điều kiện trên có được đáp ứng hay không và nếu có một sản phẩm đơn giản liên quan đến sản phẩm có thể định cấu hình có thể bán được (Một lần nữa với các điều kiện ở trên)
Điều tương tự được thực hiện cho sản phẩm được nhóm nhưng theo một cách khác.

Trong kết luận is_salablekhông phải tồn tại. Nhưng chỉ trong trường hợp bạn có một người quan sát đặt tài sản đó, nó sẽ được xem xét khi kiểm tra xem sản phẩm có thể được bán hay không.
Đây là một ví dụ từ cốt lõi: Phương thức Mage_CatalogInventory_Model_Stock_Status::assignProduct()cals $product->setIsSalable()
Tương tự như vậy Mage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts.
Người cuối cùng được gọi bởi sự kiện này catalog_product_collection_load_after.


cảm ơn rất nhiều vì sự giúp đỡ của bạn một lần nữa, tôi đã truy tìm isAvable to isSalable và to Configurable.php's isSalable mà chỉ gọi là ispalable của Abstract.php nhưng tất cả chỉ là kiểm tra 'is_salable' nhưng tôi không tìm thấy cài đặt nào của nó ?? tôi sẽ thêm dấu vết mã của tôi ở trên.
Hayden Thring

thêm vào câu hỏi của tôi
Hayden Thring

2
Có, có. Tôi đã đề cập đến nó trong câu trả lời của tôi catalog_product_collection_load_after. Nhưng đây chỉ là một ví dụ. Cũng có cataloginventory/observer::addInventoryDatanhững cuộc gọi assignProductmà bộ is_salable. Có thể có những người khác nhưng tôi đã không tìm kiếm tất cả.
Marius

1
Tôi không có phương pháp đáng tin cậy để làm điều này. Có thể nhận được tất cả các sự kiện bắt đầu catalog_product_và gỡ lỗi các phương thức được gọi bởi các nhà quan sát về các sự kiện đó. và xem nếu một người gọi setIsSalablehoặcsetData('is_salable')
Marius

1
XmlConnect cho phép bạn kết nối ứng dụng di động của bạn với trang web của bạn. Đừng để ý đến nó.
Marius


0

Nếu sau khi reindexing và gỡ lỗi là không thể kết thúc và sản phẩm có thể định cấu hình của bạn vẫn hiển thị là hết hàng, hãy đảm bảo tất cả các trạng thái đơn giản đều được đặt thành Đã bật, trong TẤT CẢ các chế độ xem của cửa hàng. Tôi chỉ lãng phí hai giờ để tự hỏi tại sao một cấu hình đã hết hàng cho dù tôi có làm gì, cho đến khi tôi kiểm tra tất cả các lượt xem cửa hàng và phát hiện ra một số cơ thể đã vô hiệu hóa trạng thái.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.