سؤال

إنني أتطلع إلى إنشاء مجموعة منتجات مخصصة باستخدام سمات منتج محددة كمرشحات.تحتوي مجموعة المنتجات التي أحصل عليها على ما يزيد عن 100 منتج، وهذا جيد ولكنني بحاجة إلى إيجاد طريقة لاختيار 5 منتجات بشكل عشوائي من المجموعة ثم تحميلها لعرضها على الصفحة.هل قام أي شخص بتطوير أي شيء مشابه لهذا أو يعرف أفضل طريقة لتنفيذ ذلك؟

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

المحلول

أكتشفت ذلك ORDER BY RAND() يعد غير فعال للغاية في مجموعة Magento لأنه يتم نسخ جميع البيانات إلى جدول مؤقت، وتعيين رقم عشوائي ثم فرزها بدون فهرس.إذا قمنا بتقليل البيانات المراد نسخها إلى المعرف فقط، فستصبح أسرع كثيرًا (لا تزال غير مثالية لأن الفرز البطيء لا يزال مناسبًا لكتالوج صغير مثل كتالوجك).

ولهذا السبب قمت بإنشاء نسخة معدلة من getAllIds():

$numberOfItems = 5;

// Step 1: Preselect ids using ORDER BY RAND()
// Filters are applied here
$productCollection = Mage::getModel('catalog/product')
    ->getCollection();
$productCollection
    ->addStoreFilter()
    ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
$productCollection->getSelect()->order('RAND()');
$idsSelect = clone $productCollection->getSelect();
$idsSelect->reset(Zend_Db_Select::LIMIT_COUNT);
$idsSelect->reset(Zend_Db_Select::LIMIT_OFFSET);
$idsSelect->reset(Zend_Db_Select::COLUMNS);
$idsSelect->columns('e.' . $productCollection->getEntity()->getIdFieldName());
$idsSelect->limit($numberOfItems, null);
$idsSelect->resetJoinLeft();
$accessor = new ReflectionObject($productCollection);
$_bindParams = $accessor->getProperty('_bindParams');
$_bindParams->setAccessible(true);
$chosenIds = $productCollection->getConnection()
    ->fetchCol($idsSelect, $_bindParams->getValue($productCollection));

ثم يمكنني تحميل المنتجات بواسطة هذه المعرفات العشوائية:

// Step 2: Load products
// Attributes and index data are joined here
$productCollection->addIdFilter($chosenIds);
$productCollection
    ->addMinimalPrice()
    ->addFinalPrice()
    ->addTaxPercents()
    ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
    ->addUrlRewrite();

$productCollection->load();

بديل أبسط

البديل الذي يعمل جيدًا أيضًا على الكتالوجات الصغيرة (<10000 منتج) هو التحميل الجميع ids وحدد المعرفات العشوائية باستخدام PHP:

$numberOfItems = 5;

$productCollection = Mage::getModel('catalog/product')->getCollection();
$productCollection
    ->addStoreFilter()
    ->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());
$candidateIds = $productCollection->getAllIds();
$numberOfProducts = count($candidateIds);
$chosenIds = [];
while ($numberOfItems) {
    $randomKey = mt_rand(0, $numberOfProducts - 1);
    if (!isset($chosenIds[$randomKey])) {
        chosenIds[$randomKey] = $candidateIds[$randomKey];
        --$numberOfItems;
    }
}
$productCollection->addIdFilter($chosenIds);
$productCollection
    ->addMinimalPrice()
    ->addFinalPrice()
    ->addTaxPercents()
    ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
    ->addUrlRewrite();

$productCollection->load();

يمكنك قراءة تحليل أكثر تعمقًا والاطلاع على بعض المعايير في مدونتي: http://www.schmengler-se.de/en/2015/09/show-random-products-in-magento-you-are-doing-it-wrong/

نصائح أخرى

حاول

giveacodicetagpre.

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