Настраиваемые продукты ранжируются в Magento

Я пытаюсь создать список «самых продаваемых товаров» на моем сайте magento. Я попытался ответить на этот вопрос. Это работает хорошо, однако я понял, что это идеально подходит для простых продуктов. Я пытаюсь создать рейтинг для настраиваемых продуктов, поэтому я считаю, что мне нужно сначала получить общие заказы на простые продукты, которые я не уверен, как я могу делать программно. Это в основном идея, которую я имею в виду:

Получите простые продукты, связанные с настраиваемым продуктом

Получите общие заказы на каждый простой продукт и суммируйте их

Передайте общую сумму в настраиваемые продукты снова (я думаю об использовании массива здесь), затем вызывают необходимые данные, упорядоченные по ранжированию.

До сих пор я придумал этот код:

$storeId = Mage::app()->getStore()->getId(); $_collection = Mage::getResourceModel('reports/product_collection') ->addAttributeToSelect('*') ->addAttributeToFilter('type_id', 'configurable'); foreach($_collection as $c): $configurable = $c->getTypeInstance()->getUsedProductIds(); foreach($configurable as $_config): $_simple = Mage::getModel('catalog/product')->load($_config); echo $_simple->getName()."<br/>"; echo "qty:".(int)$_simple->ordered_qty."<br/>"; endforeach; endforeach; 

Однако, пытаясь проверить его, все мои количества возвращаются 0, поэтому я застрял. Как реализовать рейтинг для настраиваемых продуктов? Пожалуйста, порекомендуйте. Кроме того, если это возможно, я хотел бы сделать как можно меньше изменений в основных файлах.

Кроме того, у меня есть список ранжирования, ограниченный 10, и если у других продуктов есть 0 количество проданных, то они будут автоматически отсортированы в алфавитном порядке. То же самое происходит, если, например, 2 продукта имеют ту же сумму, что и проданные.

После буквально более 8 часов попытки понять это. Я придумал какое-то обходное решение (по крайней мере, похоже, это работает для моего случая), код, безусловно, нуждается в большом улучшении, поэтому я был бы рад принять любые изменения и предложения к моему ответу. Вот код, который я придумал:

 $filler = array(); $productCollection = Mage::getResourceModel('reports/product_collection') ->addAttributeToSelect('*') ->addAttributeToFilter('type_id', 'configurable') ->addOrderedQty() ->setOrder('ordered_qty', 'desc') ->setPage(1, 10); foreach($productCollection as $product): echo "name:".$product->getName()." - qty:".(int)$product->ordered_qty."<br/>"; array_push($filler, $product->getId()); endforeach; if(count($productCollection) < 10): $add = 10 - count($productCollection); $fillCollection = Mage::getResourceModel('reports/product_collection') ->addAttributeToSelect('*') ->addAttributeToFilter('type_id', 'configurable') ->setOrder('name', 'desc'); foreach($fillCollection as $item): if(in_array($item->getId(), $filler)): else: if($add > 0): echo "name:".$item->getName()." - qty: 0 <br/>"; $add = $add - 1; endif; endif; endforeach; endif; unset($filler); 

Таким образом, основная идея заключается в том, что я получаю коллекцию для продуктов с заказами только с тех пор, как она появляется, продукты с 0 заказами не извлекаются. После этого я получаю количество элементов, которые мне все еще нужно отображать 10 продуктов в моем рейтинге. Затем я получаю еще один набор продуктов и повторяю их, пока отображается менее 10 продуктов. Я использовал массив наполнителей, чтобы убедиться, что продукты, уже вызванные первой коллекцией, не отображаются. Учитывая этот код, у меня теперь есть рейтинг самых продаваемых продуктов на моем сайте magento.

Проверьте это решение:

Я обнаружил, что конфигурируемые продажи продукта суммируются правильно, но не включаются в результаты; вместо этого появляются их дочерние продукты. Мое решение состояло в том, чтобы включить настраиваемые продукты, сделать левое соединение в таблице catalog_product_super_link и отфильтровать все, что имеет parent_id . Вот изменения, которые вам нужно будет сделать:

Collection.php:

  public function addOrderedQty($from = '', $to = '', $getComplexProducts=false, $getComplexChildProducts = true, $getRemovedProducts = true) { $qtyOrderedTableName = $this->getTable('sales/order_item'); $qtyOrderedFieldName = 'qty_ordered'; $productIdFieldName = 'product_id'; if (!$getComplexProducts) { $compositeTypeIds = Mage::getSingleton('catalog/product_type')->getCompositeTypes(); $productTypes = $this->getConnection()->quoteInto(' AND (e.type_id NOT IN (?))', $compositeTypeIds); } else { $productTypes = ''; } if ($from != '' && $to != '') { $dateFilter = " AND `order`.created_at BETWEEN '{$from}' AND '{$to}'"; } else { $dateFilter = ""; } $this->getSelect()->reset()->from( array('order_items' => $qtyOrderedTableName), array( 'ordered_qty' => "SUM(order_items.{$qtyOrderedFieldName})", 'order_items_name' => 'order_items.name' ) ); $_joinCondition = $this->getConnection()->quoteInto( 'order.entity_id = order_items.order_id AND order.state<>?', Mage_Sales_Model_Order::STATE_CANCELED ); $_joinCondition .= $dateFilter; $this->getSelect()->joinInner( array('order' => $this->getTable('sales/order')), $_joinCondition, array() ); // Add join to get the parent id for configurables $this->getSelect()->joinLeft( array('cpsl' => $this->getTable('catalog/product_super_link')), 'cpsl.product_id = order_items.product_id', 'cpsl.parent_id' ); if(!$getComplexChildProducts) $this->getSelect()->having('parent_id IS NULL'); if($getRemovedProducts) { $this->getSelect() ->joinLeft(array('e' => $this->getProductEntityTableName()), "e.entity_id = order_items.{$productIdFieldName} AND e.entity_type_id = {$this->getProductEntityTypeId()}{$productTypes}") ->group('order_items.product_id'); } else { $this->getSelect() ->joinInner(array('e' => $this->getProductEntityTableName()), "e.entity_id = order_items.{$productIdFieldName} AND e.entity_type_id = {$this->getProductEntityTypeId()}{$productTypes}") ->group('e.entity_id'); } $this->getSelect()->having('ordered_qty > 0'); // This line is for debug purposes, in case you'd like to see what the SQL looks like // $x = $this->getSelect()->__toString(); return $this; } 

List.php – найдите следующие две строки …

 $bestsellers->addOrderedQty($startDate, $todayDate, true); $bestsellers->addOrderedQty('', '', true); 

… и изменить их на:

 $bestsellers->addOrderedQty($startDate, $todayDate, true, false, false); $bestsellers->addOrderedQty('', '', true, false, false); 

Мои изменения добавили два новых необязательных параметра, которые по умолчанию имеют значение true , чтобы не нарушать существующие функции.

  • Если для параметра $getComplexChildProducts установлено значение false , все дочерние элементы настраиваемого продукта будут удалены из результатов.
  • $getRemovedProducts определяет, должны ли $getRemovedProducts ранее заказываемые продукты (которые с тех пор были удалены из Magento).

Обратите внимание, что для получения точных результатов статистика вашего отчета должна быть актуальной.

Источник и подтверждения: https://stackoverflow.com/a/8419579/1136132