2010-03-18 4 views
8

J'utilise un cron pour importer les changements d'inventaire tous les soirs. Lorsque je tente de modifier les informations d'un produit (prix, etc) Je reçois l'erreur suivante:Magento: Reconstruire le catalogue de plat par programme

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

Je peux résoudre ce problème en cliquant sur « Reconstruire cataloguée plat » dans le panneau de gestion du cache. Je configurer un cron pour le faire en utilisant le code suivant programme:

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

Je n'avoir aucune erreur quand je lance le script, mais la colonne « not found » erreur persiste.

Est-ce que quelqu'un sait comment je peux reconstruire le catalogue plat autre que par l'intermédiaire de l'interface d'administration?

Répondre

4

précédente J'ai dit de le faire:

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

Ce n'est pas vrai. L'un ou l'autre fonctionne. Cependant, j'ai trouvé à travers un processus d'essai et d'erreur plutôt douloureux que les tables de produits plats ne reconstruisent pas correctement à moins que je reconstruis aussi le catalogue entier. Voici comment j'ai finalement résolu mon problème:

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

Fondamentalement, reconstruisez juste tout. Ne vous inquiétez pas de l'optimisation. Comme quelqu'un l'a déjà dit, "l'optimisation prématurée est la racine de tout mal".

1

Voir ceci script. Personnellement, j'ai eu quelques problèmes avec, mais d'autres semblent être très heureux avec cela.
Si vous ne voulez pas tout cela, vous pouvez facilement extraire la partie qui reconstruit le produit de catalogue plat et y pointer un travail cron.

+0

C'est le script que je suis le code ci-dessus de. Cela ne semble pas fonctionner pour moi. – karnage

+0

Laizer, était votre problème que tu as l'erreur « exception 'Zend_Db_Statement_Exception' message 'SQLSTATE [42S22]: colonne non trouvée: 1054 Unknown column 'e.display_price_group_0' dans 'liste des champs'' dans/var/www/Communiqués de presse/20101019/lib/Zend/Db/Déclaration/Pdo.php: 238" lors de la mise à jour des produits après avoir reconstruit le catalogue plat? Si oui, comment l'avez-vous réparé? Merci! – fdierre

+0

Peur je ne peux pas vous aider ici. Je ne pense pas avoir déjà vu ce problème. – Laizer

0

Je ne peux pas non plus le faire fonctionner correctement.

Quand je Relancez la recréation cataloguée plat de l'administrateur, il fonctionne très bien et je ne reçois pas l'erreur de la colonne SQL, mais quand je le fais programme ne fonctionne pas via:

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

+0

Je suis heureux de savoir que je ne suis pas le seul, je pensais que je perdais mon esprit. – 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

J'ai découvert qu'il existe un moyen plus efficace de mettre à jour uniquement des attributs de produit spécifiques.

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

Ou vous pouvez mettre à jour le produit entier dans la table à plat:

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

Où $ productIds est un tableau des ids d'entité de produit à mettre à jour. Ces fonctions mettront également à jour d'autres données indexées relatives aux produits que vous mettez à jour. J'espère que cela t'aides.

0

Je viens d'écrire ce code, basé sur le script reindex Shell. Je l'ai testé dans Magento 1.5.1 en utilisant un script web (avec max_execution_time).

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

personnes pourquoi ne pas vous la recherche un peu avant somethig post qui ne fonctionne pas, ouvrez le shell/indexer.php, à l'intérieur, vous trouverez toutes les réponses liées à l'indexation.

Questions connexes