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.