Сортировать сопутствующие товары по атрибуту cutom внутри сгруппированного товара в Magento - PullRequest
3 голосов
/ 16 августа 2011

как отсортировать связанные продукты по атрибуту cutom в сгруппированном продукте в Magento,

Я продублировал файл Grouped.php в: app / code / local / Mage / Catalog / Model / Product / Type / Grouped.php

и попытался добавить это в моей функции getAssociatedProducts:

->addAttributeToSort('my_attribute', 'DESC');

но это не работает, кто-нибудь может помочь?

[EDIT]

Я переопределил файл «app / code / core / Mage / Catalog / Model / Product / Type / Grouped.php» и попытался отсортировать связанные продукты по пользовательскому атрибуту, изменив коллекцию следующим образом:

$collection = $this->getAssociatedProductCollection($product)
    ->addAttributeToSelect('*')
    ->addFilterByRequiredOptions()
    ->setPositionOrder()
    ->addStoreFilter($this->getStoreFilter($product))
    ->addAttributeToFilter('status', array('in' => $this->getStatusFilters($product)))
    ->addAttributeToSort('my_attribute', 'DESC');

но это не изменится !! (

Большое спасибо за помощь.

Ответы [ 4 ]

1 голос
/ 07 марта 2014

Может быть, это может помочь:

$_associatedProducts = $this->getAssociatedProducts();

usort($_associatedProducts, function ($a, $b) {
    if (intval($a->getCustomPosition())==intval($b->getExtraPosition())) {
        return 0;
    }
    return intval($a->getExtraPosition())<intval($b->getExtraPosition()) ? -1 : 1;
});
1 голос
/ 14 октября 2011

Вы должны убедиться, что ваш атрибут включен в выбор, чтобы иметь возможность сортировать по нему.Я сделал то же самое, чтобы заказать продукты по entity_id.

public function getAssociatedProducts($product = null)
{
    if (!$this->getProduct($product)->hasData($this->_keyAssociatedProducts)) {
        $associatedProducts = array();

        if (!Mage::app()->getStore()->isAdmin()) {
            $this->setSaleableStatus($product);
        }

        $collection = $this->getAssociatedProductCollection($product)
            ->addAttributeToSelect('*')
            ->addFilterByRequiredOptions()
            ->setPositionOrder()
            //MRD added to order by product id also.
            ->addAttributeToSort('entity_id', 'ASC')
            //END MRD
            ->addStoreFilter($this->getStoreFilter($product))
            ->addAttributeToFilter('status', array('in' => $this->getStatusFilters($product)));

        foreach ($collection as $item) {
            $associatedProducts[] = $item;
        }

        $this->getProduct($product)->setData($this->_keyAssociatedProducts, $associatedProducts);
    }
    return $this->getProduct($product)->getData($this->_keyAssociatedProducts);
}

Это сработало для меня в Magento 1.4.1.1.Обратите внимание, что вы все еще делаете заказ по позиции.поэтому ваш запрос учитывает это.

0 голосов
/ 09 августа 2013

Это решение работает хорошо, пока у вас не будет нескольких связанных продуктов с одинаковым значением my-attribute, например, размером или ценой.В этом случае он выбирает только один из вариантов и пропускает остальные.Если значения атрибута, который используется для сортировки товаров, имеют одно и то же значение, я изменяю их, добавляя возрастающую переменную-счетчик, чтобы отображались все параметры.Не самое элегантное решение, но оно сработало для меня.Кстати, вы можете создать несколько из этих индексов, чтобы настроить метод сортировки для различных наборов атрибутов.

<?php $key_count = 1; ?>
<?php foreach($_associatedProducts as $_item) {
            $index[$_item->getAttributeText('wheel_size') . "-" . $key_count] = $_item; 
            $key_count++;
            }
            ksort($index);
?>

Также, если значения вашего атрибута - это числа, хранящиеся в виде текста, возможно, добавление флага сортировки в ksort изменит их начисловой тип только для сортировки, например, ksort ($ index, SORT_NUMERIC)

0 голосов
/ 12 октября 2011

Я также столкнулся с этим типом проблемы; также много разыскивал, и в результате я нашел эту ветку, но без ответов .. до сих пор нет ответов !.

К сожалению, похоже, что getAssociatedProducts () возвращает только массив ассоциативного дерева вместо обычной коллекции ProductCollection, у которой есть тот метод (addAttributeToSort), который нам нужен.

Это немного хакерски, но вместо этого я сделал:

<?php 
foreach($_associatedProducts as $_item) {
    $index[$_item->getAttributeText('my_attribute')] = $_item; 
}
ksort($index);
?>

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

<table class="data-table grouped-items-table" id="super-product-table">
<?php foreach($index as $_item) ?>
<tr>
     <td><?= $_item->getName() ?></td>
     <td><?= $this->getPriceHtml($_item, true) ?></td>
     <!-- etc.... some other stuff you want to display-->
</tr>
<?php endforeach; ?>
</table>

Не очень хорошее решение, хотя, хотя и неплохо. работает для меня! Если у кого-то есть более элегантное решение, я бы тоже хотел его увидеть! : D ура.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...