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_salable
diatur 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 isAvailable
sepertinya 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 .
catalog_product_collection_load_after
. Tapi ini hanya sebuah contoh. Ada juga yang mengaturcataloginventory/observer::addInventoryData
panggilan . Mungkin ada yang lain, tetapi saya tidak mencari semuanya.assignProduct
is_salable
catalog_product_
dan debug metode yang dipanggil oleh pengamat pada acara tersebut. dan lihat apakah ada yang meneleponsetIsSalable
atausetData('is_salable')
jika Salable return false, Reindexing juga dapat memiliki masalah reindex data
sumber
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.
sumber