ショッピングカートの仕分け


7

ショッピングカートでは、商品を追加順に並べ替え、グループ化された商品をアルファベット順に並べる必要があります。


これまでに試したコードを含める可能性はありますか?
Prateek

回答:


11

これを2つの部分で修正する必要があります。最初の部分は、カート内のどの単純な製品がグループ化された製品からのものかを実際に追跡することです。2つ目は並べ替えです。

まずは追跡。sales_flat_quote_itemその情報を保存するための列を1つ追加します。

これを適切に行うには、独自のモジュールを記述します。それに関するチュートリアルは、Tutsplus.comにあります。

インストールスクリプトも必要です。これに関するこのInchooチュートリアルをチェックしてください。

インストールスクリプトに以下を追加します

$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();

これは単純な0または1の値になります。

次に、商品がカートに追加されたときにその値を設定する必要があります。これはオブザーバーと一緒に行うことができます。

次のものを 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>

カートに追加されたときに、これがグループ化された製品であることを知る必要があります。これは、カートに追加フォームの単純な入力フィールドで行います。

以下をモジュールレイアウトXMLに追加します。製品タイプがグループ化されると、入力フィールドが追加されます。

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

そして、入力の存在をチェックするオブザーバークラス。

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

これによりis_grouped、単純な製品がグループ化された製品に由来する場合、テーブルフィールドが1に設定されます。

では、並べ替えに進みましょう。カートの背後にあるブロッククラスはMage_Checkout_Block_Cart、独自のモジュールから書き直す必要があります。これを行うには、次のコードをconfig> globalタグに追加します。config.xml

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

そして、getItemsメソッドはグループ化されたアイテムを除外し、それらをアルファベット順にフィルタリングできます

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

免責事項:テストされていないコードなので、あちこちで微調整が必​​要になる可能性がありますが、一般的には機能するはずです。コメントだけではない場合


3
今のところコメントとしてそれを残して:あなたは新しいフィールドを追加することなく、同じことを達成することができ、データがすでに保存されているため、info_buyRequestオプション:$groupedId = $item->getBuyRequest()->getData('super_product_config')['product_id']
ファビアンSchmengler

1
甘いスイートのインターネットポイントをお楽しみください。Mangelbangel氏
benmarks

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.