Files

279 lines
8.6 KiB
PHP
Executable File

<?php
/**
* @author Olegnax
* @package Olegnax_BrandSlider
* @copyright Copyright (c) 2023 Olegnax (http://olegnax.com/). All rights reserved.
* See COPYING.txt for license details.
* @noinspection PhpDeprecationInspection
*/
declare(strict_types=1);
namespace Olegnax\BrandSlider\Helper;
use Magento\Catalog\Model\Product;
use Magento\Catalog\Model\Product\Attribute\Repository;
use Magento\Eav\Model\Entity\Attribute\Option;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\Escaper;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Filesystem;
use Magento\Framework\Phrase;
use Magento\Framework\UrlInterface;
use Olegnax\Core\Helper\Helper as CoreHelperHelper;
use Psr\Log\LoggerInterface;
class Helper extends CoreHelperHelper
{
const HIDE_PRODUCT_DEFAULT = true;
const BRANDS_PATH_SMALL = 'wysiwyg/brands/small/';
const BRANDS_PATH = 'wysiwyg/brands/';
const CONFIG_MODULE = 'olegnax_brandslider';
const XML_PATH_ATTRIBUTE_CODE = 'general/attribute_code';
protected $repository;
protected $_mediaDirectory;
/**
* @var array|null
*/
protected $items;
/**
* @var array
*/
private $absolutePath;
/**
* @var Escaper
*/
private $escaper;
/**
* @var Image
*/
private $image;
private $defaultOptions;
/**
* Helper constructor.
* @param Context $context
* @param Repository $repository
* @param Escaper $escaper
* @param Image $image
* @param Filesystem $filesystem
*/
public function __construct(
Context $context,
LoggerInterface $logger,
Repository $repository,
Escaper $escaper,
Image $image,
Filesystem $filesystem
) {
$this->repository = $repository;
$this->escaper = $escaper;
$this->image = $image;
$this->_mediaDirectory = $filesystem->getDirectoryRead(DirectoryList::MEDIA);
parent::__construct($context, $logger);
}
/**
* @param string $itemsList
* @return array|mixed|null
* @throws NoSuchEntityException
*/
public function getItems($itemsList = '', $attribute = '')
{
$attributeCode = $this->getAttribute();
if( $attribute && '' !== $attribute){
$attributeCode = $attribute;
}
if(!$attributeCode){
return [];
}
if (!isset($this->items[$attributeCode][$itemsList]) || empty($this->items[$attributeCode][$itemsList])) {
$this->items[$attributeCode][$itemsList] = [];
if ($attributeCode == '') {
return $this->items;
}
/** @var Option[]|null $options */
$options = $this->repository->get($attributeCode)->getOptions();
if (!empty($options) && is_array($options)) {
array_shift($options);
$_itemsList = !empty($itemsList) ? array_filter(array_map('trim', explode(',', (string)$itemsList))) : '';
if (!empty($_itemsList)) {
foreach ($options as &$option) {
$label = $this->getDefaultLabel($option->getValue(), $option->getLabel());
if (in_array($label, $_itemsList)) {
$option->setData('image_name', $this->getFileName($label));
}
}
} else {
foreach ($options as &$option) {
$label = $this->getDefaultLabel($option->getValue(), $option->getLabel());
$option->setData('image_name', $this->getFileName($label));
}
}
$this->items[$attributeCode][$itemsList] = $options;
}
}
return $this->items[$attributeCode][$itemsList];
}
/**
* @return string
*/
public function getAttribute()
{
return $this->getModuleConfig(self::XML_PATH_ATTRIBUTE_CODE);
}
/**
* @param string $name
* @param string $path
* @param bool $returnBool
* @return bool|string
*/
public function getFileName($name, $path = self::BRANDS_PATH, $returnBool = false)
{
if (!is_array($this->absolutePath)) {
$this->absolutePath = [];
}
if (!array_key_exists($path, $this->absolutePath)) {
$this->absolutePath[$path] = $this->_mediaDirectory->getAbsolutePath($path);
}
$name = str_replace(
[' ', '\'', '/', ':', '*', '?', '"', '<', '>', '|', '+', '.'],
'_',
strtolower($name)
);
$absolutePath = $this->absolutePath[$path];
$paths = glob($absolutePath . $name . '.*');
if (!empty($paths)) {
$file_name = basename(array_shift($paths));
return $path . $file_name;
}
if ($returnBool) {
return false;
}
return $path . $name . '.png';
}
/**
* @param Product $product
* @param bool $isBig
* @param array $size
* @param string $class
* @return string
*/
public function getProductBrandImage($product, $isBig = false, $size = [], $class = '')
{
$attributeCode = $this->getAttribute();
if (empty($attributeCode) || !$attributeCode || !$this->checkAttrExist($attributeCode)) {
return '';
}
$width = $height = '';
$attribute = $this->getProductAttributeText($product, $attributeCode);
if (is_array($attribute)) {
$attribute = array_shift($attribute);
}
if ($attribute) {
$fileName = $this->getFileName(
$attribute,
($isBig ? self::BRANDS_PATH : self::BRANDS_PATH_SMALL),
self::HIDE_PRODUCT_DEFAULT
);
if ($fileName) {
$url = $this->getBaseUrl(UrlInterface::URL_TYPE_MEDIA) . $fileName;
if (is_array($size)) {
$size = array_filter($size);
$width = ' width="' . $size[0] . '" ';
$height = ' height="' . $size[1] . '" ';
}
if (!empty($size)) {
$url = $this->image->adaptiveResize($fileName, $size)->getUrl();
}
return '<img
src="' . $this->escaper->escapeUrl($url) . '"
alt="' . $this->escaper->escapeHtmlAttr($attribute) . '"
' . $width . '
' . $height . '
class="ox-product-grid__brand-image ' . $this->escaper->escapeHtmlAttr($class) . '" />';
}
}
return '';
}
/**
* @param Product $product
* @param string $attributeCode
* @return bool|Phrase
*/
private function getProductAttributeText($product, $attributeCode)
{
return $this->getDefaultLabel($product->getData($attributeCode), $product->getAttributeText($attributeCode));
}
/**
* @param int $value
* @param bool $default
* @return bool|string
*/
private function getDefaultLabel($value, $default = false)
{
if (true) { // @todo add option check whether to use default names from admin panel?
$options = $this->getDefaultOptions();
if (is_array($options) && isset($options[$value])) {
return $options[$value];
}
}
return $default;
}
/**
* @return string[]
*/
private function getDefaultOptions()
{
if (empty($this->defaultOptions)) {
$attributeCode = $this->getAttribute();
try {
$defaultOptions = $this->repository
->get($attributeCode)
->getSource()
->getAllOptions(false, true);
} catch (NoSuchEntityException $e) {
$defaultOptions = null;
}
if (!empty($defaultOptions) && is_array($defaultOptions)) {
$this->defaultOptions = [];
foreach ($defaultOptions as $option) {
$this->defaultOptions[$option['value']] = $option['label'];
}
}
}
return $this->defaultOptions;
}
/**
* @return bool
*/
public function checkAttrExist($attributeCode = "") {
try {
$this->repository->get($attributeCode);
return true;
} catch (\Magento\Framework\Exception\NoSuchEntityException $e) {
$error_message = 'Olegnax BrandSlider: ';
$this->_logger->critical( $error_message . $e->getMessage() );
return false;
}
}
}