Tại sao magento cần phải tải tất cả các nhãn từ vũ trụ để xây dựng các mẫu màu?


7

Tôi đang làm việc trên một cửa hàng có 23k giá trị màu có thể. Nhưng, tất nhiên chúng không được sử dụng trên mọi sản phẩm.

Bây giờ, chúng tôi đang làm việc trên 1.9.2.1, có các mẫu màu gốc, tôi thấy rằng trang produt mất 3 phút để tải.

Đó là bởi vì phương thức _loadOptionLabels của Mage_ConfigurableSwatches_Model_Resource_Catalog_ Productt_Attribution_Super_Collection , tải tất cả 23k màu mỗi khi một trang sản phẩm được tải.

Có ai gặp vấn đề tương tự, hoặc có một dự đoán về cách tối ưu hóa nó?

Tôi cũng đã cố gắng xóa tất cả các giá trị tùy chọn không sử dụng , nhưng vẫn mất rất nhiều thời gian để tải và sử dụng Resource_Iterator để tăng tốc độ foreach, nhưng không hoạt động. Vấn đề là truy vấn lớn.


Tôi không thể trả lời 'tại sao', nhưng chúng tôi cũng đã tìm hiểu điều này trên một trang web có một số tùy chọn màu 2k. Lượt xem danh mục đã mất một phút hoặc nhiều hơn trên tài khoản của các mẫu màu. Chúng tôi cuối cùng đã vô hiệu hóa mô-đun hoàn toàn trên tài khoản của trạng thái không được tối ưu hóa của nó và đưa ra một giải pháp tùy chỉnh.
Ryan Hoerr

Câu trả lời:


7

Tôi đã tạo một mô-đun để ghi đè \ Mage_ConfigurableSwatches_Model_Resource_Catalog_ Productt_Attribution_Super_Collection :: _ loadOptionLabels bằng cách sau:

protected function _loadOptionLabels()
{
    if ($this->count()) {

        $attributeIds = array();
        $productId = false;
        $filterLabels = false;
        foreach ($this->_items as $item) {
            $attributeIds[] = $item->getAttributeId();
            $id = $item->getProductId();
            $productId[$id] = $id;
        }
        if (is_array($productId) && $attributeIds) {
            $filterLabels = true;
        }

        if ($filterLabels) {
            $productIntTable = 'catalog_product_entity_int';
            $select = $this->getConnection()->select()
                ->from(array('l' => $this->getTable('catalog/product_super_link')), array('i.value'))
                ->join(
                    array('i' => Mage::getSingleton('core/resource')->getTableName($productIntTable)),
                    'i.entity_id = l.product_id'
                )
                ->where('l.parent_id IN (?)', array_keys($productId))
                ->where('i.attribute_id IN (?)', $attributeIds);
            $optionIdsToSelect = $this->getConnection()->fetchCol($select);
        }


        $select = $this->getConnection()->select()
            ->from(
                array('attr' => $this->getTable('catalog/product_super_attribute')),
                array(
                    'product_super_attribute_id' => 'attr.product_super_attribute_id',
                )
            )
            ->join(
                array('opt' => $this->getTable('eav/attribute_option')),
                'opt.attribute_id = attr.attribute_id',
                array(
                    'attribute_id' => 'opt.attribute_id',
                    'option_id' => 'opt.option_id',
                )
            )
            ->join(
                array('lab' => $this->getTable('eav/attribute_option_value')),
                'lab.option_id = opt.option_id',
                array(
                    'label' => 'lab.value',
                    'store_id' => 'lab.store_id',
                )
            )
            ->where('attr.product_super_attribute_id IN (?)', array_keys($this->_items));

        if ($filterLabels) {
            $select->where('opt.option_id IN (?)', $optionIdsToSelect);
        }
        $result = $this->getConnection()->fetchAll($select);
        Mage::getSingleton('core/resource_iterator')->walk(
            $select,
            array(function($args){
                $data = $args['row'];
                $item = $this->getItemById($data['product_super_attribute_id']);
                if (!is_array($labels = $item->getOptionLabels())) {
                    $labels = array();
                }
                $labels[$data['option_id']][$data['store_id']] = $data['label'];
                $item->setOptionLabels($labels);
            })
        );

    }
    return $this;
}

Tôi đã lọc truy vấn và thay thế foreach bằng iterator.

Nó mang lại cho tôi khoảng 24 đến 40 hồ sơ cho mỗi sản phẩm, thay vì 23.000. :)

Mô-đun này cũng thực hiện các cuộc gọi không cần thiết trong danh sách sản phẩm khi bạn không có thiết lập để hiển thị bất cứ điều gì trong danh sách sản phẩm. Có thể viết lại Mage_ConfigurableSwatches_Model_Observer :: productListCollectionLoadAfter để kiểm tra xem configswatches / general / product_list_attribution có tải thuộc tính nào không.

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.