سؤال

أود أن أفعل ما يلي على 1.9.0.1:

الحصول على 12 منتجًا عشوائيًا من نفس فئة المنتج الحالي.يجب أن تكون قابلة للبيع.لا ينبغي أن يكونوا في المنتجات ذات الصلة بالفعل.لا ينبغي أن يكونوا في العربة.

وإذا لم يكن هناك 12 منتجًا في هذه الفئة، فاملأ الباقي بمنتجات من الفئة الرئيسية.

أعتقد أن الأمر أصبح معقدًا ولكن يمكنني القيام بذلك.فقط لست متأكدًا مما إذا كان بإمكاني القيام بذلك بشكل جيد :-)

سؤالي هو هل يجب أن أقلق بشأن الأداء مع هذا التعقيد المحدد؟ماذا تقصد؟

ستكون أمثلة التعليمات البرمجية رائعة حتى أتمكن من مقارنتها.

هل كانت مفيدة؟

المحلول

لقد قمت مؤخرًا بتنفيذ شيء مشابه جدًا وسأشارك الكود ذي الصلة أدناه.لكن أولاً بعض التعليقات حول الأداء، حيث كان هذا هو السؤال:

أفكار عامة حول الأداء لمتطلباتك:

  • تعني عبارة "لا ينبغي أن يكونوا في سلة التسوق" أن لديك وسائل محدودة فقط لتخزين كتلة البيع مؤقتًا.أوصي بشدة بالقيام بذلك على أي حال، ولكن قم بتعيين مفتاح ذاكرة التخزين المؤقت وعمر ذاكرة التخزين المؤقت فقط إذا كانت سلة التسوق فارغة.
  • لا ORDER BY RAND() لأنه ينتج عنه نسخة جدول مؤقت كثيفة الموارد.يجب عليه تحميل كافة النتائج في جدول مؤقت، وتعيين رقم عشوائي لكل صف ثم فرزها دون أي فهرس.وبدلاً من ذلك، نقوم باسترداد جميع معرفات المرشحين (وهذا أسرع ويمكن التحكم في كمية البيانات حتى بالنسبة للكتالوجات الكبيرة)، واختيار بعضها بشكل عشوائي واسترداد هذه الصفوف مباشرة.يمكنك أن تقرأ عنها بالتفصيل في مدونتي: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-are-doing-it-wrong/

مشاكل أداء محددة مع الحل الخاص بك

  • لا تستخدم addAttributeToSelect('*') مع مجموعات EAV، حدد فقط ما تحتاجه
  • لست متأكدا تماما، ولكني أشك في ذلك new Zend_Db_Expr('FIELD(category_id, ' . implode(',', $_cat_order).')')) يمكن استخدام فهارس MySQL بكفاءة

الحل الكامل

هذا مراقب ل catalog_product_upsell حدث.فهو يستخدم مجموعة المنتجات التي توفرها فئة المنتج لأنني لم أكن بحاجة إلى الرجوع إلى الأصل، ولكنني متأكد من أنه يمكنك تعديلها.

use Mage_Catalog_Model_Product as Product;
use Mage_Catalog_Model_Product_Link as RelatedProduct;
use Mage_Catalog_Model_Resource_Product_Link_Product_Collection as RelatedProductCollection;

class IntegerNet_AutoUpsell_Model_Observer
{
    /**
     * @see event catalog_product_upsell
     * @param Varien_Event_Observer $observer
     * @throws Mage_Core_Exception
     */
    public function fillUpsellCollection(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        if ($collection instanceof RelatedProductCollection
            && $collection->getLinkModel()->getLinkTypeId() === RelatedProduct::LINK_TYPE_UPSELL
            && $collection->count() < $observer->getLimit('upsell')
        ) {
            $this->addItemsFromCategory($collection, $observer->getLimit('upsell') - $collection->count(), $observer->getProduct());
        }
    }
    protected function addItemsFromCategory(RelatedProductCollection $collection, $numberOfItems, Product $product)
    {
        /** @var Mage_Catalog_Model_Resource_Product_Collection $productsToAdd */
        $productsToAdd = $this->_getProductCategory($product)->getProductCollection();
        $productsToAdd
            ->addStoreFilter()
            ->addIdFilter(array_merge([$product->getId()], $collection->getAllIds()), true)
            ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());

        $candidateIds = $productsToAdd->getAllIds();
        $choosenIds = [];
        $maxKey = count($candidateIds)-1;
        while (count($choosenIds) < $numberOfItems)) {
            $randomKey = mt_rand(0, $maxKey);
            $choosenIds[$randomKey] = $candidateIds[$randomKey];
        }    
        $productsToAdd
            ->addIdFilter($choosenIds)
            ->addMinimalPrice()
            ->addFinalPrice()
            ->addTaxPercents()
            ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
            ->addUrlRewrite();
        foreach ($productsToAdd as $product) {
            $collection->addItem($product);
        }
    }

    /**
     * @param Mage_Catalog_Model_Product $product
     * @return Mage_Catalog_Model_Category
     */
    protected function _getProductCategory(Product $product)
    {
        $category = $product->getCategoryCollection()
            ->setPageSize(1)
            ->getFirstItem();
        return $category;
    }
}

بعض الأجزاء التي أود تسليط الضوء عليها:

->addIdFilter(array_merge($product->getId(), $collection->getAllIds()), true)

هذا يستثني المنتج نفسه والمنتجات التي تم تعريفها يدويًا بالفعل على أنها منتجات بيع أعلى (أتركها وأملأ الفراغات فقط بمنتجات عشوائية)

->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addUrlRewrite();

يؤدي هذا إلى إعداد مجموعة المنتجات لتحميل البيانات اللازمة لعرض الأسعار ورابط المنتج وأي سمات تم تكوينها على أنها "مستخدمة في قائمة المنتجات"، ولكن ليس أكثر من ذلك.

نصائح أخرى

هنا هو رمز العمل الخاص بي: giveacodicetagpre.

أعتقد أن هناك بعضا لتحسين؟:)

ضع هذا لعرضها. VTML ستعمل.فقط تحتاج إلى ضبط CSS giveacodicetagpre.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى magento.stackexchange
scroll top