dari mana is_salable berasal?

27

Catatan: Jika Anda telah mengedit produk dengan kode PHP, kemudian mengindeks ulang mereka di admin setelahnya, simpan waktu Anda untuk mencoba mencari tahu mengapa mereka tidak muncul seperti saya di bawah ini ...

Saya berputar-putar mencoba untuk mencari tahu bagaimana is_salablediatur untuk suatu produk, dan dengan demikian mencari tahu mengapa produk saya sekarang ditampilkan.

Hanya ada satu tempat dalam kode yang dapat saya temukan yang mengaturnya:

$salable = $this->isAvailable();

tapi saya tidak bisa mengetahui bagaimana atau dari mana mendapatkan ini dari, karena ketika saya mengikutinya isAvailablesepertinya berputar kembali ....

/app/code/core/Mage/Catalog/Model/Product.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();
}

mengikuti $ this-> isAvailable () dari sini ada beberapa baris:

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

ini kemudian memanggil app / code / core / Mage / Katalog / Model / Produk / Jenis / Configurable.php 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;
}

yang memanggil induk: /app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php's isalable:

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

yang mana panggilan data get / get pada nilai is_saleable?!? Apakah saya melacaknya dengan benar? Dari mana nilai ini berasal?

Saya mengeluarkan grep rekursif pada instalasi saya untuk is_salable, pasti ini akan menunjukkan baris mana pun yang sudah diatur tetapi saya tidak langsung melihat:

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

DITEMUKAN:

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

Itu setIsSalable bahwa saya tidak berpikir / tahu untuk mencari daripada hanya setIsSalable .

Hayden Thring
sumber

Jawaban:

18

isAvailable() terlihat seperti ini:

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

Ini berarti bahwa hasil dari metode tergantung pada jenis produk.
Setiap jenis produk memiliki isSalable()metode:

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() - untuk produk yang dikelompokkan
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() - untuk produk yang dapat dikonfigurasi
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()- untuk sisa jenis produk karena semua jenis produk diperluas Mage_Catalog_Model_Product_Type_Abstract.
    Saya pikir panggilan itu $this->getTypeInstance(true)membingungkan Anda. Metode getTypeInstance()ini tidak mengembalikan contoh model produk, tetapi contoh jenis produk.

[EDIT]
Untuk produk sederhana ini disebut Mage_Catalog_Model_Product_Type_Grouped::isSalable(). Metode ini memeriksa apakah produk diaktifkan. Jika tidak maka falsedikembalikan. Jika diaktifkan, maka ia memeriksa apakah ia memiliki properti is_salableyang dapat diatur oleh salah satu pengamat Anda.
Jika tidak memiliki properti seperti itu maka akan memeriksa apakah jenis produk contoh $this->isComposite(). Jika demikian maka itu tidak laku.
Untuk produk yang dapat dikonfigurasi memeriksa apakah kondisi di atas terpenuhi dan jika ada produk sederhana yang terkait dengan yang dapat dikonfigurasi yang dapat dijual (Lagi-lagi dengan kondisi di atas)
Hal yang sama dilakukan untuk produk yang dikelompokkan tetapi dengan cara yang berbeda.

Kesimpulannya is_salabletidak harus ada. Tapi kalau-kalau Anda memiliki pengamat yang menetapkan bahwa properti itu dipertimbangkan ketika memeriksa apakah produk dapat dijual.
Berikut ini adalah contoh dari inti: Metode Mage_CatalogInventory_Model_Stock_Status::assignProduct()cals $product->setIsSalable()
Sama berlaku untuk Mage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts.
Yang terakhir dipanggil oleh acara tersebut catalog_product_collection_load_after.

Marius
sumber
terima kasih banyak atas bantuan Anda lagi, saya telah melacak isAvailable untuk isSalable dan untuk Configurable.php's isSalable yang hanya memanggil Abstract.php isSalable tetapi semua itu adalah memeriksa 'is_salable' tetapi saya tidak menemukan pengaturan itu ?? saya akan menambahkan jejak kode saya di atas.
Hayden Thring
ditambahkan ke pertanyaan saya
Hayden Thring
2
Ya ada. Saya menyebutkannya dalam jawaban saya catalog_product_collection_load_after. Tapi ini hanya sebuah contoh. Ada juga yang mengatur cataloginventory/observer::addInventoryDatapanggilan . Mungkin ada yang lain, tetapi saya tidak mencari semuanya. assignProductis_salable
Marius
1
Saya tidak memiliki metode yang dapat diandalkan untuk melakukan ini. Mungkin dapatkan semua acara yang dimulai dengan catalog_product_dan debug metode yang dipanggil oleh pengamat pada acara tersebut. dan lihat apakah ada yang menelepon setIsSalableatausetData('is_salable')
Marius
1
XmlConnect memungkinkan Anda untuk menghubungkan aplikasi seluler Anda ke situs web Anda. Abaikan itu.
Marius
2

jika Salable return false, Reindexing juga dapat memiliki masalah reindex data

Hassan Ali Shahzad
sumber
0

Jika setelah pengindeksan ulang dan debugging is_salable hingga akhir dan produk Anda yang dapat dikonfigurasi masih menunjukkan kehabisan stok, pastikan semua simpel memiliki status yang disetel ke Diaktifkan, di SEMUA tampilan toko. Saya hanya membuang-buang waktu dua jam untuk bertanya-tanya mengapa yang bisa dikonfigurasi sudah habis tidak peduli apa yang saya lakukan, sampai saya memeriksa semua tampilan toko dan menemukan beberapa tubuh telah menonaktifkan status.

David Tay
sumber