344 lines
9.1 KiB
PHP
Executable File
344 lines
9.1 KiB
PHP
Executable File
<?php
|
|
/**
|
|
* @author Olegnax
|
|
* @package Olegnax_Athlete2
|
|
* @copyright Copyright (c) 2023 Olegnax (http://olegnax.com/). All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
|
|
namespace Olegnax\Athlete2\Helper;
|
|
|
|
use Magento\Catalog\Model\Product;
|
|
use Magento\Framework\App\Filesystem\DirectoryList;
|
|
use Magento\Framework\App\Helper\AbstractHelper;
|
|
use Magento\Framework\App\Helper\Context;
|
|
use Magento\Framework\App\ObjectManager;
|
|
use Magento\Framework\Escaper;
|
|
use Magento\Framework\Exception\NoSuchEntityException;
|
|
use Magento\Framework\Filesystem;
|
|
use Magento\Framework\Filesystem\Directory\ReadInterface;
|
|
use Magento\Framework\Filesystem\Glob;
|
|
use Magento\Framework\UrlInterface;
|
|
use Magento\Framework\View\Element\Template;
|
|
use Magento\Framework\View\LayoutInterface;
|
|
use Magento\Store\Model\StoreManagerInterface;
|
|
|
|
class Video extends AbstractHelper
|
|
{
|
|
const ORDER_MIME = [
|
|
'video/webm',
|
|
'video/mp4',
|
|
'video/ogg',
|
|
];
|
|
|
|
const TEMPLATE_VIDEO = 'Olegnax_Athlete2::video.phtml';
|
|
/**
|
|
* @var ReadInterface
|
|
*/
|
|
protected $_mediaDirectory;
|
|
/**
|
|
* @var StoreManagerInterface
|
|
*/
|
|
protected $_storeManager;
|
|
|
|
/**
|
|
* @var LayoutInterface
|
|
*/
|
|
protected $_layout;
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $_productVideos;
|
|
|
|
/**
|
|
* Video constructor.
|
|
* @param Context $context
|
|
* @param LayoutInterface $layout
|
|
* @param Filesystem $filesystem
|
|
* @param StoreManagerInterface $storeManager
|
|
*/
|
|
public function __construct(
|
|
Context $context,
|
|
LayoutInterface $layout,
|
|
Filesystem $filesystem,
|
|
StoreManagerInterface $storeManager
|
|
) {
|
|
$this->_layout = $layout;
|
|
$this->_mediaDirectory = $filesystem->getDirectoryRead(DirectoryList::MEDIA);
|
|
$this->_storeManager = $storeManager;
|
|
$this->_productVideos = [];
|
|
parent::__construct($context);
|
|
}
|
|
|
|
/**
|
|
* @param array $attributes
|
|
* @return string
|
|
*/
|
|
public static function prepareAttributes(array $attributes)
|
|
{
|
|
$escaper = ObjectManager::getInstance()->get(Escaper::class);
|
|
$attributes = array_filter($attributes);
|
|
if (empty($attributes)) {
|
|
return '';
|
|
}
|
|
$html = '';
|
|
foreach ($attributes as $attributeName => $attributeValue) {
|
|
if (is_bool($attributeValue)) {
|
|
if ($attributeValue) {
|
|
$html .= sprintf(
|
|
' %s',
|
|
$attributeName
|
|
);
|
|
}
|
|
} else {
|
|
$html .= sprintf(
|
|
' %s="%s"',
|
|
$attributeName,
|
|
$escaper->escapeHtmlAttr($attributeValue)
|
|
);
|
|
}
|
|
}
|
|
|
|
return $html;
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return bool
|
|
*/
|
|
public function issetVideo($product)
|
|
{
|
|
$files = $this->_getVideo($product);
|
|
|
|
return !empty($files);
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return string[]
|
|
*/
|
|
private function _getVideo($product)
|
|
{
|
|
if (!$product) {
|
|
return [];
|
|
}
|
|
$productId = $product->getId();
|
|
if (!array_key_exists($productId, $this->_productVideos)) {
|
|
$this->_productVideos[$productId] = [];
|
|
}
|
|
if (empty($this->_productVideos[$productId])) {
|
|
$videoPath = (string)$this->getProductData($product, 'ox_gallery_video');
|
|
$videoPath = ltrim($videoPath, '\\\/');
|
|
if (!empty($videoPath)) {
|
|
$videoAbsolutePath = $this->getAbsolutePath($videoPath);
|
|
$videoReplaceAbsolutePath = preg_replace('#\.[a-z0-9]{3,}$#i', '', $videoAbsolutePath);
|
|
$this->_productVideos[$productId] = Glob::glob($videoReplaceAbsolutePath . '\.*');
|
|
if (empty($this->_productVideos[$productId])) {
|
|
$this->_productVideos[$productId] = [];
|
|
if (file_exists($videoAbsolutePath)) {
|
|
$this->_productVideos[$productId][] = $videoAbsolutePath;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return $this->_productVideos[$productId];
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @param string $key
|
|
* @return mixed|null
|
|
*/
|
|
private function getProductData($product, $key)
|
|
{
|
|
$productId = $product->getId();
|
|
$data = $product->getData($key);
|
|
if (null === $data) {
|
|
$product = $product->load($productId);
|
|
if ($product->getId() == $productId) {
|
|
$data = $product->getData($key);
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* @param string $path
|
|
* @return string
|
|
*/
|
|
protected function getAbsolutePath(
|
|
$path = ''
|
|
) {
|
|
return $this->_mediaDirectory->getAbsolutePath($path);
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return bool
|
|
*/
|
|
public function stopOnClick($product)
|
|
{
|
|
return (bool)$this->getProductData($product, 'ox_gallery_video_stop_on_click');
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return bool
|
|
*/
|
|
public function loopVideo($product)
|
|
{
|
|
return (bool)$this->getProductData($product, 'ox_gallery_video_loop');
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return bool
|
|
*/
|
|
public function videoPosition($product)
|
|
{
|
|
return (int)$this->getProductData($product, 'ox_gallery_video_index') ?: 2;
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return bool
|
|
*/
|
|
public function videoOnHover($product)
|
|
{
|
|
return (bool)$this->getProductData($product, 'ox_gallery_video_listing_hover');
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return bool
|
|
*/
|
|
public function autoplayVideo($product)
|
|
{
|
|
return (bool)$this->getProductData($product, 'ox_gallery_video_autoplay');
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @return bool
|
|
*/
|
|
public function showControls($product)
|
|
{
|
|
return (bool)$this->getProductData($product, 'ox_gallery_video_controls');
|
|
}
|
|
|
|
/**
|
|
* @param Product $product
|
|
* @param array $config
|
|
* @return string
|
|
* @throws NoSuchEntityException
|
|
*/
|
|
public function getVideo($product, $config = [])
|
|
{
|
|
$files = $this->_getVideo($product);
|
|
|
|
if (!empty($files)) {
|
|
$mimeFiles = [];
|
|
foreach ($files as $file) {
|
|
$fileMime = $this->_detectMimeType($file);
|
|
$mimeFiles[$fileMime] = $this->getUrlPath($file);
|
|
}
|
|
if (!empty($mimeFiles)) {
|
|
uksort($mimeFiles, [$this, 'sortByMime']);
|
|
|
|
return $this->getLayout()
|
|
->createBlock(
|
|
Template::class,
|
|
'',
|
|
[
|
|
'data' => array_replace(
|
|
[
|
|
'mime_files' => $mimeFiles,
|
|
'product' => $product,
|
|
],
|
|
$config
|
|
),
|
|
]
|
|
)
|
|
->setTemplate(static::TEMPLATE_VIDEO)
|
|
->toHtml();
|
|
}
|
|
}
|
|
|
|
return '';
|
|
}
|
|
|
|
/**
|
|
* Internal method to detect the mime type of a file
|
|
*
|
|
* @param string $file File
|
|
* @return string Mimetype of given file
|
|
*/
|
|
protected function _detectMimeType($file)
|
|
{
|
|
$result = '';
|
|
if (class_exists('finfo', false)) {
|
|
$const = defined('FILEINFO_MIME_TYPE') ? FILEINFO_MIME_TYPE : FILEINFO_MIME;
|
|
$mime = @finfo_open($const);
|
|
|
|
if (!empty($mime)) {
|
|
$result = finfo_file($mime, $file);
|
|
}
|
|
|
|
unset($mime);
|
|
}
|
|
|
|
if (empty($result) && (function_exists('mime_content_type')
|
|
&& ini_get('mime_magic.magicfile'))) {
|
|
$result = mime_content_type($file);
|
|
}
|
|
|
|
if (empty($result)) {
|
|
$result = 'application/octet-stream';
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* @param string $path
|
|
* @return string
|
|
* @throws NoSuchEntityException
|
|
*/
|
|
protected function getUrlPath(
|
|
$path = ''
|
|
) {
|
|
$path = str_replace($this->getAbsolutePath(), '', $path);
|
|
$path = $this->_storeManager->getStore()->getBaseUrl(UrlInterface::URL_TYPE_MEDIA) . $path;
|
|
|
|
return $path;
|
|
}
|
|
|
|
/**
|
|
* @return LayoutInterface
|
|
*/
|
|
public function getLayout()
|
|
{
|
|
return $this->_layout;
|
|
}
|
|
|
|
/**
|
|
* @param string $itemPrev
|
|
* @param string $itemNext
|
|
* @return int
|
|
*/
|
|
public function sortByMime(
|
|
$itemPrev,
|
|
$itemNext
|
|
) {
|
|
$indexPrev = in_array($itemPrev, static::ORDER_MIME) ? array_search($itemPrev, static::ORDER_MIME) : 9999;
|
|
$indexNext = in_array($itemNext, static::ORDER_MIME) ? array_search($itemNext, static::ORDER_MIME) : 9999;
|
|
if ($indexPrev == $indexNext) {
|
|
return 0;
|
|
} elseif ($indexPrev > $indexNext) {
|
|
return 1;
|
|
}
|
|
return -1;
|
|
}
|
|
} |