Magento - Impossible de définir l'ordre de collecte

11

Cela ne semble pas être commandé correctement, qu'est-ce que je fais mal? Suggestions?

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

Une autre collection qui ne semble pas être triée et différente de la première:

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

Réponses:

42

Les collections EAV fonctionnent avec des attributs, la méthode de tri est également un peu différente ici

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

Pour les collections non EAV, utilisez l'une des méthodes suivantes

$kitCollection->getSelect()->order('related_sku DESC');
$kitCollection->setOrder('related_sku', 'DESC');
Sander Mangel
la source
qu'en est-il de la deuxième collection?
easymoden00b
C'est une collection de type plat, donc pas d'EAV et d'attributs. Jetez un oeil à cette réponse sur la façon de trier cela: stackoverflow.com/a/11354060
Sander Mangel
J'ai essayé setOrder ('related_sku', 'DESC'); mais ce n'est pas trié.
easymoden00b
J'ai édité ma réponse
Sander Mangel
2
@ easymoden00b use this$kitCollection->getSelect()->order('related_sku DESC');
Priyank
3

Pour développer les autres réponses ici, cela $kitCollection->getSelect()->order('column DESC')fonctionne bien, mais vous ne pouvez pas ajouter plus d'une colonne. Par exemple, $kitCollection->getSelect()->order('column DESC, column2 ASC')va l'erreur. Cela est dû au travail que Magento fait pour échapper aux noms de colonne. Pour contourner cela, vous pouvez utiliser une Zend_Db_Exprméthode similaire:

$kitCollection->getSelect()->order(new Zend_Db_Expr('related_sku DESC, column2 ASC'));
Tyler V.
la source
1

easymoden00b, setOrder()ne fonctionne pas en raison de la structure Eav sur le produit. Comme @Sande dit d'utiliser la addAttributeToSort()fonction, en raison de

  • Magento is join multiple tables for product collection.

  • Attribute alias name at collection

  • setOrder() functionfonctionne quand il order expression Fieldname, SortOrder est correct.

Vous pouvez voir comment magento crée un alias de champ et associe l'attribut de table eav à la classe 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
la source
1

Voici ma solution pour trier l'ordre des options dans l'attribut d'un produit configurable. Commencez par copier 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.

Ensuite, vous pouvez trouver ce code:

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

Et remplacez-le par ce code:

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

Cela vous permettra de trier la liste déroulante des options d'attribut par ordre alphabétique. Vous pouvez également inverser l'ordre en utilisant array_reverse()ou des fonctions similaires.

Auparavant, mes options d'attribut étaient dans l'ordre alphabétique inverse. Maintenant, ils sont classés par ordre alphabétique.

NotJay
la source