trier les articles du panier par 'updated_at'


15

Voici comment je reçois les articles du panier:

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

Je voudrais faire quelque chose comme ça:

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

Quelle est la bonne façon magento de le faire?

Je suis tenté de faire quelque chose comme ça:

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

Cependant, j'aurais besoin de créer un tas d'objets dateTime afin de comparer facilement ces valeurs et cela semble être une opération fastidieuse sur le plan informatique.


L'avez-vous essayé?
Marius

1
@Marius oui, la page cesse de s'afficher à ce stade.
easymoden00b

vérifiez le var / log pour les erreurs ou activez le rapport d'erreurs.
Marius

@Marius J'obtiens toujours des anomalies: a: 5: {i: 0; s: 59: "La clé de registre Mage" _singleton / core / resource "existe déjà"; i: 1; s: 763: "# 0 /opt/magento/app/Mage.php(225): Mage :: throwException ('Mage Registry k ...') ..
easymoden00b

1
réponse mise à jour. veuillez vérifier.
Amit Bera

Réponses:


3

Il n'y a pas de fonction pour trier les

à cause de getAllItemsvenir arrayde l'objet et selon monconcept you cannot sort this by field.

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

Dans ce cas, vous pouvez utiliser getItemsCollection().puis utiliser la fonction seOrder trier par n'importe quel champ

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

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

Éditer:

Réécrire la classe Mage_Sales_Model_Quote

Il sera préférable de réécrire la classe Mage_Sales_Model_Quote. Dans cet appel, magento est la called getAllItems()fonction et etItemsCollection() functionla réponse principale pour obtenir tous les éléments.

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

Réécrire la classe:

<?php
class StackExchange_Magento65343_Model_Sales_Quote extends Mage_Sales_Model_Quote
{
}

Utilisez la fonction setOrder () pour le tri:

La fonction setOrder () trie la collection d'éléments par champs

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

}

Erreur fatale: appel à la méthode non définie Mage_Sales_Model_Resource_Quote_Item_Collection :: addAttributeToSort () ...
easymoden00b

attendez je vais vérifier.
Amit Bera

Je suis tenté de faire quelque chose comme [voir la réponse mise à jour] mais ce n'est qu'un tas de code légèrement plus lourd et peu convivial pour magento.
easymoden00b

0

Solution:

Réécrivez votre méthode Mage_Sales_Model_Quote::getAllVisibleItemsavec:

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

Écrit tôt:

Ce n'est probablement pas une très bonne solution dans cette situation, mais gardez cela à l'esprit. (Magento a de nombreux endroits où il peut être utile)

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

    return $items;
}

Dans la méthode getData (), mettez n'importe quel champ que vous souhaitez trier. Dans votre cas, ça peut l'être updated_at. En cas d'insertion updated_atmieux insérez son horodatage.


par horodatage, je suppose que vous voulez dire l'instanciation d'un objet DateTime (sur lequel les comparateurs fonctionnent)?
easymoden00b

Vous devez expérimenter. Peut-être qu'il peut trier lorsque vous y mettez updated_at
zhartaunik

D'accord, je vais essayer ... maintenant le plaisir commence à créer un module complexe juste pour utiliser une seule fonction dans un seul fichier de modèle .. magento est tellement stupide parfois: c comme 5 fichiers pour un appel de fonction ..
easymoden00b

En suivant ce modèle, j'ai trié les catégories dans le menu. Fonctionne comme sur des roulettes
zhartaunik

si deux éléments ont la même heure de mise à jour, ils se remplaceront.
easymoden00b
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.