Nota: Si ha estado editando productos por código PHP, vuelva a indexarlos en el administrador después, ahorre sus horas tratando de averiguar por qué no se muestran como yo a continuación ...
Estoy dando vueltas en círculos tratando de averiguar cómo is_salable
se configura un producto, y así averiguar por qué mis productos ahora se muestran.
Solo hay un lugar en el código que puedo encontrar que lo establece:
$salable = $this->isAvailable();
pero no puedo entender cómo o de dónde viene esto, ya que cuando lo sigo isAvailable
parece dar vueltas ...
/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();
}
siguiendo $ this-> isAvailable () desde aquí van unas pocas líneas:
**public function isAvailable()
{
return $this->getTypeInstance(true)->isSalable($this);
}**
Esto luego llama a app / 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;
}
que llama al padre: /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;
}
que solo hace una llamada de datos has / get en el valor is_saleable ¿Lo rastreé bien? ¿De dónde viene este valor?
Emití un grep recursivo en mi instalación para is_salable, seguramente esto debería mostrar las líneas donde está configurado, pero no veo ninguna de inmediato:
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');
ENCONTRÓ:
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);
Era setIsSalable que no pensé / sabía buscar en lugar de simplemente setIsSalable .
catalog_product_collection_load_after
. Pero esto es solo un ejemplo. También existecataloginventory/observer::addInventoryData
esa llamadaassignProduct
que estableceis_salable
. Podría haber otros, pero no busqué todos.catalog_product_
y depure los métodos llamados por los observadores en esos eventos. y ver si uno llamasetIsSalable
osetData('is_salable')
si es vendible devuelve falso, Reindexing también puede tener problemas reindexar los datos
fuente
Si después de reindexar y depurar no se puede cerrar y su producto configurable todavía se muestra como agotado, asegúrese de que todos los simples tengan el estado establecido en Habilitado, en TODAS las vistas de la tienda. Solo perdí dos horas preguntándome por qué un configurable estaba agotado sin importar lo que hiciera, hasta que revisé todas las vistas de la tienda y descubrí que algún cuerpo había desactivado el estado.
fuente