Warenkorbsortierung

7

Im Warenkorb müssen wir die Produkte in der Reihenfolge sortieren, in der sie hinzugefügt wurden, und die gruppierten Produkte müssen alphabetisch sortiert werden.

Poonam
quelle
Gibt es eine Möglichkeit, den Code, den Sie bisher ausprobiert haben, aufzunehmen?
Prateek

Antworten:

11

Wir müssen dies in 2 Teilen beheben. Der erste Teil verfolgt tatsächlich, welche einfachen Produkte im Warenkorb von gruppierten Produkten stammen. Das zweite ist die Sortierung.

Zuerst für die Verfolgung. Wir werden eine zusätzliche Spalte hinzufügen sales_flat_quote_item, um diese Informationen zu speichern.

Um dies richtig zu machen, schreiben Sie Ihr eigenes Modul, ein Tutorial dazu finden Sie hier auf Tutsplus.com .

Sie benötigen außerdem ein Installationsskript. Schauen Sie sich dieses Inchoo-Tutorial dazu an.

Fügen Sie Folgendes in Ihr Installationsskript ein

$installer = new Mage_Sales_Model_Resource_Setup('core_setup');

$installer->addAttribute('quote_item', 'is_grouped', array(
    'type'     => Varien_Db_Ddl_Table::TYPE_SMALLINT,
    'visible'  => false,
    'required' => false,
    'default'  => 0
));

$installer->endSetup();

Dies ist ein einfacher 0- oder 1- Wert.

Jetzt müssen wir diesen Wert festlegen, wenn ein Produkt in den Warenkorb gelegt wird. Wir können dies mit einem Beobachter tun.

Fügen Sie Folgendes in Ihr config.xml

<sales_quote_item_set_product>
    <observers>
        <[namespace]_[module]_sales_quote_item_set_product>
            <class>[Namespace]_[Module]_Model_Observer</class>
            <method>salesQuoteItemSetProduct</method>
        </[namespace]_[module]_sales_quote_item_set_product>
    </observers>
</sales_quote_item_set_product>

Jetzt müssen wir wissen, wann dies in den Warenkorb gelegt wurde. Dies war ein gruppiertes Produkt. Wir machen das mit einem einfachen Eingabefeld im Formular " In den Warenkorb" .

Fügen Sie Folgendes in Ihr Modul-Layout-XML ein. Es wird ein Eingabefeld hinzugefügt, wenn der Produkttyp gruppiert wird.

<?xml version="1.0"?>
<layout version="0.1.0">
    <PRODUCT_TYPE_grouped>
        <reference name="product_options_wrapper">
            <block type="core/text" name="isgrouped.input">
                <action method="setText"><text><![CDATA[<input type="hidden" name="isgrouped" value="1"/>]]></text></action>
            </block>
        </reference>
    </PRODUCT_TYPE_grouped>
</layout>

Und eine Beobachterklasse, die das Vorhandensein der Eingabe überprüft.

class [Namespace]_[Module]_Model_Observer
{
    public function salesQuoteItemSetProduct($o)
    {
        $this->_setIsGrouped($o);
        return $this;
    }

    protected function _setIsGrouped($o)
    {
        $isGrouped = (int)$this->getRequest()->getPost('isgrouped');
        if ($isGrouped) {
            $quoteItem = $o->getQuoteItem();
            $quoteItem->setIsGrouped($isGrouped);
        }
    }
}

Dadurch wird das Tabellenfeld is_groupedauf 1 gesetzt, wenn das einfache Produkt aus einem gruppierten Produkt stammt.

Nun zur Sortierung! Die Blockklasse hinter dem Wagen ist die, Mage_Checkout_Block_Cartdie wir aus unserem eigenen Modul neu schreiben müssen. Sie können dies tun, indem Sie dem Tag config> globalin Ihrem Folgendes hinzufügenconfig.xml

<blocks>
    <checkout>
        <rewrite>
            <cart>[Namespace]_[Module]_Block_Checkout_Cart</cart>
        </rewrite>
    </checkout>
</blocks>

Die getItemsMethode kann nun die gruppierten Elemente herausfiltern und alphabetisch filtern

class [Namespace]_[Module]_Block_Checkout_Cart extends Mage_Checkout_Block_Cart
{

    /**
     * Return customer quote items
     *
     * @return array
     */
    public function getItems()
    {
        if ($this->getCustomItems()) {
            return $this->getCustomItems();
        }

        $grouped = [];
        $items = parent::getItems();

        /**
         * Filter all the grouped items out to sort them
         */
        foreach ($items as $i => $item) {
            if ($item->getIsGrouped() == 1) {
                $grouped["{$item->getName()}{$item->getId()}"] = $item;
                unset($items[$i]);
            }
        }

        ksort($grouped, SORT_STRING); // sort key (which is name) alphabetically

        return array_merge($grouped, $items);
    }
}

HAFTUNGSAUSSCHLUSS: Ungetesteter Code muss möglicherweise hier oder da angepasst werden, sollte aber im Allgemeinen funktionieren. Wenn nicht nur kommentieren

Sander Mangel
quelle
3
Lassen Sie es vorerst als Kommentar: Sie können dasselbe erreichen, ohne ein neues Feld hinzuzufügen, da die Daten bereits in der info_buyRequestOption gespeichert sind :$groupedId = $item->getBuyRequest()->getData('super_product_config')['product_id']
Fabian Schmengler
1
genießen Sie diese süßen süßen Internetpunkte Herr Mangelbangel
Benmarks