2010-03-18 20 views
8

Estoy usando un cron para importar los cambios de inventario todas las noches. Cuando trato de cambiar la información de un producto (precio, etc.) me sale el siguiente error:Magento: reconstruir el catálogo plano mediante programación

Column not found: 1054 Unknown column 'e.display_price_group_0' in 'field list' 

puedo solucionar este problema haciendo clic en "Volver a generar catálogo plana del producto" en el panel de administración del caché. I fijó un cron para hacerlo mediante programación utilizando el código siguiente:

Mage :: getResourceModel('catalog/product_flat_indexer') -> rebuild(); 

que no reciben ningún error al ejecutar la secuencia de comandos, pero la "columna no encontrado" error persiste.

¿Alguien sabe cómo puedo reconstruir el catálogo plano que no sea a través de la interfaz de administración?

Respuesta

4

anterior me dijeron que hacer esto:

Mage::getModel('catalog/product_flat_indexer')->rebuild(); 
Note: it's getModel and NOT getResourceModel. 

Esto no es cierto. Cualquiera de los dos funciona Sin embargo, he encontrado a través de un proceso bastante doloroso de prueba y error que las tablas de productos planos no se reconstruyen correctamente a menos que también reconstruya todo el catálogo. Así es como finalmente resolví mi problema:

Mage::getSingleton('catalog/index')->rebuild(); 
Mage::getResourceModel('catalog/product_flat_indexer')->rebuild(); 
Mage::getSingleton('catalog/url')->refreshRewrites(); 
Mage::getModel('catalog/product_image')->clearCache(); 
Mage::getSingleton('catalogsearch/fulltext')->rebuildIndex(); 
Mage::getSingleton('cataloginventory/stock_status')->rebuild(); 
$flag = Mage::getModel('catalogindex/catalog_index_flag')->loadSelf(); 
if ($flag->getState() == Mage_CatalogIndex_Model_Catalog_Index_Flag::STATE_RUNNING) { 
    $kill = Mage::getModel('catalogindex/catalog_index_kill_flag')->loadSelf(); 
    $kill->setFlagData($flag->getFlagData())->save(); 
} 
$flag->setState(Mage_CatalogIndex_Model_Catalog_Index_Flag::STATE_QUEUED)->save(); 
Mage::getSingleton('catalogindex/indexer')->plainReindex(); 

Básicamente, simplemente reconstruye todo. No te preocupes por la optimización. Como alguien dijo una vez, "la optimización prematura es la raíz de todo mal".

1

Ver esto script. Personalmente tuve algunos problemas con esto, pero otros parecen estar bastante contentos con eso.
Si no quiere todo, puede extraer fácilmente la pieza que reconstruye el producto de catálogo plano y apuntar un trabajo cron en él.

+0

Este es el script del que obtuve el código anterior. No parece estar funcionando para mí. – karnage

+0

Laizer, fue su problema que recibió el error "excepción" Zend_Db_Statement_Exception con el mensaje 'SQLSTATE [42S22]: columna no encontrada: 1054 columna desconocida' e.display_price_group_0 'en' lista de campo '' en/var/www/releases/20101019/lib/Zend/Db/Statement/Pdo.php: 238 "al actualizar productos después de haber reconstruido el catálogo plano? Si es así, ¿cómo lo arreglaste? ¡Gracias! – fdierre

+0

Miedo de que no pueda ayudarte aquí. No creo haber visto ese problema. – Laizer

0

Tampoco puedo hacer que funcione correctamente.

Cuando reconstruir el catálogo de producto plano de la administración reconstruirlo funciona bien y no consigo el error columna de SQL, pero cuando lo hago mediante programación no funciona por medio de:

Mago :: getResourceModel ('catalog/product_flat_indexer') -> rebuild();

+0

Me alegra saber que no soy el único, pensé que estaba perdiendo la cabeza. – karnage

1
* Rebuild Catalog Index 

    Mage::getSingleton('catalog/index')->rebuild(); 

* Rebuild Flat Catalog Product 

    Mage::getResourceModel('catalog/product_flat_indexer')->rebuild(); 

* Inventory Stock 

    Mage::getSingleton('cataloginventory/stock_status')->rebuild(); 
2

Descubrí que hay una manera más eficiente de actualizar solo atributos de productos específicos.

Mage::getModel('catalog/product_flat_indexer')->updateAttribute($attributeCode, null, $productIds); 

O puede actualizar el producto completo en la tabla plana:

Mage::getModel('catalog/product_flat_indexer')->updateProduct($productIds, null); 

Donde $ productIds es una matriz de los identificadores de entidad de producto para actualizar. Estas funciones también actualizarán otros datos indexados relacionados con los productos que actualice. Espero que esto ayude.

0

Acabo de escribir este código, basado en el script reindex de Shell. Lo he probado en Magento 1.5.1 usando un script web (con long_execution_time largo).

if (!empty($_SERVER['HTTP_HOST'])) 
{ 
    header('Content-Type: text/plain'); 
}  

$oIndexer = Mage::getSingleton('index/indexer');    
/* @var $oIndexer Mage_Index_Model_Indexer */ 
$oProcessCollection = $oIndexer->getProcessesCollection(); 
/* @var $oProcessCollection Mage_Index_Model_Mysql4_Process_Collection */ 

foreach ($oProcessCollection as $oProcess) 
{ 
    /* @var $oProcess Mage_Index_Model_Process */ 
    echo 'Rebuilding ' . $oProcess->getIndexer()->getName() . ' index...'; 
    outputFlush(); 
    $oProcess->reindexEverything(); 
} 

echo 'Done.'; 
outputFlush() 

function outputFlush() 
{ 
    while (ob_get_length()) 
    { 
     ob_end_flush(); 
    } 
    if (!empty($_SERVER['HTTP_HOST'])) 
    { 
     echo str_repeat(' ',4096); 
    } 
    echo "\n"; 
    flush(); 
} 
1
public function rebuildIndexes(){ 
    $processes = array(); 
    $collection = Mage::getSingleton('index/indexer')->getProcessesCollection(); 
    foreach ($collection as $process) { 
     try { 
      $process->reindexEverything(); 
      $this->_message($process->getIndexer()->getName() . " index was rebuilt successfully"); 
     } catch (Mage_Core_Exception $e) { 
      $this->_throwException($e->getMessage()); 
     } catch (Exception $e) { 
      $this->_throwException($process->getIndexer()->getName() . " index process unknown error:\n" . $e); 
     } 
    } 
} 

la gente por qué usted no investigar un poco antes de post somethig que no funciona, abra la cáscara/indexer.php, dentro encontrarás todas las respuestas relacionadas con la indexación.

Cuestiones relacionadas