Làm cách nào để tạo Trình lập chỉ mục tùy chỉnh?


9

Tôi đang cố gắng tạo một trình chỉ mục tùy chỉnh cho một thuộc tính sản phẩm cụ thể.
Tôi cần phải:

  • đọc giá trị thuộc tính sản phẩm
  • xử lý nó theo một cách nào đó (không liên quan)
  • lưu nó trong một bảng chỉ mục

Các bước trên có thể được thực hiện trong một tập lệnh tùy chỉnh nhưng tôi muốn tích hợp trình lập chỉ mục bằng cách sử dụng công cụ lập chỉ mục được sử dụng bởi người lập chỉ mục khác trong Magento.

Tôi có thể thấy rằng trình lập chỉ mục mặc định Magento triển khai lớp trừu tượng này Mage_Index_Model_Indexer_Abstract
... Có vẻ không dễ để hiểu quy trình từ mã và tôi không thể tìm thấy bất kỳ tài liệu nào cho nó.

Bất kỳ trợ giúp được đánh giá cao cảm ơn.

Câu trả lời:


19

Thông tin sau đây phải là một dòng hướng dẫn chung dẫn đến sự hiểu biết cơ bản về toàn bộ indexer thing, vì vậy không phải là một "hướng dẫn" hoàn chỉnh ... (nếu bạn muốn đóng góp cho câu trả lời này, bạn được hoan nghênh)

Có ít nhất 3 bước cần thiết ở đây:

  1. Tạo một bảng chỉ mục và mô hình tài nguyên liên quan
  2. Tạo một mô hình Indexer thực hiện Mage_Index_Model_Indexer_Abstract
  3. thêm chỉ mục của bạn vào cấu hình Magento

Tài liệu đề xuất:

  1. Có lẽ cách tốt nhất để đào sâu vào vấn đề này là đưa ra một cái nhìn Mage_Catalog_Model_Product_Indexer_Price(đây là một trong những cách thực hiện chỉ mục dễ dàng hơn).
  2. Tài nguyên này , tại thời điểm này, xem hướng dẫn tốt nhất để hiểu toàn bộ quá trình để quyết định hành động được yêu cầu là gì.

BƯỚC 1
Chỉ cần thêm bảng chỉ mục của bạn trong trình cài đặt, như đối với bất kỳ bảng mô-đun nào khác.
Mô hình tài nguyên của bạn cần phải thực hiện các logic cho Reindex Alltrong reindexAll()phương pháp: có thể bạn sẽ xử lý tất cả các đối tượng ở đây trích lục tất cả dữ liệu.

BƯỚC 2
_registerEvent() , _processEvent()là phương pháp quan trọng ở đây, bạn sẽ cần đào sâu một chút trong hướng dẫn dưới đây để hiểu logic đằng sau chúng

Về cơ bản, _registerEvent()thêm một số dữ liệu vào $event, trên cơ sở 'loại sự kiện' và 'loại thực thể'. Dữ liệu bổ sung này sẽ được sử dụng trong _processEvent()phương pháp.

Bạn sẽ cần phải thực hiện ít nhất các phương thức sau trong mô hình của mình.

/**
 * Data key for matching result to be saved in
 */
const EVENT_MATCH_RESULT_KEY = 'some_key';

/**
 * Initialize resource model
 *
 */
protected function _construct()
{
    $this->_init('module/resource_model');
}

/**
 * @var  Used by matchEvent()
 * for example if you are processing products ...
 */
protected $_matchedEntities = array(
    Mage_Catalog_Model_Product::ENTITY => array(
        Mage_Index_Model_Event::TYPE_SAVE,
        Mage_Index_Model_Event::TYPE_MASS_ACTION,
        Mage_Index_Model_Event::TYPE_DELETE
    )
);

 /**
 * Get Indexer name
 *
 * @return string
 */
public function getName(){
    return 'My indexer Name';
}

/**
 * Get Indexer description
 *
 * @return string
 */
public function getDescription()
{
    return 'My indexer Description';
}

/**
 * Register indexer required data inside event object
 *
 * @param   Mage_Index_Model_Event $event
 *
 * Register data required by process in event object
 * @param Mage_Index_Model_Event $event
 */
protected function _registerEvent(Mage_Index_Model_Event $event)
{
    $event->addNewData(self::EVENT_MATCH_RESULT_KEY, true);
    $entity = $event->getEntity();
    $dataObj = $event->getDataObject();

    if ($entity == Mage_Catalog_Model_Product::ENTITY) {
        if ($event->getType() == Mage_Index_Model_Event::TYPE_SAVE) {
            $event->addNewData('yourmodule_update_product_id', $dataObj->getId());
        } elseif ($event->getType() == Mage_Index_Model_Event::TYPE_DELETE) {
            $event->addNewData(' yourmodule _delete_product_id', $dataObj->getId());
        } elseif ($event->getType() == Mage_Index_Model_Event::TYPE_MASS_ACTION) {
            $event->addNewData(' yourmodule _mass_action_product_ids', $dataObj->getProductIds());
        }
    }
}

/**
 * Process event based on event state data
 *
 * @param   Mage_Index_Model_Event $event
 */
protected function _processEvent(Mage_Index_Model_Event $event){
    /** DO STUFF **/
    return $this;
}

BƯỚC 3
Thêm phần này vào cấu hình của bạn, [mô-đun / mô hình] là mô hình được tạo ở bước 2. Vì vậy, tại thời điểm này, nếu bạn vào hệ thống-> trình chỉ mục, bạn sẽ thấy một mục mới

<global>
    ......
    <index>
        <indexer>
            <some_key>
                <model>module/model</model>
            </some_key>
        </indexer>
    </index>
    ......
</global> 

Nguồn:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.