Magento: восстановление плоского каталога программно - PullRequest
8 голосов
/ 18 марта 2010

Я использую cron для импорта изменений инвентаря по ночам. Когда я пытаюсь изменить информацию о продукте (цену и т. Д.), Я получаю следующую ошибку:

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

Я могу это исправить, щелкнув «Перестроить продукт плоского каталога» на панели «Управление кэшем». Я установил cron для этого программно, используя следующий код:

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

Я не получаю никаких ошибок при запуске сценария, но ошибка «Столбец не найден» сохраняется.

Кто-нибудь знает, как я могу перестроить плоский каталог, кроме как через интерфейс администратора?

Ответы [ 7 ]

4 голосов
/ 28 января 2011

Предыдущий я сказал сделать это:

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

Это не правда. Либо работает. Тем не менее, я обнаружил, что через довольно трудный процесс проб и ошибок плоские таблицы продуктов не восстанавливаются правильно, если я не перестроил весь каталог. Вот как я наконец решил свою проблему:

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

По сути, просто перестройте все. Не беспокойтесь об оптимизации. Как кто-то однажды сказал: «Преждевременная оптимизация - корень всего зла».

3 голосов
/ 14 декабря 2011

Я обнаружил, что есть более эффективный способ обновления только определенных атрибутов продукта.

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

Или вы можете обновить весь продукт на плоском столе:

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

Где $ productIds - это массив идентификаторов сущностей продукта для обновления. Эти функции также обновят другие проиндексированные данные, относящиеся к продуктам, которые вы обновляете. Надеюсь, это поможет.

1 голос
/ 07 мая 2012
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);
        }
    }
}

люди, почему бы вам немного не исследовать, прежде чем публиковать что-то, что не работает, откройте shell / indexer.php, внутри вы найдете все ответы, связанные с индексацией.

1 голос
/ 13 октября 2011
* 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();
1 голос
/ 19 марта 2010

См. скрипт . У меня лично были некоторые проблемы с этим, но другие, кажется, вполне довольны этим.
Если вы не хотите всего этого, вы можете легко извлечь часть, которая перестраивает плоский каталог, и указать на нее задание cron.

0 голосов
/ 17 апреля 2012

Я только что написал этот код на основе сценария переиндексации Shell. Я протестировал его в Magento 1.5.1 с помощью веб-скрипта (с длинным 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();
}
0 голосов
/ 29 марта 2010

Я тоже не могу заставить его работать правильно.

Когда я перестраиваю продукт Rebuild Flat Catalog от Admin, он работает нормально, и я не получаю ошибку столбца SQL, но когда я делаю это программно, он не работает через:

Mage :: getResourceModel ( 'Каталог / product_flat_indexer') -> восстановить ();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...