按“ 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.