Câu trả lời:
Chúng tôi sẽ cần sửa lỗi này trong 2 phần. Phần đầu tiên thực sự là theo dõi những sản phẩm đơn giản trong giỏ hàng đến từ các sản phẩm được nhóm. Thứ hai là phân loại.
Đầu tiên cho việc theo dõi. Chúng tôi sẽ thêm một cột bổ sung sales_flat_quote_item
để lưu trữ thông tin đó.
Để làm điều này đúng cách viết mô-đun của riêng bạn, một hướng dẫn về điều bạn có thể tìm thấy ở đây trên Tutsplus.com .
Bạn cũng sẽ cần một tập lệnh cài đặt. Kiểm tra hướng dẫn Inchoo này về điều đó.
Thêm phần sau vào tập lệnh cài đặt của bạn
$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();
Đây sẽ là một giá trị 0 hoặc 1 đơn giản .
Bây giờ chúng ta cần đặt giá trị đó khi một sản phẩm được thêm vào giỏ hàng. Chúng ta có thể làm điều này với một người quan sát.
Thêm vào sau đây trong của bạn 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>
Bây giờ chúng ta cần biết khi thêm vào giỏ hàng, đây là một sản phẩm được nhóm lại. Chúng tôi sẽ làm điều đó với một trường nhập liệu đơn giản trong biểu mẫu thêm vào giỏ hàng .
Thêm phần sau vào bố cục mô-đun XML của bạn. Nó sẽ thêm một trường đầu vào khi loại sản phẩm được nhóm.
<?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>
Và một lớp quan sát kiểm tra sự hiện diện của đầu vào.
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);
}
}
}
Điều này sẽ đặt trường bảng is_grouped
thành 1 khi sản phẩm đơn giản xuất phát từ một sản phẩm được nhóm.
Bây giờ để phân loại! Lớp khối đằng sau giỏ hàng Mage_Checkout_Block_Cart
mà chúng ta sẽ cần phải viết lại từ mô-đun của chính chúng ta. Bạn có thể làm điều đó bằng cách thêm dòng sau vào thẻ config
> global
trongconfig.xml
<blocks>
<checkout>
<rewrite>
<cart>[Namespace]_[Module]_Block_Checkout_Cart</cart>
</rewrite>
</checkout>
</blocks>
Và getItems
phương thức bây giờ có thể lọc ra các mục được nhóm và lọc chúng theo thứ tự bảng chữ cái
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);
}
}
TUYÊN BỐ TỪ CHỐI: mã chưa được kiểm tra vì vậy có thể cần một số điều chỉnh ở đây hoặc ở đó nhưng nó sẽ hoạt động chung. Nếu không chỉ bình luận
info_buyRequest
tùy chọn:$groupedId = $item->getBuyRequest()->getData('super_product_config')['product_id']