Files
ltsecurityinc/app/code/Amasty/ElasticSearch/Model/Config/QuerySettings.php
T

221 lines
5.7 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\Model\Config;
class QuerySettings extends \Magento\Framework\App\Config\Value
{
/**
* Keys for array configuration usage
*/
public const ATTRIBUTE = 'attribute';
public const WILDCARD = 'wildcard';
public const SPELLING = 'spelling';
public const COMBINING = 'combining';
/**
* Keys for DB storage
*/
public const KEY_WILDCARD = 'w';
public const KEY_SPELLING = 's';
public const KEY_COMBINING = 'c';
/**
* @var \Magento\Framework\Serialize\Serializer\Json
*/
private $serializer;
/**
* @var \Amasty\ElasticSearch\Model\Config\QuerySettingsProcessor
*/
private $processor;
/**
* @inheritdoc
*/
protected function _construct()
{
parent::_construct();
$this->serializer = $this->getData('serializer');
$this->processor = $this->getData('processor');
}
/**
* @inheritdoc
*/
protected function _afterLoad()
{
$value = $this->getValue();
$value = $this->processor->parseLoad($value);
$value = $this->encodeArrayFieldValue($value);
$this->setValue($value);
}
/**
* @inheritdoc
*/
public function beforeSave()
{
$value = $this->getValue();
$value = $this->makeStorableArrayFieldValue($value);
if ($value) {
$this->setValue($value);
} else {
$this->_dataSaveAllowed = false;
}
return $this;
}
/**
* Make value ready for store
*
* @param string|array $value
* @return string
*/
private function makeStorableArrayFieldValue($value)
{
if (!is_array($value)) {
$value = $this->unserializeValue($value);
}
$value = $this->decodeArrayFieldValue($value);
$value = $this->serializeValue($value);
return $value;
}
/**
* Prepare configuration array of all searchable attributes for frontend
*
* @param array $value
* @return array
*/
private function encodeArrayFieldValue(array $value)
{
$result = [];
$attributeCodes = $this->processor->getSearchableAttributeCodes();
foreach ($value as $attributeCode => $data) {
if (in_array($attributeCode, $attributeCodes, true)) {
$result[$attributeCode] = [
self::ATTRIBUTE => $attributeCode,
self::WILDCARD => $data[self::WILDCARD],
self::SPELLING => $data[self::SPELLING],
self::COMBINING => $data[self::COMBINING]
];
}
}
foreach ($attributeCodes as $code) {
if (!isset($result[$code])) {
$result[$code] = [
self::ATTRIBUTE => $code,
self::WILDCARD => 0,
self::SPELLING => 0,
self::COMBINING => 0
];
}
}
return $result;
}
/**
* Create a value from a storable representation
*
* @param int|float|string $value
* @return array
*/
private function unserializeValue($value)
{
$result = [];
if (is_string($value) && !empty($value)) {
$result = $this->serializer->unserialize($value);
}
return $result;
}
/**
* Decode value from used in \Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray
*
* @param array $value
* @return array
*/
private function decodeArrayFieldValue(array $value)
{
unset($value['__empty']);
foreach ($value as $attribute => $data) {
if (!is_array($data) || !array_key_exists(self::COMBINING, $data)) {
unset($value[$attribute]);
}
}
return $value;
}
/**
* Generate a storable representation of a value
*
* @param int|float|string|array $value
* @return string
*/
private function serializeValue($value): string
{
if (is_array($value) && !empty($value)) {
$result = [];
foreach ($value as $attributeCode => $data) {
$wildcard = 0;
if (isset($data[self::WILDCARD])) {
$wildcard = $this->prepareVariable($data[self::WILDCARD]);
}
$spelling = 0;
if (isset($data[self::SPELLING])) {
$spelling = $this->prepareVariable($data[self::SPELLING]);
}
$combing = (int)($data[self::COMBINING] ?? 0);
if ($wildcard || $spelling || $combing) {
$result[$attributeCode] = [
self::KEY_WILDCARD => $wildcard,
self::KEY_SPELLING => $spelling,
self::KEY_COMBINING => $combing
];
}
}
return $this->serializer->serialize($result);
}
return '';
}
/**
* @param string $data
*/
private function prepareVariable($data): int
{
if (strcasecmp($data, 'on') === 0) {
return 1;
}
return (int) $data;
}
/**
* @deprecated moved to separate class
* @see \Amasty\ElasticSearch\Model\Config\QuerySettingsProcessor::getConfigValue
*
* @param string $attributeCode
* @return array|null
*/
public function getConfigValue($attributeCode)
{
return $this->processor->getConfigValue($attributeCode);
}
}