2010-03-18 6 views
8

밤마다 재고 변경 사항을 가져 오기 위해 cron을 사용하고 있습니다. 나는 제품의 정보 (가격 등) 나는 다음과 같은 오류를 변경하려고하면 :Magento : 프로그래밍 방식으로 플랫 카탈로그 재구성

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

나는 캐시 관리 패널에서 "플랫 카탈로그의 제품을 재 구축"를 클릭하여이 문제를 해결할 수 있습니다. 내가 설정 크론 프로그래밍 다음 코드를 사용하여이 작업을 수행 : 나는 스크립트를 실행할 때

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

내가 오류를 얻을하지 않습니다,하지만 "열을 찾을 수 없습니다"오류가 지속됩니다.

관리자 인터페이스를 통해 플랫 카탈로그를 다시 작성하는 방법을 아는 사람이 있습니까?

답변

4

이전 나는 이렇게 말했다 :

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

기본적으로 모든 것을 다시 작성하십시오. 최적화에 대해 걱정하지 마십시오. 누군가가 말했듯이 "조기 최적화는 모든 악의 뿌리입니다."

1

이 부분은 script입니다. 나는 개인적으로 그것에 문제가 있었지만 다른 것들은 그것에 상당히 만족스러워 보입니다.
모든 것을 원하지 않는다면 플랫 카탈로그 제품을 다시 빌드하고 cron 작업을 가리키는 부분을 쉽게 꺼낼 수 있습니다.

+0

위의 코드가있는 스크립트입니다. 그것은 나를 위해 일하는 것 같지 않습니다. – karnage

+0

Laizer, 오류 'SQLSTATE [42S22] : 메시지가있는'예외 'Zend_Db_Statement_Exception'이 (가) 발생했습니다./var/www/releases /에 '1054 알 수없는'e.display_price_group_0 ' 20101019/lib/Zend/Db/Statement/Pdo.php : 238 "플랫 카탈로그를 다시 작성한 후 제품을 업데이트 할 때? 그렇다면 어떻게 수정 했습니까? 감사! – fdierre

+0

두려워서 여기서 너를 도울 수 없어. 나는 그 문제를 본 적이 없다고 생각합니다. – Laizer

0

나는 또한 제대로 작동하지 않습니다.

마법사 :: getResourceModel : 나는 그것이 잘 작동하고 나는 SQL 컬럼 오류가 발생하지 않지만, 내가 할 때 프로그램이를 통해 작동하지 않습니다 관리자 플랫 카탈로그의 제품을 다시 재건

('catalog/product_flat_indexer') -> rebuild();

+0

나는 유일하게 기쁘다는 것을 알고 기쁘다. 나는 내 마음을 잃어 가고 있다고 생각했다. – 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

특정 제품 속성 만 업데이트하는 더 효율적인 방법이 있음을 발견했습니다.

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

아니면 평평한 테이블에 전체 제품을 업데이트 할 수 있습니다 : $ productIds 업데이트 할 수있는 제품 엔티티 ID의 배열입니다

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

. 이 기능은 업데이트 한 제품과 관련된 다른 색인 데이터도 업데이트합니다. 희망이 도움이됩니다.

0

쉘 재 색인 스크립트를 기반으로 방금이 코드를 작성했습니다. 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(); 
} 
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); 
     } 
    } 
} 

명는 인덱싱에 관련된 모든 해답을 찾을 내부 쉘/indexer.php를 작동 열리지 않습니다 포스트 somethig에 전에 조금 연구.

관련 문제