![]() 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-rule/Model/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ namespace Magento\Rule\Model; use Magento\Framework\Api\AttributeValueFactory; use Magento\Framework\Api\ExtensionAttributesFactory; /** * Abstract Rule entity data model * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * phpcs:disable Magento2.Classes.AbstractApi * @api * @since 100.0.2 */ abstract class AbstractModel extends \Magento\Framework\Model\AbstractExtensibleModel { /** * Store rule combine conditions model * * @var \Magento\Rule\Model\Condition\Combine */ protected $_conditions; /** * Store rule actions model * * @var \Magento\Rule\Model\Action\Collection */ protected $_actions; /** * Store rule form instance * * @var \Magento\Framework\Data\Form */ protected $_form; /** * Is model can be deleted flag * * @var bool */ protected $_isDeleteable = true; /** * Is model readonly * * @var bool */ protected $_isReadonly = false; /** * @var \Magento\Framework\Serialize\Serializer\Json * @since 100.2.0 */ protected $serializer; /** * Getter for rule combine conditions instance * * @return \Magento\Rule\Model\Condition\Combine */ abstract public function getConditionsInstance(); /** * Getter for rule actions collection instance * * @return \Magento\Rule\Model\Action\Collection */ abstract public function getActionsInstance(); /** * Form factory * * @var \Magento\Framework\Data\FormFactory */ protected $_formFactory; /** * Timezone instance * * @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface */ protected $_localeDate; /** * AbstractModel constructor * * @param \Magento\Framework\Model\Context $context * @param \Magento\Framework\Registry $registry * @param \Magento\Framework\Data\FormFactory $formFactory * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate * @param \Magento\Framework\Model\ResourceModel\AbstractResource|null $resource * @param \Magento\Framework\Data\Collection\AbstractDb|null $resourceCollection * @param array $data * @param ExtensionAttributesFactory|null $extensionFactory * @param AttributeValueFactory|null $customAttributeFactory * @param \Magento\Framework\Serialize\Serializer\Json $serializer * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\Model\Context $context, \Magento\Framework\Registry $registry, \Magento\Framework\Data\FormFactory $formFactory, \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Magento\Framework\Model\ResourceModel\AbstractResource $resource = null, \Magento\Framework\Data\Collection\AbstractDb $resourceCollection = null, array $data = [], ExtensionAttributesFactory $extensionFactory = null, AttributeValueFactory $customAttributeFactory = null, \Magento\Framework\Serialize\Serializer\Json $serializer = null ) { $this->_formFactory = $formFactory; $this->_localeDate = $localeDate; $this->serializer = $serializer ?: \Magento\Framework\App\ObjectManager::getInstance()->get( \Magento\Framework\Serialize\Serializer\Json::class ); parent::__construct( $context, $registry, $extensionFactory ?: $this->getExtensionFactory(), $customAttributeFactory ?: $this->getCustomAttributeFactory(), $resource, $resourceCollection, $data ); } /** * Prepare data before saving * * @return $this * @throws \Magento\Framework\Exception\LocalizedException * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function beforeSave() { // Check if discount amount not negative if ($this->hasDiscountAmount()) { if ((int)$this->getDiscountAmount() < 0) { throw new \Magento\Framework\Exception\LocalizedException(__('Please choose a valid discount amount.')); } } // Serialize conditions if ($this->getConditions()) { $this->setConditionsSerialized($this->serializer->serialize($this->getConditions()->asArray())); $this->_conditions = null; } // Serialize actions if ($this->getActions()) { $this->setActionsSerialized($this->serializer->serialize($this->getActions()->asArray())); $this->_actions = null; } /** * Prepare website Ids if applicable and if they were set as string in comma separated format. * Backwards compatibility. */ if ($this->hasWebsiteIds()) { $websiteIds = $this->getWebsiteIds(); if (is_string($websiteIds) && !empty($websiteIds)) { $this->setWebsiteIds(explode(',', $websiteIds)); } } /** * Prepare customer group Ids if applicable and if they were set as string in comma separated format. * Backwards compatibility. */ if ($this->hasCustomerGroupIds()) { $groupIds = $this->getCustomerGroupIds(); if (is_string($groupIds) && !empty($groupIds)) { $this->setCustomerGroupIds(explode(',', $groupIds)); } } parent::beforeSave(); return $this; } /** * Set rule combine conditions model * * @param \Magento\Rule\Model\Condition\Combine $conditions * @return $this */ public function setConditions($conditions) { $this->_conditions = $conditions; return $this; } /** * Retrieve rule combine conditions model * * @return \Magento\Rule\Model\Condition\Combine */ public function getConditions() { if (empty($this->_conditions)) { $this->_resetConditions(); } // Load rule conditions if it is applicable if ($this->hasConditionsSerialized()) { $conditions = $this->getConditionsSerialized(); if (!empty($conditions)) { $conditions = $this->serializer->unserialize($conditions); if (is_array($conditions) && !empty($conditions)) { $this->_conditions->loadArray($conditions); } } $this->unsConditionsSerialized(); } return $this->_conditions; } /** * Set rule actions model * * @param \Magento\Rule\Model\Action\Collection $actions * @return $this */ public function setActions($actions) { $this->_actions = $actions; return $this; } /** * Retrieve rule actions model * * @return \Magento\Rule\Model\Action\Collection */ public function getActions() { if (!$this->_actions) { $this->_resetActions(); } // Load rule actions if it is applicable if ($this->hasActionsSerialized()) { $actions = $this->getActionsSerialized(); if (!empty($actions)) { $actions = $this->serializer->unserialize($actions); if (is_array($actions) && !empty($actions)) { $this->_actions->loadArray($actions); } } $this->unsActionsSerialized(); } return $this->_actions; } /** * Reset rule combine conditions * * @param null|\Magento\Rule\Model\Condition\Combine $conditions * @return $this */ protected function _resetConditions($conditions = null) { if (null === $conditions) { $conditions = $this->getConditionsInstance(); } $conditions->setRule($this)->setId('1')->setPrefix('conditions'); $this->setConditions($conditions); return $this; } /** * Reset rule actions * * @param null|\Magento\Rule\Model\Action\Collection $actions * @return $this */ protected function _resetActions($actions = null) { if (null === $actions) { $actions = $this->getActionsInstance(); } $actions->setRule($this)->setId('1')->setPrefix('actions'); $this->setActions($actions); return $this; } /** * Rule form getter * * @return \Magento\Framework\Data\Form */ public function getForm() { if (!$this->_form) { $this->_form = $this->_formFactory->create(); } return $this->_form; } /** * Initialize rule model data from array * * @param array $data * @return $this */ public function loadPost(array $data) { $arr = $this->_convertFlatToRecursive($data); if (isset($arr['conditions'])) { $this->getConditions()->setConditions([])->loadArray($arr['conditions'][1]); } if (isset($arr['actions'])) { $this->getActions()->setActions([])->loadArray($arr['actions'][1], 'actions'); } return $this; } /** * Set specified data to current rule. * Set conditions and actions recursively. * Convert dates into \DateTime. * * @param array $data * @return array * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function _convertFlatToRecursive(array $data) { $arr = []; foreach ($data as $key => $value) { if (($key === 'conditions' || $key === 'actions') && is_array($value)) { foreach ($value as $id => $data) { $path = explode('--', $id); $node = & $arr; for ($i = 0, $l = count($path); $i < $l; $i++) { if (!isset($node[$key][$path[$i]])) { $node[$key][$path[$i]] = []; } $node = & $node[$key][$path[$i]]; } foreach ($data as $k => $v) { $node[$k] = $v; } } } else { /** * Convert dates into \DateTime */ if (in_array($key, ['from_date', 'to_date'], true) && $value) { $value = new \DateTime($value); } $this->setData($key, $value); } } return $arr; } /** * Validate rule conditions to determine if rule can run * * @param \Magento\Framework\DataObject $object * @return bool */ public function validate(\Magento\Framework\DataObject $object) { return $this->getConditions()->validate($object); } /** * Validate rule data * * @param \Magento\Framework\DataObject $dataObject * @return bool|string[] - return true if validation passed successfully. Array with errors description otherwise * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function validateData(\Magento\Framework\DataObject $dataObject) { $result = []; $fromDate = $toDate = null; if ($dataObject->hasFromDate() && $dataObject->hasToDate()) { $fromDate = $dataObject->getFromDate(); $toDate = $dataObject->getToDate(); } if ($fromDate && $toDate) { $fromDate = new \DateTime($fromDate); $toDate = new \DateTime($toDate); if ($fromDate > $toDate) { $result[] = __('End Date must follow Start Date.'); } } if ($dataObject->hasWebsiteIds()) { $websiteIds = $dataObject->getWebsiteIds(); if (empty($websiteIds)) { $result[] = __('Please specify a website.'); } } if ($dataObject->hasCustomerGroupIds()) { $customerGroupIds = $dataObject->getCustomerGroupIds(); if (empty($customerGroupIds)) { $result[] = __('Please specify Customer Groups.'); } } return !empty($result) ? $result : true; } /** * Check availability to delete rule * * @return bool * @codeCoverageIgnore */ public function isDeleteable() { return $this->_isDeleteable; } /** * Set is rule can be deleted flag * * @param bool $value * @return $this * @codeCoverageIgnore */ public function setIsDeleteable($value) { $this->_isDeleteable = (bool)$value; return $this; } /** * Check if rule is readonly * * @return bool * @codeCoverageIgnore */ public function isReadonly() { return $this->_isReadonly; } /** * Set is readonly flag to rule * * @param bool $value * @return $this * @codeCoverageIgnore */ public function setIsReadonly($value) { $this->_isReadonly = (bool)$value; return $this; } /** * Get rule associated website Ids * * @return array */ public function getWebsiteIds() { if (!$this->hasWebsiteIds()) { $websiteIds = $this->_getResource()->getWebsiteIds($this->getId()); $this->setData('website_ids', (array)$websiteIds); } return $this->_getData('website_ids'); } /** * Get extension factory * * @return \Magento\Framework\Api\ExtensionAttributesFactory * @deprecated 100.1.0 */ private function getExtensionFactory() { return \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Api\ExtensionAttributesFactory::class); } /** * Get custom attribute factory * * @return \Magento\Framework\Api\AttributeValueFactory * @deprecated 100.1.0 */ private function getCustomAttributeFactory() { return \Magento\Framework\App\ObjectManager::getInstance() ->get(\Magento\Framework\Api\AttributeValueFactory::class); } }