/app/code/Magento/Catalog/Controller/Adminhtml/Category/Save.php
PHP | 349 lines | 219 code | 33 blank | 97 comment | 39 complexity | 661112573dd436557670c61cf968111f MD5 | raw file
- <?php
- /**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Catalog\Controller\Adminhtml\Category;
- use Magento\Store\Model\StoreManagerInterface;
- /**
- * Class Save
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Save extends \Magento\Catalog\Controller\Adminhtml\Category
- {
- /**
- * @var \Magento\Framework\Controller\Result\RawFactory
- */
- protected $resultRawFactory;
- /**
- * @var \Magento\Framework\Controller\Result\JsonFactory
- */
- protected $resultJsonFactory;
- /**
- * @var \Magento\Framework\View\LayoutFactory
- */
- protected $layoutFactory;
- /**
- * The list of inputs that need to convert from string to boolean
- * @var array
- */
- protected $stringToBoolInputs = [
- 'custom_use_parent_settings',
- 'custom_apply_to_products',
- 'is_active',
- 'include_in_menu',
- 'is_anchor',
- 'use_default' => ['url_key'],
- 'use_config' => ['available_sort_by', 'filter_price_range', 'default_sort_by']
- ];
- /**
- * @var StoreManagerInterface
- */
- private $storeManager;
- /**
- * Constructor
- *
- * @param \Magento\Backend\App\Action\Context $context
- * @param \Magento\Framework\Controller\Result\RawFactory $resultRawFactory
- * @param \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
- * @param \Magento\Framework\View\LayoutFactory $layoutFactory
- * @param StoreManagerInterface $storeManager
- */
- public function __construct(
- \Magento\Backend\App\Action\Context $context,
- \Magento\Framework\Controller\Result\RawFactory $resultRawFactory,
- \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
- \Magento\Framework\View\LayoutFactory $layoutFactory,
- StoreManagerInterface $storeManager
- ) {
- parent::__construct($context);
- $this->resultRawFactory = $resultRawFactory;
- $this->resultJsonFactory = $resultJsonFactory;
- $this->layoutFactory = $layoutFactory;
- $this->storeManager = $storeManager;
- }
- /**
- * Filter category data
- *
- * @param array $rawData
- * @return array
- */
- protected function _filterCategoryPostData(array $rawData)
- {
- $data = $rawData;
- // @todo It is a workaround to prevent saving this data in category model and it has to be refactored in future
- if (isset($data['image']) && is_array($data['image'])) {
- if (!empty($data['image']['delete'])) {
- $data['image'] = null;
- } else {
- if (isset($data['image'][0]['name']) && isset($data['image'][0]['tmp_name'])) {
- $data['image'] = $data['image'][0]['name'];
- } else {
- unset($data['image']);
- }
- }
- }
- return $data;
- }
- /**
- * Category save
- *
- * @return \Magento\Framework\Controller\ResultInterface
- * @SuppressWarnings(PHPMD.CyclomaticComplexity)
- * @SuppressWarnings(PHPMD.NPathComplexity)
- * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
- */
- public function execute()
- {
- /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
- $resultRedirect = $this->resultRedirectFactory->create();
- $category = $this->_initCategory();
- if (!$category) {
- return $resultRedirect->setPath('catalog/*/', ['_current' => true, 'id' => null]);
- }
- $data['general'] = $this->getRequest()->getPostValue();
- $categoryPostData = $data['general'];
- $isNewCategory = !isset($categoryPostData['entity_id']);
- $categoryPostData = $this->stringToBoolConverting($categoryPostData);
- $categoryPostData = $this->imagePreprocessing($categoryPostData);
- $categoryPostData = $this->dateTimePreprocessing($category, $categoryPostData);
- $storeId = isset($categoryPostData['store_id']) ? $categoryPostData['store_id'] : null;
- $store = $this->storeManager->getStore($storeId);
- $this->storeManager->setCurrentStore($store->getCode());
- $parentId = isset($categoryPostData['parent']) ? $categoryPostData['parent'] : null;
- if ($categoryPostData) {
- $category->addData($this->_filterCategoryPostData($categoryPostData));
- if ($isNewCategory) {
- $parentCategory = $this->getParentCategory($parentId, $storeId);
- $category->setPath($parentCategory->getPath());
- $category->setParentId($parentCategory->getId());
- }
- /**
- * Process "Use Config Settings" checkboxes
- */
- $useConfig = [];
- if (isset($categoryPostData['use_config']) && !empty($categoryPostData['use_config'])) {
- foreach ($categoryPostData['use_config'] as $attributeCode => $attributeValue) {
- if ($attributeValue) {
- $useConfig[] = $attributeCode;
- $category->setData($attributeCode, null);
- }
- }
- }
- $category->setAttributeSetId($category->getDefaultAttributeSetId());
- if (isset($categoryPostData['category_products'])
- && is_string($categoryPostData['category_products'])
- && !$category->getProductsReadonly()
- ) {
- $products = json_decode($categoryPostData['category_products'], true);
- $category->setPostedProducts($products);
- }
- $this->_eventManager->dispatch(
- 'catalog_category_prepare_save',
- ['category' => $category, 'request' => $this->getRequest()]
- );
- /**
- * Check "Use Default Value" checkboxes values
- */
- if (isset($categoryPostData['use_default']) && !empty($categoryPostData['use_default'])) {
- foreach ($categoryPostData['use_default'] as $attributeCode => $attributeValue) {
- if ($attributeValue) {
- $category->setData($attributeCode, null);
- }
- }
- }
- /**
- * Proceed with $_POST['use_config']
- * set into category model for processing through validation
- */
- $category->setData('use_post_data_config', $useConfig);
- try {
- $categoryResource = $category->getResource();
- if ($category->hasCustomDesignTo()) {
- $categoryResource->getAttribute('custom_design_from')->setMaxValue($category->getCustomDesignTo());
- }
- $validate = $category->validate();
- if ($validate !== true) {
- foreach ($validate as $code => $error) {
- if ($error === true) {
- $attribute = $categoryResource->getAttribute($code)->getFrontend()->getLabel();
- throw new \Magento\Framework\Exception\LocalizedException(
- __('Attribute "%1" is required.', $attribute)
- );
- } else {
- throw new \Exception($error);
- }
- }
- }
- $category->unsetData('use_post_data_config');
- $category->save();
- $this->messageManager->addSuccess(__('You saved the category.'));
- } catch (\Magento\Framework\Exception\AlreadyExistsException $e) {
- $this->messageManager->addError($e->getMessage());
- $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
- $this->_getSession()->setCategoryData($categoryPostData);
- } catch (\Magento\Framework\Exception\LocalizedException $e) {
- $this->messageManager->addError($e->getMessage());
- $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
- $this->_getSession()->setCategoryData($categoryPostData);
- } catch (\Exception $e) {
- $this->messageManager->addError(__('Something went wrong while saving the category.'));
- $this->_objectManager->get(\Psr\Log\LoggerInterface::class)->critical($e);
- $this->_getSession()->setCategoryData($categoryPostData);
- }
- }
- $hasError = (bool)$this->messageManager->getMessages()->getCountByType(
- \Magento\Framework\Message\MessageInterface::TYPE_ERROR
- );
- if ($this->getRequest()->getPost('return_session_messages_only')) {
- $category->load($category->getId());
- // to obtain truncated category name
- /** @var $block \Magento\Framework\View\Element\Messages */
- $block = $this->layoutFactory->create()->getMessagesBlock();
- $block->setMessages($this->messageManager->getMessages(true));
- /** @var \Magento\Framework\Controller\Result\Json $resultJson */
- $resultJson = $this->resultJsonFactory->create();
- return $resultJson->setData(
- [
- 'messages' => $block->getGroupedHtml(),
- 'error' => $hasError,
- 'category' => $category->toArray(),
- ]
- );
- }
- $redirectParams = $this->getRedirectParams($isNewCategory, $hasError, $category->getId(), $parentId, $storeId);
- return $resultRedirect->setPath(
- $redirectParams['path'],
- $redirectParams['params']
- );
- }
- /**
- * Image data preprocessing
- *
- * @param array $data
- *
- * @return array
- */
- public function imagePreprocessing($data)
- {
- if (empty($data['image'])) {
- unset($data['image']);
- $data['image']['delete'] = true;
- }
- return $data;
- }
- /**
- * Converting inputs from string to boolean
- *
- * @param array $data
- * @param array $stringToBoolInputs
- *
- * @return array
- */
- public function stringToBoolConverting($data, $stringToBoolInputs = null)
- {
- if (null === $stringToBoolInputs) {
- $stringToBoolInputs = $this->stringToBoolInputs;
- }
- foreach ($stringToBoolInputs as $key => $value) {
- if (is_array($value)) {
- if (isset($data[$key])) {
- $data[$key] = $this->stringToBoolConverting($data[$key], $value);
- }
- } else {
- if (isset($data[$value])) {
- if ($data[$value] === 'true') {
- $data[$value] = true;
- }
- if ($data[$value] === 'false') {
- $data[$value] = false;
- }
- }
- }
- }
- return $data;
- }
- /**
- * Get parent category
- *
- * @param int $parentId
- * @param int $storeId
- *
- * @return \Magento\Catalog\Model\Category
- */
- protected function getParentCategory($parentId, $storeId)
- {
- if (!$parentId) {
- if ($storeId) {
- $parentId = $this->_objectManager->get(
- \Magento\Store\Model\StoreManagerInterface::class
- )->getStore(
- $storeId
- )->getRootCategoryId();
- } else {
- $parentId = \Magento\Catalog\Model\Category::TREE_ROOT_ID;
- }
- }
- return $this->_objectManager->create(\Magento\Catalog\Model\Category::class)->load($parentId);
- }
- /**
- * Get category redirect path
- *
- * @param bool $isNewCategory
- * @param bool $hasError
- * @param int $categoryId
- * @param int $parentId
- * @param int $storeId
- *
- * @return array
- */
- protected function getRedirectParams($isNewCategory, $hasError, $categoryId, $parentId, $storeId)
- {
- $params = ['_current' => true];
- if ($storeId) {
- $params['store'] = $storeId;
- }
- if ($isNewCategory && $hasError) {
- $path = 'catalog/*/add';
- $params['parent'] = $parentId;
- } else {
- $path = 'catalog/*/edit';
- $params['id'] = $categoryId;
- }
- return ['path' => $path, 'params' => $params];
- }
- }