2012-06-19 48 views
6

Tôi cần mở rộng giỏ hàng Magento để bao gồm thêm một bước cho một công cụ định vị cửa hàng. Tôi hiểu rằng tôi cần phải ghi đè lên bộ điều khiển lõi OnePage (Mage_Checkout_OnepageController) và chặn (Mage_Checkout_Block_Onepage) nhưng cần phải làm gì liên quan đến việc theo dõi thông tin bổ sung (ví dụ: tùy chọn đã chọn của người dùng từ bước tùy chỉnh của tôi).Mở rộng Giỏ hàng Magento

Trả lời

15

Có một số bước cần thiết ở đây để có được toàn bộ giải pháp.

Đầu tiên, tạo mô-đun mới. Sử dụng ModuleCreator nếu bạn muốn.

Sau đó, viết setup script trong mô-đun của bạn để thêm các trường mới vào cấu trúc thuộc tính của Magento, ví dụ: :

$setup = new Mage_Sales_Model_Mysql4_Setup('core_setup'); 
$setup->startSetup(); 

$setup->addAttribute('quote', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('order', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('invoice', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 
$setup->addAttribute('creditmemo', 'my_attribute', array('type' => 'varchar', 'visible' => false, 'required' => false)); 

Lưu ý việc sử dụng các Mage_Sales_Model_Mysql4_Setup để thêm các lĩnh vực cho phù hợp sales_flat_quotesales_flat_order bảng.

Bây giờ, chèn các giá trị sau trong hồ sơ của module của bạn config.xml:

<global> 

    <fieldsets> 
     <sales_convert_quote> 
      <my_attribute> 
       <to_order>*</to_order> 
      </my_attribute> 
     </sales_convert_quote> 
     <sales_convert_order> 
      <my_attribute> 
       <to_cm>*</to_cm> 
       <to_invoice>*</to_invoice> 
      </my_attribute> 
     </sales_convert_order> 
    </fieldsets> 

Đó sẽ hướng dẫn Magento để sao chép các giá trị của lĩnh vực tùy chỉnh của bạn từ báo giá để đặt hàng cho hóa đơn và credit_memo vv

Sau đó, trong mã khối/bộ điều khiển tùy chỉnh của bạn, bạn sẽ có thể sử dụng getters và setters ma thuật của Magento để duy trì các giá trị.

$oQuote = Mage::getSingleton('checkout/session')->getQuote(); 
$oQuote->setMyAttribute('some_value'); 
$oQuote->save(); 

Bạn sẽ thấy cột và giá trị mới được lưu trong sales_flat_quote. Sau đó, khi khách hàng hoàn tất thanh toán, cùng một giá trị sẽ được lưu trong sales_flat_order.

Lưu ý rằng mã trên có thể được mở rộng để làm việc cho quote_itemorder_item bởi chỉ cần thay đổi quote-quote_item vv, tuy nhiên, nếu bạn muốn lưu các giá trị đã được thiết lập trên các sản phẩm của bạn thuộc tính, sau đó một số công việc phụ là bắt buộc.

Chèn một khối mới của XML vào config.xml của bạn (một lần nữa bên trong nút toàn cầu):

<sales> 
     <quote> 
      <item> 
       <product_attributes> 
        <my_attribute /> 
       </product_attributes> 
      </item> 
     </quote> 
    </sales> 

đâu my_attribute là mã thuộc tính trên mô hình sản phẩm. Điều đó sẽ làm cho my_attribute có sẵn trên sản phẩm được liên kết, vì vậy bạn có thể truy cập vào sản phẩm đó qua

$oQuoteItem->getProduct()->getMyAttribute() 

mà không cần thực hiện đầy đủ Mage::getModel('catalog/product')->load($oQuoteItem->getProductId()). Điều này hiệu quả hơn nhiều.

Sau đó, bạn sẽ cần một người quan sát để sao chép các giá trị từ đối tượng sản phẩm sang đối tượng quote_item. Vì vậy, tuyên bố quan sát của bạn trong config.xml:

<events> 
     <sales_quote_item_set_product> 
      <observers> 
       <quoteitem_set_custom_data> 
        <type>singleton</type> 
        <class>mymodule/observer</class> 
        <method>setCustomDataOnQuoteItem</method> 
       </quoteitem_set_custom_data> 
      </observers> 
     </sales_quote_item_set_product> 
    <events> 

và viết mã trong lớp quan sát của bạn như thế này:

public function setCustomDataOnQuoteItem($oObserver){ 
    $oProduct = $oObserver->getProduct(); 
    $oQuoteItem = $oObserver->getQuoteItem(); 
    foreach(array('my_attribute') as $vAttributeCode){ 
     $oQuoteItem->setData($vAttributeCode,$oProduct->getData($vAttributeCode)); 
    } 
} 
+0

Tại sao không ai tạo một bài đăng blog càng rõ ràng và đầy đủ như bạn đã làm ?? Tôi đã dành 2h để tìm câu trả lời của bạn! Cám ơn ! – LittleBigDev

Các vấn đề liên quan