Tùy chọn tùy chỉnh chỉ được lưu trữ trên báo giá dưới dạng ID tùy chọn và giá trị. Mỗi khi các tùy chọn được trả về, chúng về cơ bản được nạp lại từ cơ sở dữ liệu.
Nếu bạn sửa đổi các giá trị, bạn sẽ cần phải lưu chúng, và điều đó sẽ đặt chúng cho tất cả mọi người.
Điều đó nói rằng, tôi giải quyết vấn đề bằng cách thêm tùy chọn tùy chỉnh bổ sung với giá trị được sửa đổi khi đang di chuyển, sử dụng trình quan sát sự kiện. Đối với điều này tôi sử dụng các tùy chọn bổ sung.
Sau đó, tôi xóa tùy chọn tùy chỉnh gốc khỏi mục báo giá. Lên đến 1,4 Magento đã chăm sóc phần còn lại, nhưng kể từ đó bạn cần phải sao chép các tùy chọn bổ sung cho mục đặt hàng theo cách thủ công, và cũng cần phải cẩn thận nó được thiết lập lại nếu một mục được sắp xếp lại.
Vì vậy, đây là một cấu hình quan sát mẫu.
<frontend>
<events>
<checkout_cart_product_add_after>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>checkoutCartProductAddAfter</method>
</customoptions>
</observers>
</checkout_cart_product_add_after>
<sales_convert_quote_item_to_order_item>
<observers>
<customoptions>
<type>singleton</type>
<class>customoptions/observer</class>
<method>salesConvertQuoteItemToOrderItem</method>
</customoptions>
</observers>
</sales_convert_quote_item_to_order_item>
</events>
</frontend>
Phần còn lại được xử lý trong lớp quan sát viên.
/**
* Add additional options to order item product options (this is missing in the core)
*
* @param Varien_Event_Observer $observer
*/
public function salesConvertQuoteItemToOrderItem(Varien_Event_Observer $observer)
{
$quoteItem = $observer->getItem();
if ($additionalOptions = $quoteItem->getOptionByCode('additional_options')) {
$orderItem = $observer->getOrderItem();
$options = $orderItem->getProductOptions();
$options['additional_options'] = unserialize($additionalOptions->getValue());
$orderItem->setProductOptions($options);
}
}
/**
* Manipulate the custom product options
*
* @param Varien_Event_Observer $observer
* @return void
*/
public function checkoutCartProductAddAfter(Varien_Event_Observer $observer)
{
$item = $observer->getQuoteItem();
$infoArr = array();
if ($info = $item->getProduct()->getCustomOption('info_buyRequest')) {
$infoArr = unserialize($info->getValue());
}
// Set additional options in case of a reorder
if ($infoArr && isset($infoArr['additional_options'])) {
// An additional options array is set on the buy request - this is a reorder
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($infoArr['additional_options'])
));
return;
}
$options = Mage::helper('catalog/product_configuration')->getCustomOptions($item);
foreach ($options as $option)
{
// The only way to identify a custom option without
// hardcoding ID's is the label :-(
// But manipulating options this way is hackish anyway
if ('Size' === $option['label'])
{
$optId = $option['option_id'];
// Add replacement custom option with modified value
$additionalOptions = array(array(
'code' => 'my_code',
'label' => $option['label'],
'value' => $option['value'] . ' YOUR EXTRA TEXT',
'print_value' => $option['print_value'] . ' YOUR EXTRA TEXT',
));
$item->addOption(array(
'code' => 'additional_options',
'value' => serialize($additionalOptions),
));
// Update info_buyRequest to reflect changes
if ($infoArr &&
isset($infoArr['options']) &&
isset($infoArr['options'][$optId]))
{
// Remove real custom option
unset($infoArr['options'][$optId]);
// Add replacement additional option for reorder (see above)
$infoArr['additional_options'] = $additionalOptions;
$info->setValue(serialize($infoArr));
$item->addOption($info);
}
// Remove real custom option id from option_ids list
if ($optionIdsOption = $item->getProduct()->getCustomOption('option_ids')) {
$optionIds = explode(',', $optionIdsOption->getValue());
if (false !== ($idx = array_search($optId, $optionIds))) {
unset($optionIds[$idx]);
$optionIdsOption->setValue(implode(',', $optionIds));
$item->addOption($optionIdsOption);
}
}
// Remove real custom option
$item->removeOption('option_' . $optId);
}
}
Đây là tóm tắt. Thêm lỗi kiểm tra và chăm sóc các trường hợp đặc biệt như thêm cùng một sản phẩm vào giỏ hàng một lần nữa khi cần thiết.
Hy vọng điều này sẽ giúp bạn bắt đầu làm việc với các tùy chọn sản phẩm tùy chỉnh. Không phải là một nửa xấu một khi bạn làm quen với họ.
Bạn tiết kiệm dữ liệu bổ sung bằng cách nào đó? Khi bạn kiểm tra Quản trị viên cho đơn hàng, vòng eo, ngực, chiều dài, v.v ... có xuất hiện không? – seanbreeden
Xin lỗi, nếu tôi chưa đủ rõ ràng. Tôi chỉ hiển thị thông tin này nếu javascript được mã hóa cứng trong tệp phtml. ví dụ: nếu (val == nhỏ) thì hiển thị Eo 30, Ngực 36, Chiều dài 42 ... Bây giờ tôi muốn thêm thông tin bổ sung này vào thứ tự để nó được lưu trữ cho mỗi mục. – Farrukh