Files
b2b.redline.com.pl/modules/newsletterpro/classes/NewsletterProMedia.php
2025-06-24 14:14:35 +02:00

233 lines
7.1 KiB
PHP

<?php
/**
* Since 2013 Ovidiu Cimpean.
*
* Ovidiu Cimpean - Newsletter Pro © All rights reserved.
*
* DISCLAIMER
*
* Do not edit, modify or copy this file.
* If you wish to customize it, contact us at addons4prestashop@gmail.com.
*
* @author Ovidiu Cimpean <addons4prestashop@gmail.com>
* @copyright Since 2013 Ovidiu Cimpean
* @license Do not edit, modify or copy this file
*
* @version Release: 4
*/
class NewsletterProMedia
{
const CACHE_NAME = 'cache_name';
const FILES = 'files';
const FOLDER_NAME = 'cache';
private $controller;
private $css;
private $js;
public function __construct()
{
$this->css = [];
$this->js = [];
}
public static function newInstance()
{
return new self();
}
public function setController($controller)
{
$this->controller = $controller;
return $this;
}
public function addCSS($cache_name, $files)
{
$this->css[] = [
self::CACHE_NAME => $cache_name,
self::FILES => $files,
];
return $this;
}
public function addJS($cache_name, $files)
{
$this->js[] = [
self::CACHE_NAME => $cache_name,
self::FILES => $files,
];
return $this;
}
/**
* Load the media files.
*/
public function load($load_cache = false, $create_cache = false, $css = true, $js = true)
{
$module = NewsletterPro::getInstance();
$dir_css = $module->dir_location.'views/css';
$path_css = $module->uri_location.'views/css';
$dir_js = $module->dir_location.'views/js';
$path_js = $module->uri_location.'views/js';
if (!isset($this->controller)) {
throw new Exception('The media controller is not set.');
}
if ($create_cache) {
$this->cache(false);
}
// $this->loadFile($load_cache, $this->css, PQCRP_CSS.'/', PQCRP_CSS_PATH, 'addCSS');
// $this->loadFile($load_cache, $this->js, PQCRP_JS.'/', PQCRP_JS_PATH, 'addJS');
if ($css) {
$this->loadFile($load_cache, $this->css, $dir_css, $path_css, 'addCSS');
}
if ($js) {
$this->loadFile($load_cache, $this->js, $dir_js, $path_js, 'addJS');
}
return $this;
}
/**
* Create the cache files.
*/
public function cache($force = false, $css = true, $js = true)
{
$module = NewsletterPro::getInstance();
$dir_css = $module->dir_location.'views/css';
$path_css = $module->uri_location.'views/css';
$dir_js = $module->dir_location.'views/js';
$path_js = $module->uri_location.'views/js';
// $this->writeCache($this->css, PQCRP_CSS.'/', PQCRP_CSS_PATH, 'addCSS', $force);
// $this->writeCache($this->js, PQCRP_JS.'/', PQCRP_JS_PATH, 'addJS', $force);
if ($css) {
$this->writeCache($this->css, $dir_css, $path_css, 'addCSS', $force);
}
if ($js) {
$this->writeCache($this->js, $dir_js, $path_js, 'addJS', $force);
}
return $this;
}
private function writeCache($data, $dir, $path, $func_name, $force = false)
{
$base_name = $_SERVER['DOCUMENT_ROOT'];
foreach ($data as $data_value) {
$data_cache_content = [];
foreach ($data_value[self::FILES] as $file) {
$data_filename = $base_name.$file;
if (file_exists($data_filename)) {
$content = Tools::file_get_contents($data_filename);
if ('addCSS' == $func_name) {
$file_trim = ltrim(str_replace(['/', '//', '\\', '\\\\'], '/', $file), '/');
$depth = substr_count($file_trim, '/');
if (0 == $depth) {
$content = preg_replace('/(url\()((.*)?\))/', '$1../$2', $content);
} elseif ($depth >= 2) {
$content = preg_replace('/(url\()(\.\.\/)+(.*)?(\))/', '$1../../$3$4', $content);
}
}
$data_cache_content[] = $content;
}
}
$data_cache_content = implode("\n", $data_cache_content);
$cache_filename = $this->getCacheFilename($dir, $data_value[self::CACHE_NAME]);
$cache_path = $this->getCachePath($path, $data_value[self::CACHE_NAME]);
if (function_exists('mb_strlen')) {
if (!$this->cacheFileExists($cache_filename)) {
file_put_contents($cache_filename, $data_cache_content);
} elseif (mb_strlen($data_cache_content, '8bit') !== filesize($cache_filename)) {
file_put_contents($cache_filename, $data_cache_content);
} elseif ($force) {
file_put_contents($cache_filename, $data_cache_content);
}
} else {
if (!$this->cacheFileExists($cache_filename)) {
file_put_contents($cache_filename, $data_cache_content);
} elseif ($force) {
file_put_contents($cache_filename, $data_cache_content);
}
}
}
}
private function loadFile($load_cache, $data, $dir, $path, $func_name)
{
if ($load_cache) {
foreach ($data as $data_value) {
$cache_filename = $this->getCacheFilename($dir, $data_value[self::CACHE_NAME]);
$cache_path = $this->getCachePath($path, $data_value[self::CACHE_NAME]);
$file_exists = $this->cacheFileExists($cache_filename);
if ($file_exists && is_readable($cache_filename)) {
$info = pathinfo($cache_filename);
$min_name = $info['filename'].'.min.'.$info['extension'];
$min_filename = $info['dirname'].'/'.$min_name;
if (file_exists($min_filename) && is_readable($min_filename) && filemtime($min_filename) >= filemtime($cache_filename)) {
$min_cache_path = $this->getCachePath($path, $min_name);
$this->controller->{$func_name}($min_cache_path);
} else {
$this->controller->{$func_name}($cache_path);
}
} else {
foreach ($data_value[self::FILES] as $file) {
$this->controller->{$func_name}($file);
}
}
}
} else {
foreach ($data as $data_value) {
foreach ($data_value[self::FILES] as $file) {
$this->controller->{$func_name}($file);
}
}
}
}
private function cacheFileExists($filename)
{
return file_exists($filename);
}
private function getCacheFilename($dir, $cache_name)
{
return $dir.'/'.self::FOLDER_NAME.'/'.$cache_name;
}
private function getCachePath($path, $cache_name)
{
return $path.'/'.self::FOLDER_NAME.'/'.$cache_name;
}
}