![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-catalog/Model/CustomOptions/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Catalog\Model\CustomOptions; use Magento\Framework\DataObject; use Magento\Quote\Api\Data\CartItemInterface; use Magento\Quote\Model\Quote\Item\CartItemProcessorInterface; use Magento\Quote\Api\Data\ProductOptionExtensionFactory; use Magento\Quote\Model\Quote\ProductOptionFactory; class CustomOptionProcessor implements CartItemProcessorInterface { /** * @var \Magento\Framework\DataObject\Factory */ protected $objectFactory; /** * @var \Magento\Quote\Model\Quote\ProductOptionFactory */ protected $productOptionFactory; /** * @var \Magento\Quote\Api\Data\ProductOptionExtensionFactory */ protected $extensionFactory; /** * @var \Magento\Catalog\Model\CustomOptions\CustomOptionFactory */ protected $customOptionFactory; /** * @var \Magento\Catalog\Model\Product\Option\UrlBuilder */ private $urlBuilder; /** * Serializer interface instance. * * @var \Magento\Framework\Serialize\Serializer\Json */ private $serializer; /** * @param DataObject\Factory $objectFactory * @param ProductOptionFactory $productOptionFactory * @param ProductOptionExtensionFactory $extensionFactory * @param CustomOptionFactory $customOptionFactory * @param \Magento\Framework\Serialize\Serializer\Json|null $serializer */ public function __construct( \Magento\Framework\DataObject\Factory $objectFactory, \Magento\Quote\Model\Quote\ProductOptionFactory $productOptionFactory, \Magento\Quote\Api\Data\ProductOptionExtensionFactory $extensionFactory, \Magento\Catalog\Model\CustomOptions\CustomOptionFactory $customOptionFactory, \Magento\Framework\Serialize\Serializer\Json $serializer = null ) { $this->objectFactory = $objectFactory; $this->productOptionFactory = $productOptionFactory; $this->extensionFactory = $extensionFactory; $this->customOptionFactory = $customOptionFactory; $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Serialize\Serializer\Json::class); } /** * @inheritDoc */ public function convertToBuyRequest(CartItemInterface $cartItem) { if ($cartItem->getProductOption() && $cartItem->getProductOption()->getExtensionAttributes() && $cartItem->getProductOption()->getExtensionAttributes()->getCustomOptions()) { $customOptions = $cartItem->getProductOption()->getExtensionAttributes()->getCustomOptions(); if (!empty($customOptions) && is_array($customOptions)) { $requestData = []; foreach ($customOptions as $option) { $requestData['options'][$option->getOptionId()] = $option->getOptionValue(); } return $this->objectFactory->create($requestData); } } return null; } /** * @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); } return $cartItem; } /** * Receive custom option from buy request * * @param CartItemInterface $cartItem * @return array */ protected function getOptions(CartItemInterface $cartItem) { $buyRequest = !empty($cartItem->getOptionByCode('info_buyRequest')) ? $this->serializer->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 = $this->processFileOptionValue($optionValue); $optionValue = $this->processDateOptionValue($optionValue); $optionValue = implode(',', $optionValue); } $option->setOptionValue($optionValue); $optionValue = $option; } } /** * Returns option value with file built URL * * @param array $optionValue * @return array */ private function processFileOptionValue(array $optionValue) { if (array_key_exists('url', $optionValue) && array_key_exists('route', $optionValue['url']) && array_key_exists('params', $optionValue['url']) ) { $optionValue['url'] = $this->getUrlBuilder()->getUrl( $optionValue['url']['route'], $optionValue['url']['params'] ); } return $optionValue; } /** * Returns date option value only with 'date_internal data * * @param array $optionValue * @return array */ private function processDateOptionValue(array $optionValue) { if (array_key_exists('date_internal', $optionValue) ) { $closure = function ($key) { return $key === 'date_internal'; }; $optionValue = array_filter($optionValue, $closure, ARRAY_FILTER_USE_KEY); } return $optionValue; } /** * @return \Magento\Catalog\Model\Product\Option\UrlBuilder * * @deprecated 101.0.0 */ private function getUrlBuilder() { if ($this->urlBuilder === null) { $this->urlBuilder = \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Catalog\Model\Product\Option\UrlBuilder::class); } return $this->urlBuilder; } }