Magento - Tidak dapat mengatur urutan koleksi


11

Ini sepertinya tidak dipesan dengan benar, apa pun yang saya lakukan salah? Saran?

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

Koleksi lain yang tampaknya tidak diurutkan yang berbeda dari yang pertama:

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

Jawaban:


42

Koleksi EAV berfungsi dengan atribut, metode pengurutan juga sedikit berbeda di sini

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

Untuk koleksi non-EAV gunakan salah satu metode berikut

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

bagaimana dengan koleksi kedua?
easymoden00b

Itu koleksi tipe datar, jadi tidak ada EAV dan atribut. Lihatlah jawaban ini tentang cara mengurutkannya: stackoverflow.com/a/11354060
Sander Mangel

Saya mencoba setOrder ('related_sku', 'DESC'); tapi itu tidak diurutkan.
easymoden00b

Saya sudah mengedit jawaban saya
Sander Mangel

2
@ easymoden00b gunakan ini$kitCollection->getSelect()->order('related_sku DESC');
Priyank


3

Untuk memperluas jawaban lain di sini, $kitCollection->getSelect()->order('column DESC')berfungsi dengan baik, tetapi Anda tidak dapat menambahkan lebih dari satu kolom. Misalnya, $kitCollection->getSelect()->order('column DESC, column2 ASC')akan salah. Ini karena pekerjaan yang dilakukan Magento untuk menghindari nama kolom. Untuk menyiasati ini, Anda dapat menggunakan Zend_Db_Exprseperti:

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

1

easymoden00b, setOrder()tidak berfungsi karena struktur Eav pada produk. Seperti @Sande mengatakan untuk menggunakan addAttributeToSort()fungsi, karena

  • Magento is join multiple tables for product collection.

  • Attribute alias name at collection

  • setOrder() functionbekerja ketika order expression Nama Kolom, SortOrder adalah correct.

Anda dapat melihat, bagaimana magento membuat bidang alias dan menghubungkan atribut tabel eav di kelas 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

Inilah solusi saya untuk mengurutkan urutan opsi dalam atribut produk yang dapat dikonfigurasi. Mulai dengan menyalin Collection.php,

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

Kemudian Anda dapat menemukan kode ini:

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

Dan ganti dengan kode ini:

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

Ini akan memungkinkan Anda untuk mengurutkan daftar pilihan atribut yang ada menurut abjad. Anda juga dapat membalik urutan dengan menggunakan array_reverse()atau fungsi serupa.

Sebelumnya, opsi atribut saya berada dalam urutan abjad terbalik. Sekarang, mereka dalam urutan abjad.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.