「updated_at」によるカート項目のソート


15

これは私がカートのアイテムを取得する方法です:

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

私はこのようなことをしたいです:

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

これを行う適切な方法は何ですか?

私はこのようなことをしたいと思っています:

$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オブジェクトを作成する必要がありますが、これは少し計算が面倒な操作のようです。


やってみた?
マリウス

1
@Mariusはい、ページはこの時点でレンダリングを停止します。
easymoden00b

var / logでエラーを確認するか、エラー報告を有効にします。
マリウス

@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

1
回答を更新しました。ご確認ください。
アミットベラ

回答:


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関数sortを使用できます。

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

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

編集:

クラスMage_Sales_Model_Quoteを書き換えます

クラスを書き換えることをお勧めします。この呼び出しでは、すべてのアイテムを取得するためにmagentoが関数であり、g mainが応答します。Mage_Sales_Model_Quotecalled getAllItems()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

お待ちください。
アミットベラ

私は[更新された回答を参照]のようなことをしたいと思っていますが、それはほんの少し扱いに​​くいだけでなく、非常に扱いにくいコードです。
-easymoden00b

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

早く書かれた:

この状況ではおそらくあまり良い解決策ではありませんが、念頭に置いてください。(マゼントにはこのような便利な場所がたくさんあります)

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

    return $items;
}

getData()メソッド内に、並べ替えたい任意のフィールドを配置します。あなたの場合、それは可能性がありますupdated_atupdated_atより良いタイムスタンプを挿入する場合。


タイムスタンプでは、DateTimeオブジェクトのインスタンス化を意味すると仮定します(どのコンパレーターが動作するか)。
-easymoden00b

あなたは実験する必要があります。updated_at
zhartaunik

さて、試してみましょう...今では、1つのテンプレートファイル内で1つの関数を使用するためだけに複雑なモジュールを作成する楽しみが始まります。
-easymoden00b

このパターンに従って、メニューでカテゴリをソートしました。時計仕掛けのように実行
-zhartaunik

2つのアイテムの更新時間が同じ場合、それらは互いに上書きされます。
-easymoden00b
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.