'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 객체를 만들어야하며 이는 계산적으로 번거로운 작업 인 것 같습니다.


해봤 어?
Marius

1
@Marius 예,이 시점에서 페이지 렌더링이 중지됩니다.
easymoden00b

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

1
답변이 업데이트되었습니다. 확인하십시오.
Amit Bera

답변:


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이 호출 젠토는 .IN 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

기다릴게요
Amit Bera

[업데이트 된 답변보기]와 같은 일을하고 싶지만 약간 다루기 힘들고 매우 친절한 에이전트가 아닌 더 많은 코드입니다.
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 () 메소드 안에는 정렬하려는 anyfield를 넣습니다. 귀하의 경우에는 가능합니다 updated_at. 삽입의 경우 updated_at는 타임 스탬프 삽입 더 나은.


타임 스탬프로 DateTime 객체의 인스턴스화를 의미한다고 가정합니다 (비교자가 작동하는 것)?
easymoden00b

실험해야합니다. 아마 그것은 당신이 거기에 넣어 때 정렬 할 수 있습니다 updated_at
zhartaunik

좋아, 나는 그것을 시도 할 것이다 ... 이제 재미는 하나의 템플릿 파일 내에서 하나의 함수를 사용하기 위해 복잡한 모듈을 만드는 것부터 시작합니다. magento는 너무 바보입니다.
easymoden00b

이 패턴에 따라 메뉴에서 범주를 정렬했습니다. 시계처럼 작동
zhartaunik

두 항목의 업데이트 시간이 동일하면 서로 덮어 씁니다.
easymoden00b
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.