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

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

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

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;
}

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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.