2010-03-18 4 views
8

Tôi đang sử dụng cron để nhập thay đổi hàng tồn kho hàng đêm. Khi tôi cố gắng thay đổi thông tin của sản phẩm (giá, vv), tôi nhận được lỗi sau:Magento: Xây dựng lại Danh mục Phẳng Lập trình

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

Tôi có thể sửa lỗi này bằng cách nhấp vào "Xây dựng lại Danh mục sản phẩm phẳng" trong bảng quản lý bộ nhớ cache. Tôi thiết lập một cron để thực hiện việc này theo cách lập trình bằng cách sử dụng mã sau:

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

Tôi không gặp lỗi khi chạy tập lệnh nhưng lỗi "Không tìm thấy cột" vẫn tồn tại.

Có ai biết cách tôi có thể xây dựng lại danh mục phẳng không phải thông qua giao diện quản trị không?

Trả lời

4

trước tôi đã nói để làm điều này:

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

Điều này không đúng. Hoặc là làm việc. Tuy nhiên, tôi đã tìm thấy thông qua một quá trình thử nghiệm và lỗi khá đau đớn mà các bảng sản phẩm phẳng không xây dựng lại chính xác trừ khi tôi cũng xây dựng lại toàn bộ danh mục. Đây là cách cuối cùng tôi đã giải quyết được vấn đề của mình:

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

Về cơ bản, chỉ cần xây dựng lại mọi thứ. Đừng lo lắng về việc tối ưu hóa. Giống như ai đó đã từng nói, "Tối ưu hóa sớm là gốc rễ của mọi điều ác."

1

Xem điều này script. Cá nhân tôi có một số rắc rối với nó, nhưng những người khác có vẻ khá hài lòng với nó.
Nếu bạn không muốn toàn bộ điều, bạn có thể dễ dàng rút ra một phần mà xây dựng lại các sản phẩm danh mục phẳng và chỉ một công việc cron ở đó.

+0

Đây là tập lệnh mà tôi đã nhận được mã ở trên. Nó không có vẻ là làm việc cho tôi. – karnage

+0

Laizer, là rắc rối của bạn mà bạn nhận được lỗi "ngoại lệ" Zend_Db_Statement_Exception 'với thông điệp' SQLSTATE [42S22]: Cột không tìm thấy: 1054 Cột không xác định 'e.display_price_group_0' trong 'danh sách trường' 'trong/var/www/release/20101019/lib/Zend/Db/Statement/Pdo.php: 238 "khi cập nhật sản phẩm sau khi xây dựng lại catalog phẳng? nếu là vậy, bạn đã sửa nó như thế nào? Cảm ơn! – fdierre

+0

Sợ tôi không thể giúp bạn ở đây. Tôi không nghĩ rằng tôi từng thấy vấn đề đó. – Laizer

0

Tôi cũng không thể làm cho nó hoạt động chính xác.

Khi tôi xây dựng lại các Rebuild Flat Catalog sản phẩm từ Admin nó hoạt động tốt và tôi không nhận được cột lỗi SQL, nhưng khi tôi làm điều đó theo chương trình nó không hoạt động qua:

Mage :: getResourceModel ('catalogue/product_flat_indexer') -> xây dựng lại();

+0

Tôi rất vui khi được biết tôi không phải là người duy nhất, tôi nghĩ mình đã mất trí. – 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

Tôi nhận thấy rằng có cách hiệu quả hơn để chỉ cập nhật các thuộc tính sản phẩm cụ thể.

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

Hoặc bạn có thể cập nhật toàn bộ sản phẩm trong bảng phẳng:

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

đâu $ productIds là một mảng của id đơn vị sản phẩm để cập nhật. Các chức năng này cũng sẽ cập nhật dữ liệu được lập chỉ mục khác liên quan đến các sản phẩm bạn cập nhật. Hi vọng điêu nay co ich.

0

Tôi vừa viết mã này, dựa trên kịch bản lệnh Shell reindex. Tôi đã thử nghiệm nó trong Magento 1.5.1 bằng cách sử dụng một kịch bản web (với max_execution_time dài).

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

người tại sao không bạn nghiên cứu một chút trước khi đăng bài somethig đó không làm việc, mở vỏ/indexer.php, bên trong bạn sẽ tìm thấy tất cả các câu trả lời liên quan đến lập chỉ mục.