116 lines
4.0 KiB
PHP
Executable File
116 lines
4.0 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* @author Amasty Team
|
|
* @copyright Copyright (c) Amasty (https://www.amasty.com)
|
|
* @package Elastic Search Base for Magento 2
|
|
*/
|
|
|
|
namespace Amasty\ElasticSearch\Controller\Adminhtml\RelevanceRule;
|
|
|
|
use Amasty\ElasticSearch\Api\Data\RelevanceRuleInterface;
|
|
use Amasty\ElasticSearch\Model\Source\RelevanceRuleModificationType;
|
|
use Magento\Framework\Exception\LocalizedException;
|
|
use Magento\Framework\Stdlib\DateTime;
|
|
|
|
class Save extends AbstractRelevance
|
|
{
|
|
/**
|
|
* @inheritdoc
|
|
*/
|
|
public function execute()
|
|
{
|
|
$resultRedirect = $this->resultRedirectFactory->create();
|
|
$rule = (int)$this->getRequest()->getParam(RelevanceRuleInterface::RULE_ID);
|
|
$data = $this->getRequest()->getPostValue();
|
|
|
|
try {
|
|
if ($rule) {
|
|
/** @var \Amasty\ElasticSearch\Model\RelevanceRule $model */
|
|
$model = $this->ruleRepository->get($rule);
|
|
} else {
|
|
$model = $this->ruleFactory->create();
|
|
}
|
|
|
|
$data = $this->prepareData($data, $model);
|
|
$model->setData($data);
|
|
$this->ruleRepository->save($model);
|
|
$this->messageManager->addSuccessMessage(__('You have saved the Rule.'));
|
|
} catch (\Magento\Framework\Exception\AlreadyExistsException $e) {
|
|
$this->messageManager->addErrorMessage(
|
|
__('Relevance Rule with the same term already exists in an associated store.')
|
|
);
|
|
} catch (\Magento\Framework\Exception\NoSuchEntityException $exception) {
|
|
$this->messageManager->addErrorMessage(__('This Relevance Rule no longer exists.'));
|
|
$resultRedirect = $this->resultRedirectFactory->create();
|
|
}
|
|
|
|
return $resultRedirect->setPath('*/*/');
|
|
}
|
|
|
|
/**
|
|
* @param array $data
|
|
* @param \Amasty\ElasticSearch\Model\RelevanceRule $rule
|
|
* @return array
|
|
* @throws \Magento\Framework\Exception\LocalizedException
|
|
*/
|
|
private function prepareData(array $data, \Amasty\ElasticSearch\Model\RelevanceRule $rule)
|
|
{
|
|
if (empty($data[RelevanceRuleInterface::RULE_ID])) {
|
|
$data[RelevanceRuleInterface::RULE_ID] = null;
|
|
}
|
|
|
|
$data[RelevanceRuleInterface::MULTIPLIER] = max(
|
|
min($data[RelevanceRuleInterface::MULTIPLIER], 100),
|
|
1
|
|
);
|
|
|
|
if ($data['modification_type'] === RelevanceRuleModificationType::DECREASE) {
|
|
$data[RelevanceRuleInterface::MULTIPLIER] *= -1;
|
|
}
|
|
|
|
if (isset($data['rule']) && isset($data['rule']['conditions'])) {
|
|
$conditions = $data['rule']['conditions'];
|
|
unset($data['rule']);
|
|
$data[RelevanceRuleInterface::CONDITIONS] = $rule->getConditionsSerialized($conditions);
|
|
}
|
|
|
|
$data[RelevanceRuleInterface::FROM_DATE] = $this->prepareDates($data[RelevanceRuleInterface::FROM_DATE]);
|
|
$data[RelevanceRuleInterface::TO_DATE] = $this->prepareDates($data[RelevanceRuleInterface::TO_DATE]);
|
|
|
|
$data = $this->prepareRuleStatus($data);
|
|
|
|
return $data;
|
|
}
|
|
|
|
private function prepareDates(string $date): ?string
|
|
{
|
|
return $date ? $this->timezone->date($date)->format(DateTime::DATE_PHP_FORMAT) : '';
|
|
}
|
|
|
|
private function prepareRuleStatus(array $data): array
|
|
{
|
|
$websiteId = $data[RelevanceRuleInterface::WEBSITE_ID] ?? false;
|
|
|
|
if ($websiteId) {
|
|
try {
|
|
$website = $this->storeManager->getWebsite($websiteId);
|
|
|
|
if (!empty($data[RelevanceRuleInterface::FROM_DATE])
|
|
&& !empty($data[RelevanceRuleInterface::TO_DATE])
|
|
&& !$this->timezone->isScopeDateInInterval(
|
|
$website,
|
|
$data[RelevanceRuleInterface::FROM_DATE],
|
|
$data[RelevanceRuleInterface::TO_DATE]
|
|
)
|
|
) {
|
|
$data[RelevanceRuleInterface::IS_ENABLED] = false;
|
|
}
|
|
} catch (LocalizedException $e) {
|
|
;// do nothing
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
}
|