Magento - неможливо встановити порядок збору


11

Здається, це не впорядковано правильно, що я роблю неправильно? Пропозиції?

$componentQuantityCollection = Mage::getModel('catalog/product')->getCollection();
$componentQuantityCollection->joinField('qty',
    'cataloginventory/stock_item',
    'qty',
    'product_id=entity_id',
    '{{table}}.stock_id=1',
    'left');
$componentQuantityCollection->addAttributeToFilter('sku', array('in' => $componentSkus))->setOrder('sku','ASC');

Ще одна колекція, яка не здається відсортованою, яка відрізняється від першої:

$kitCollection = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('kit_sku', $sku)->setOrder('related_sku', 'DESC');

Відповіді:


42

Колекції EAV працюють з атрибутами, тут також дещо інший метод сортування

$componentQuantityCollection->addAttributeToSort('sku', 'ASC');

Для колекцій, що не належать до EAV, використовуйте один із наступних методів

$kitCollection->getSelect()->order('related_sku DESC');
$kitCollection->setOrder('related_sku', 'DESC');

як щодо другої колекції?
easymoden00b

Це колекція плоского типу, тому немає EAV та атрибутів. Подивіться на цю відповідь, як сортувати це: stackoverflow.com/a/11354060
Sander Mangel

Я спробував setOrder ('related_sku', 'DESC'); але це не відсортовано.
easymoden00b

Я відредагував свою відповідь
Sander Mangel

2
@ easymoden00b використовуйте це$kitCollection->getSelect()->order('related_sku DESC');
Priyank

15

Ви можете додати порядок сортування таким чином:

$kitCollection->getSelect()->order('related_sku DESC');

Більше інформації: http://www.magentocommerce.com/wiki/1_-_installation_and_configuration/using_collections_in_magento

Надія може вам допомогти.


3
Виправлено це для мене, тому що я використовував його як->order('related_sku', 'desc');
Рікі Одін Метьюс

3

Для розширення інших відповідей тут $kitCollection->getSelect()->order('column DESC')добре працює, але ви не можете додати більше одного стовпця. Наприклад, $kitCollection->getSelect()->order('column DESC, column2 ASC')буде помилка. Це відбувається через роботу, яку Магенто виконує, щоб уникнути імен стовпців. Щоб обійти це, ви можете скористатися Zend_Db_Exprтаким чином:

$kitCollection->getSelect()->order(new Zend_Db_Expr('related_sku DESC, column2 ASC'));

1

easymoden00b, setOrder()не працює завдяки структурі Eav на product.As @Sande кажуть використовувати addAttributeToSort()функцію через

  • Magento is join multiple tables for product collection.

  • Attribute alias name at collection

  • setOrder() functionпрацює, коли це order expression Fieldname, SortOrder є correct.

Ви можете бачити, як magento створює псевдонім поля, і він пов'язує атрибут eav таблиці у класі Mage_Eav_Model_Entity_Collection_Ab Abstract

public function addAttributeToSort($attribute, $dir = self::SORT_ORDER_ASC)
{
    if (isset($this->_joinFields[$attribute])) {
        $this->getSelect()->order($this->_getAttributeFieldName($attribute).' '.$dir);
        return $this;
    }
    if (isset($this->_staticFields[$attribute])) {
        $this->getSelect()->order("e.{$attribute} {$dir}");
        return $this;
    }
    if (isset($this->_joinAttributes[$attribute])) {
        $attrInstance = $this->_joinAttributes[$attribute]['attribute'];
        $entityField = $this->_getAttributeTableAlias($attribute) . '.' . $attrInstance->getAttributeCode();
    } else {
        $attrInstance = $this->getEntity()->getAttribute($attribute);
        $entityField = 'e.' . $attribute;
    }

    if ($attrInstance) {
        if ($attrInstance->getBackend()->isStatic()) {
            $orderExpr = $entityField;
        } else {
            $this->_addAttributeJoin($attribute, 'left');
            if (isset($this->_joinAttributes[$attribute])||isset($this->_joinFields[$attribute])) {
                $orderExpr = $attribute;
            } else {
                $orderExpr = $this->_getAttributeTableAlias($attribute).'.value';
            }
        }

        if (in_array($attrInstance->getFrontendClass(), $this->_castToIntMap)) {
            $orderExpr = Mage::getResourceHelper('eav')->getCastToIntExpression(
                $this->_prepareOrderExpression($orderExpr)
            );
        }

        $orderExpr .= ' ' . $dir;
        $this->getSelect()->order($orderExpr);
    }
    return $this;
}

1

Ось моє рішення для сортування порядку налаштувань за атрибутом продукту, що можна настроювати. Почніть з копіювання Collection.php,

app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.phpдо app/code/local/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php.

Тоді ви можете знайти цей код:

foreach ($this->getProduct()->getTypeInstance(true)->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct()) as $associatedProduct) {

І замініть його цим кодом:

$assProds = $this->getProduct()->getTypeInstance(true)->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct());
sort($assProds);
foreach ($assProds as $associatedProduct) {

Це дозволить вам сортувати випадаючий список параметрів атрибутів за алфавітом. Ви також можете змінити порядок, використовуючи array_reverse()або подібні функції.

Раніше мої параметри атрибутів були у зворотному алфавітному порядку. Тепер вони в алфавітному порядку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.