按“ updated_at”对购物车项目进行排序


15

这是我获取购物车物品的方式:

$quote = Mage::getModel('checkout/cart')->getQuote();
$items=$quote->getAllitems();

我想做这样的事情:

$items->sortBy('updated_at','desc');

magento正确的方法是什么?

我很想做这样的事情:

$productArray=array();
foreach($items as $item){
    $product=$item->getProduct();
    array_push($productArray,$product);
}
$productArray = $this->sortArray($productArray);

protected sortArray($productArray){
    ...sort by updated date;
    return $sortedArray
}

但是,我需要创建一堆dateTime对象才能轻松比较这些值,这似乎在计算上有点麻烦。


你试过了吗?
马里斯(Marius)

1
@Marius是的,页面此时停止渲染。
easymoden00b 2015年

检查var / log中是否有错误或启用错误报告。
Marius

@Marius我越来越异常:a:5:{i:0; s:59:“ Mage注册表项” _singleton / core / resource“已经存在”; i:1; s:763:“#0 /opt/magento/app/Mage.php(225):Mage :: throwException('Mage Registry k ...')..
easymoden00b 2015年

1
答案已更新。请检查。
阿米特·贝拉

Answers:


3

没有排序依据

因为getAllItems来自array物体,并根据我concept you cannot sort this by field.

  public function getAllItems()
    {
        $items = array();
        foreach ($this->getItemsCollection() as $item) {
            if (!$item->isDeleted()) {
                $items[] =  $item;
            }
        }
        return $items;
    }

在这种情况下,您可以使用getItemsCollection().然后按任何字段使用seOrder函数排序

$items=$quote->getItemsCollection()->setOrder('updated_at', 'desc');

foreach ($items as $item) {
    if (!$item->isDeleted()) {
    //Do your code $item
    }
}

编辑:

重写类Mage_Sales_Model_Quote

这将更好的主意重写Mage_Sales_Model_Quote。在此调用Magento的是called getAllItems()功能和g etItemsCollection() function主要为响应得到的所有项目。

  <global>
    <models>
      <magento65343>
        <class>StackExchange_Magento65343_Model</class>
        <resourceModel>magento65343_mysql4</resourceModel>
      </magento65343>
            <sales>
                <rewrite>
                    <quote>StackExchange_Magento65343_Model_Sales_Quote</quote>
                </rewrite>
            </sales>
    </models>

重写类:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

使用setOrder()函数进行排序:

setOrder()函数的排序项集合田野

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
     public function getItemsCollection($useCache = true)
    {
        if ($this->hasItemsCollection()) {
            return $this->getData('items_collection');
        }
        if (is_null($this->_items)) {
            $this->_items = Mage::getModel('sales/quote_item')->getCollection()->setOrder('updated_at', 'desc');
            $this->_items->setQuote($this);
        }
        return $this->_items;
    }

}

致命错误:调用未定义方法Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort()...
easymoden00b 2015年

等待,我会检查。
阿米特·贝拉

我很想做类似[参见更新后的答案]之类的事情,但这只是一堆更多的代码,有些笨拙而且不太友好。
easymoden00b 2015年

0

解:

Mage_Sales_Model_Quote::getAllVisibleItems用它重写您的方法:

public function getAllVisibleItems()
{
    $items = array();
    foreach ($this->getItemsCollection() as $item) {
        if (!$item->isDeleted() && !$item->getParentItemId()) {
            $timeStamp = Mage::getModel('core/date')->timestamp($item->getData('updated_at'));
            $items[$timeStamp] =  $item;
        }
        ksort($items);
    }
    return $items;
}

早写:

在这种情况下,这可能不是很好的解决方案,但请记住这一点。(Magento在很多这样的地方都可能有用)

public function getAllItems()
{
    $items = array();
    foreach ($this->getItemsCollection() as $item) {
        if (!$item->isDeleted()) {
            $items[$item->getData('...')] =  $item;
        }
    }
    ksort($items)

    return $items;
}

在getData()方法内部,将要排序的任何字段放入。在你的情况下可以updated_at。为了updated_at更好地插入,请插入其时间戳。


通过时间戳,我假设您的意思是DateTime对象的实例化(比较器在其上工作)?
easymoden00b 2015年

您需要进行实验。也许可以在您放在那里时进行排序
update_at

好的,我来试试看...现在开始创建一个复杂的模块,开始只在一个模板文件中使用一个函数的乐趣。
easymoden00b 2015年

按照这种模式,我在菜单中对类别进行了排序。像发条一样
运转

如果两个项目的更新时间相同,则它们将相互覆盖。
easymoden00b 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.