Magento - Nie można ustawić kolejności odbioru

11

To nie wydaje się być poprawnie zamówione, coś robię źle? Propozycje?

$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');

Kolejna kolekcja, która nie wydaje się być posortowana, która jest inna niż pierwsza:

$kitCollection = Mage::getModel('kitinventory/kitinventory')->getCollection()->addFieldToFilter('kit_sku', $sku)->setOrder('related_sku', 'DESC');
easymoden00b
źródło

Odpowiedzi:

42

Kolekcje EAV działają z atrybutami, również tutaj metoda sortowania jest nieco inna

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

W przypadku kolekcji innych niż EAV użyj jednej z następujących metod

$kitCollection->getSelect()->order('related_sku DESC');
$kitCollection->setOrder('related_sku', 'DESC');
Sander Mangel
źródło
co z drugą kolekcją?
easymoden00b
To kolekcja typu płaskiego, więc nie ma EAV i atrybutów. Spójrz na tę odpowiedź, jak to posortować: stackoverflow.com/a/11354060
Sander Mangel
Próbowałem setOrder ('related_sku', 'DESC'); ale to nie jest posortowane.
easymoden00b
Zredagowałem swoją odpowiedź
Sander Mangel
2
@ easymoden00b użyj tego$kitCollection->getSelect()->order('related_sku DESC');
Priyank
3

Aby rozwinąć inne odpowiedzi tutaj, $kitCollection->getSelect()->order('column DESC')działa dobrze, ale nie można dodać więcej niż jednej kolumny. Na przykład $kitCollection->getSelect()->order('column DESC, column2 ASC')będzie błąd. Wynika to z pracy, jaką Magento wykonuje, aby uniknąć nazw kolumn. Aby obejść ten problem, możesz użyć Zend_Db_Exprpodobnego:

$kitCollection->getSelect()->order(new Zend_Db_Expr('related_sku DESC, column2 ASC'));
Tyler V.
źródło
1

easymoden00b, setOrder()nie działa z powodu struktury Eav na produkcie. Jak @Sande mówi o używaniu addAttributeToSort()funkcji z powodu

  • Magento is join multiple tables for product collection.

  • Attribute alias name at collection

  • setOrder() functiondziała, gdy jest to order expression Nazwa pola, SortOrder to correct.

Możesz zobaczyć, jak magento tworzy alias pola i odnosi się do atrybutu tabeli eav w klasie Mage_Eav_Model_Entity_Collection_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;
}
Amit Bera
źródło
1

Oto moje rozwiązanie do sortowania kolejności opcji w atrybucie konfigurowalnego produktu. Zacznij od skopiowania Collection.php,

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

Następnie możesz znaleźć ten kod:

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

I zamień go na ten kod:

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

Umożliwi to sortowanie rozwijanej listy opcji atrybutów według alfabetu. Możesz także odwrócić kolejność za pomocą array_reverse()lub podobnych funkcji.

Wcześniej moje opcje atrybutów były w odwrotnej kolejności alfabetycznej. Teraz są w kolejności alfabetycznej.

NotJay
źródło