回答:
これを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);
}
}
免責事項:テストされていないコードなので、あちこちで微調整が必要になる可能性がありますが、一般的には機能するはずです。コメントだけではない場合
info_buyRequest
オプション:$groupedId = $item->getBuyRequest()->getData('super_product_config')['product_id']