Примечание. Если вы редактировали продукты с помощью PHP-кода, то после этого переиндексируйте их в админке, сэкономьте собственные часы, пытаясь понять, почему они не отображаются, как я ниже ...
Я хожу по кругу, пытаясь понять, как is_salable
устроен продукт, и, таким образом, понять, почему мои продукты сейчас показывают.
Я могу найти только одно место в коде, которое устанавливает его:
$salable = $this->isAvailable();
но я не могу понять, как и откуда он получает это, потому что когда я следую, isAvailable
кажется, что все возвращается назад ...
/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();
}
после $ this-> isAvailable () отсюда идет несколько строк:
**public function isAvailable()
{
return $this->getTypeInstance(true)->isSalable($this);
}**
это тогда вызывает приложение / код / ядро / Маг / Каталог / Модель / Продукт / Тип / 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;
}
который вызывает родителя: /app/code/core/Mage/Catalog/Model/Product/Type/Abstract.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;
}
который просто выполняет вызов has / get для значения is_saleable?!? Я правильно это отследил? Откуда эта ценность?
Я выполнил рекурсивный grep для моей установки для is_salable, конечно, это должно показать все строки, где оно установлено, но я не вижу сразу:
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');
НАШЕЛ:
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);
Было установлено SetIsSalable, что я не думал / не знал, чтобы искать, а не просто setIsSalable .
catalog_product_collection_load_after
. Но это всего лишь пример. Существует также,cataloginventory/observer::addInventoryData
что звонки,assignProduct
которые устанавливаетis_salable
. Могли быть и другие, но я не искал всех.catalog_product_
и отладить методы, вызываемые наблюдателями для этих событий. и посмотреть, если один звонитsetIsSalable
илиsetData('is_salable')
Если Salable возвращает false, то при переиндексации также может возникнуть проблема переиндексации данных.
источник
Если после переиндексации и отладки is_salable без конца и ваш конфигурируемый продукт все еще показывает, что его нет в наличии, убедитесь, что все простые имеют статус «Включено» во всех представлениях магазина. Я просто потратил два часа на размышления о том, почему конфигурируемый товар отсутствует на складе, независимо от того, что я сделал, пока я не проверил все представления магазина и не обнаружил, что какое-то тело отключило статус.
источник