2010-03-18 13 views
8

Ich benutze einen Cron, um Inventaränderungen jede Nacht zu importieren. Wenn ich versuche, ein Produkt der Informationen (Preis, etc) ändern ich die folgende Fehlermeldung erhalten:Magento: Flat-Katalog programmatisch neu erstellen

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

Ich kann dieses Problem beheben, indem „Rebuild Wohnung Katalog Produkt“ in dem Cache-Management-Panel klicken. Ich Setup eine cron dieses programmatisch zu tun mit dem folgenden Code:

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

ich keine Fehler bekommt, wenn ich das Skript ausführen, aber die „Spalte nicht gefunden“ Fehler bestehen bleiben.

Weiß jemand, wie ich den flachen Katalog anders als durch die Verwaltungsschnittstelle neu erstellen kann?

Antwort

4

zurück, sagte ich, dies zu tun:

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

Das ist nicht wahr. Entweder funktioniert. Ich habe jedoch durch einen ziemlich schmerzhaften Trial-and-Error-Prozess herausgefunden, dass die flachen Produkttabellen nicht korrekt neu erstellt werden, wenn ich nicht auch den gesamten Katalog neu aufbaut. So löste ich mein Problem endlich:

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

Im Grunde nur alles neu erstellen. Mach dir keine Sorgen über die Optimierung. Wie jemand einmal sagte: "Vorzeitige Optimierung ist die Wurzel allen Übels."

1

Siehe hierzu script. Ich persönlich hatte einige Probleme damit, aber andere scheinen sehr zufrieden damit zu sein.
Wenn Sie nicht die ganze Sache wollen, können Sie leicht das Teil herausziehen, das das flache Katalogprodukt umbaut und einen cron Job darauf zeigt.

+0

Dies ist das Skript, von dem ich den obigen Code erhalten habe. Es scheint nicht für mich zu funktionieren. – karnage

+0

Laizer, war Ihr Problem, dass Sie den Fehler "Ausnahme 'Zend_Db_Statement_Exception' mit der Nachricht 'SQLSTATE [42S22]: Spalte nicht gefunden: 1054 Unbekannte Spalte' e.display_price_group_0 'in' Feldliste '' in/var/www/releases/20101019/lib/Zend/Db/Statement/Pdo.php: 238 "beim Aktualisieren von Produkten nach dem Neuaufbau des Flat-Katalogs? Wenn ja, wie hast du es behoben? Vielen Dank! – fdierre

+0

Angst, ich kann dir hier nicht helfen. Ich glaube nicht, dass ich jemals dieses Thema gesehen habe. – Laizer

0

Ich kann es auch nicht richtig funktionieren.

Als ich die Flat-Katalog Produkt aus der Admin es funktioniert gut und ich nicht bekommen, die SQL-Spalte Fehler Rebuild wieder aufbauen, aber wenn ich es tun programmatisch funktioniert es nicht über:

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

+0

Ich bin froh zu wissen, dass ich nicht der Einzige bin, ich dachte, ich würde meinen Verstand verlieren. – 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

Ich habe festgestellt, dass es eine effizientere Möglichkeit gibt, nur bestimmte Produktattribute zu aktualisieren.

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

Oder Sie können das gesamte Produkt in der flachen Tabelle aktualisieren:

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

Wo $ productIds ist ein Array der Ide Produktentität zu aktualisieren. Diese Funktionen aktualisieren auch andere indizierte Daten in Bezug auf die von Ihnen aktualisierten Produkte. Hoffe das hilft.

0

Ich habe gerade diesen Code geschrieben, basierend auf dem Shell-Reindex-Skript. Ich habe es in Magento 1.5.1 mit einem Web-Skript (mit langer max_execution_time) getestet.

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

Leute, warum Sie nicht die Forschung ein wenig vor Post somethig, das nicht funktioniert, öffnen Sie die Shell/indexer.php, in dir alle Antworten auf die Indizierung im Zusammenhang finden.

Verwandte Themen