magentoが色見本を作成するためにユニバースからすべてのラベルをロードする必要があるのはなぜですか?


7

23kの可能なカラー値を持つストアで作業しています。ただし、すべての製品で使用されているわけではありません。

これで、ネイティブスウォッチを含む1.9.2.1に取り組んでいるので、製品ページのロードに3分かかることがわかります。

それは理由だ_loadOptionLabelsの方法Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection負荷のすべての23K色ごとに単一の製品ページがロードされていること、。

誰かが同じ問題を経験しましたか、それを最適化する方法を推測していますか?

また、未使用のオプション値をすべてクリーンアップしようとしましたが、それでもロードしてResource_Iteratorを使用してforeachを高速化するのに非常に時間がかかりましたが、機能しませんでした。問題は大きなクエリです。


「なぜ」には答えられませんが、2Kカラーのオプションがいくつかあるサイトでこの問題に遭遇しました。色見本のため、カタログビューは1分以上かかっていました。最適化されていない状態のため、モジュールを完全に無効にし、カスタムソリューションを導入しました。
Ryan Hoerr、2015

回答:


7

\ Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection :: _ loadOptionLabelsを次のようにオーバーライドするモジュールを作成しました。

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

クエリをフィルター処理し、foreachをイテレーターに置き換えました。

今では、製品あたりのレコード数が24.40から23.000になりました。:)

また、このモジュールは、製品リストに何も表示する設定がない場合に、製品リストに不要な呼び出しを行います。たぶん、configswatches / general / product_list_attributeにロードする属性があるかどうかを確認するには、Mage_ConfigurableSwatches_Model_Observer :: productListCollectionLoadAfterの書き換えが必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.