Files
ltsecurityinc/app/code/Olegnax/Carousel/Model/ResourceModel/Slide.php
T

202 lines
6.1 KiB
PHP
Executable File

<?php declare(strict_types=1);
/**
* Copyright (c) 2021
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
namespace Olegnax\Carousel\Model\ResourceModel;
use Magento\Catalog\Model\ImageUploader;
use Magento\Framework\App\Filesystem\DirectoryList;
use Magento\Framework\App\ObjectManager;
use Magento\Framework\File\Uploader;
use Magento\Framework\Filesystem;
use Magento\Framework\Model\AbstractModel;
use Magento\Framework\Model\ResourceModel\Db\AbstractDb;
use Magento\Framework\Model\ResourceModel\Db\Context;
use Magento\Framework\Serialize\Serializer\Json;
use Olegnax\Carousel\Api\Data\SlideInterface;
use Psr\Log\LoggerInterface;
class Slide extends AbstractDb
{
/**
* @var Json
*/
protected $json;
/**
* @var ImageUploader
*/
private $imageUploader;
/**
* @var Filesystem
*/
private $_filesystem;
public function __construct(
Context $context,
Filesystem $filesystem,
Json $json,
LoggerInterface $logger,
$connectionName = null
) {
$this->_filesystem = $filesystem;
$this->json = $json;
$this->_logger = $logger;
parent::__construct($context, $connectionName);
}
/**
* Define resource model
*
* @return void
*/
protected function _construct()
{
$this->_init('olegnax_carousel_slide', 'slide_id');
}
protected function _beforeSave(AbstractModel $object)
{
$data = $object->getData('store_id');
if (!empty($data)) {
if (is_array($data)) {
$data = implode(',', $data);
$object->setData('store_id', $data);
}
} else {
$object->setData('store_id', 0);
}
$this->beforeSaveImage($object, SlideInterface::IMAGE);
$this->beforeSaveImage($object, SlideInterface::MOBILE_IMAGE);
return parent::_beforeSave($object);
}
private function beforeSaveImage($object, $attributeName)
{
$value = $object->getData($attributeName);
if ($this->fileResidesOutsideCategoryDir($value)) {
// use relative path for image attribute so we know it's outside of category dir when we fetch it
// phpcs:ignore Magento2.Functions.DiscouragedFunction
$value[0]['url'] = parse_url($value[0]['url'], PHP_URL_PATH);
$value[0]['name'] = $value[0]['url'];
}
if ($imageName = $this->getUploadedImageName($value)) {
if (!$this->fileResidesOutsideCategoryDir($value)) {
$imageName = $this->checkUniqueImageName($imageName);
}
$object->setData($attributeName, $imageName);
} elseif (!is_string($value)) {
$object->setData($attributeName, null);
}
return $this;
}
/**
* Check for file path resides outside of category media dir. The URL will be a path including pub/media if true
*
* @param array|null $value
* @return bool
*/
private function fileResidesOutsideCategoryDir($value)
{
if (!is_array($value) || !isset($value[0]['url'])) {
return false;
}
$fileUrl = ltrim((string)$value[0]['url'], '/');
$baseMediaDir = $this->_filesystem->getUri(DirectoryList::MEDIA);
if (!$baseMediaDir) {
return false;
}
return strpos($fileUrl, $baseMediaDir) !== false;
}
/**
* Gets image name from $value array.
*
* Will return empty string in a case when $value is not an array.
*
* @param array $value Attribute value
* @return string
*/
private function getUploadedImageName($value)
{
if (is_array($value) && isset($value[0]['name'])) {
return $value[0]['name'];
}
return '';
}
/**
* Check that image name exists in catalog/category directory and return new image name if it already exists.
*
* @param string $imageName
* @return string
*/
private function checkUniqueImageName(string $imageName): string
{
$imageUploader = $this->getImageUploader();
$mediaDirectory = $this->_filesystem->getDirectoryWrite(DirectoryList::MEDIA);
$imageAbsolutePath = $mediaDirectory->getAbsolutePath(
$imageUploader->getBasePath() . DIRECTORY_SEPARATOR . $imageName
);
$imageName = Uploader::getNewFilename($imageAbsolutePath);
return $imageName;
}
/**
* Get Instance of Category Image Uploader.
*
* @return ImageUploader
*
* @deprecated 101.0.0
*/
private function getImageUploader()
{
if ($this->imageUploader === null) {
$this->imageUploader = ObjectManager::getInstance()
->get(ImageUploader::class);
}
return $this->imageUploader;
}
protected function _afterLoad(AbstractModel $object)
{
$data = $object->getData('store_id');
if (!empty($data) && !is_array($data)) {
$data = explode(',', $data);
$object->setData('store_id', $data);
}
return parent::_afterLoad($object);
}
}