132 lines
3.2 KiB
PHP
Executable File
132 lines
3.2 KiB
PHP
Executable File
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
/**
|
|
* @author Amasty Team
|
|
* @copyright Copyright (c) Amasty (https://www.amasty.com)
|
|
* @package Elastic Search Base for Magento 2
|
|
*/
|
|
|
|
namespace Amasty\ElasticSearch\Model\Rule\Condition;
|
|
|
|
use Magento\Catalog\Model\ResourceModel\Product\Collection as ProductCollection;
|
|
use Magento\Framework\App\ResourceConnection;
|
|
use Magento\Framework\Locale\FormatInterface;
|
|
use Magento\Framework\Model\AbstractModel;
|
|
use Magento\Framework\Phrase;
|
|
use Magento\Rule\Model\Condition\AbstractCondition;
|
|
use Magento\Rule\Model\Condition\Context;
|
|
|
|
class Bestsellers extends AbstractCondition implements CustomConditionInterface
|
|
{
|
|
private const FLAG = 'sorting_bestseller';
|
|
private const BESTSELLER_TABLE = 'amasty_sorting_bestsellers';
|
|
|
|
/**
|
|
* @var FormatInterface
|
|
*/
|
|
private $format;
|
|
|
|
/**
|
|
* @var ResourceConnection
|
|
*/
|
|
private $resource;
|
|
|
|
public function __construct(
|
|
Context $context,
|
|
FormatInterface $format,
|
|
ResourceConnection $resource,
|
|
array $data = []
|
|
) {
|
|
parent::__construct($context, $data);
|
|
$this->format = $format;
|
|
$this->resource = $resource;
|
|
}
|
|
|
|
/**
|
|
* @param ProductCollection $collection
|
|
* @return void
|
|
*/
|
|
public function collectValidatedAttributes(ProductCollection $collection): void
|
|
{
|
|
if (!$collection->getFlag(self::FLAG)) {
|
|
$collection->setFlag(self::FLAG);
|
|
$bestSellerTable = $this->resource->getTableName(self::BESTSELLER_TABLE);
|
|
|
|
if ($this->resource->getConnection()->isTableExists($bestSellerTable)) {
|
|
$collection->getSelect()->joinLeft(
|
|
['bestseller' => $bestSellerTable],
|
|
sprintf(
|
|
'e.entity_id = bestseller.product_id AND bestseller.store_id = %s',
|
|
$collection->getStoreId()
|
|
),
|
|
['qty_ordered']
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
public function validate(AbstractModel $model): bool
|
|
{
|
|
$attribute = $this->getAttribute();
|
|
|
|
if ($model->hasData($attribute) && $model->getData($attribute) === null) {
|
|
return false;
|
|
}
|
|
|
|
return parent::validate($model);
|
|
}
|
|
|
|
/**
|
|
* @return string
|
|
*/
|
|
public function getAttribute(): string
|
|
{
|
|
return 'qty_ordered';
|
|
}
|
|
|
|
/**
|
|
* @return Phrase
|
|
*/
|
|
public function getAttributeElementHtml()
|
|
{
|
|
return __('Bestseller Sales');
|
|
}
|
|
|
|
public function getInputType(): string
|
|
{
|
|
return 'numeric';
|
|
}
|
|
|
|
public function getValueElementType(): string
|
|
{
|
|
return 'text';
|
|
}
|
|
|
|
public function getDefaultOperatorOptions(): array
|
|
{
|
|
$values = parent::getDefaultOperatorOptions();
|
|
unset(
|
|
$values['{}'],
|
|
$values['!{}'],
|
|
$values['<=>']
|
|
);
|
|
|
|
return $values;
|
|
}
|
|
|
|
public function loadArray($arr): AbstractCondition
|
|
{
|
|
$tmp = [];
|
|
|
|
foreach (explode(',', ($arr['value'] ?? '')) as $value) {
|
|
$tmp[] = $this->format->getNumber($value);
|
|
}
|
|
|
|
$arr['value'] = implode(',', $tmp);
|
|
|
|
return parent::loadArray($arr);
|
|
}
|
|
}
|