File: /var/www/vhost/disk-apps/magento.bikenow.co/vendor/magento/module-rule/Model/AbstractModel.php
<?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);
}
}