Bạn có thể sử dụng sự kiện checkout_cart_product_add_after
để sửa đổi thông tin hình ảnh sản phẩm.
Đầu tiên trong trang chi tiết sản phẩm của bạn, bạn cần thêm một trường ẩn trong phần thêm vào giỏ hàng giống như:
<input type="hidden" name="[option][front_designurl]" id="front_designurl"/>
Và sử dụng javascript thêm giá trị vào trường cho url hình ảnh được tạo bởi người dùng, giá trị này được lưu trong các info_buyRequest
tùy chọn mục trích dẫn
Chúng tôi phải tạo tệp app/code/Foo/CustomImage/etc/events.xml
để đính kèm người quan sát vào các sự kiện:
- checkout_cart_product_add_after : Sự kiện được kích hoạt trên Thêm vào giỏ hàng
- checkout_cart_product_update_after : Sự kiện được kích hoạt trên Cập nhật giỏ hàng (Để thêm vào giỏ hàng từ trang chỉnh sửa giỏ hàng)
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="checkout_cart_product_add_after">
<observer name="foo_customimage_observer_set_price_for_item_add" instance="Foo\CustomImage\Model\Observer\SetImageForItem"/>
</event>
<event name="checkout_cart_product_update_after">
<observer name="foo_customimage_observer_set_price_for_item_update" instance="Foo\CustomImage\Model\Observer\SetImageForItem"/>
</event>
</config>
Bây giờ đối với logic người quan sát, chúng tôi tạo một tệp tại app/code/Foo/CustomImage/Model/Observer/SetImageForItem.php
<?php
namespace Foo\CustomImage\Model\Observer;
use Magento\Framework\Event\Observer;
use Magento\Framework\Event\ObserverInterface;
use Magento\Quote\Model\Quote\ProductOptionFactory;
use Magento\Quote\Api\Data\ProductOptionExtensionFactory;
use Magento\Catalog\Model\CustomOptions\CustomOptionFactory;
class SetImageForItem implements ObserverInterface
{
/** @var \Magento\Quote\Model\Quote\ProductOptionFactory */
protected $productOptionFactory;
/** @var \Magento\Quote\Api\Data\ProductOptionExtensionFactory */
protected $extensionFactory;
/** @var CustomOptionFactory */
protected $customOptionFactory;
/**
* @param ProductOptionFactory $productOptionFactory
* @param ProductOptionExtensionFactory $extensionFactory
* @param CustomOptionFactory $customOptionFactory
*/
public function __construct(
ProductOptionFactory $productOptionFactory,
ProductOptionExtensionFactory $extensionFactory
CustomOptionFactory $customOptionFactory
) {
$this->productOptionFactory = $productOptionFactory;
$this->extensionFactory = $extensionFactory;
$this->customOptionFactory = $customOptionFactory;
}
public function execute(Observer $observer)
{
/** @var $item \Magento\Quote\Model\Quote\Item */
$item = $observer->getEvent()->getQuoteItem();//Gets the Quote Item Instance
$request = $item->getBuyRequest(); // Gets the posted data sent to "Add to cart" controller action
$this->processOptions($item);
return $this;
}//end execute()
/**
* @inheritDoc
*/
public function processOptions(CartItemInterface $cartItem)
{
$options = $this->getOptions($cartItem);
if (!empty($options) && is_array($options)) {
$this->updateOptionsValues($options);
$productOption = $cartItem->getProductOption()
? $cartItem->getProductOption()
: $this->productOptionFactory->create();
/** @var \Magento\Quote\Api\Data\ProductOptionExtensionInterface $extensibleAttribute */
$extensibleAttribute = $productOption->getExtensionAttributes()
? $productOption->getExtensionAttributes()
: $this->extensionFactory->create();
$extensibleAttribute->setCustomOptions($options);
$productOption->setExtensionAttributes($extensibleAttribute);
$cartItem->setProductOption($productOption);
}
}
/**
* Receive custom option from buy request
*
* @param CartItemInterface $cartItem
* @return array
*/
protected function getOptions(CartItemInterface $cartItem)
{
$buyRequest = !empty($cartItem->getOptionByCode('info_buyRequest'))
? unserialize($cartItem->getOptionByCode('info_buyRequest')->getValue())
: null;
return is_array($buyRequest) && isset($buyRequest['options'])
? $buyRequest['options']
: [];
}
/**
* Update options values
*
* @param array $options
* @return null
*/
protected function updateOptionsValues(array &$options)
{
foreach ($options as $optionId => &$optionValue) {
/** @var \Magento\Catalog\Model\CustomOptions\CustomOption $option */
$option = $this->customOptionFactory->create();
$option->setOptionId($optionId);
if (is_array($optionValue)) {
$optionValue = implode(',', $optionValue);
}
$option->setOptionValue($optionValue);
$optionValue = $option;
}
}
}
Tôi chưa thử mã, nhưng sẽ giúp bạn thêm dữ liệu mới vào tùy chọn sản phẩm của mình.