Files

311 lines
10 KiB
PHP
Executable File

<?php
namespace Nwdthemes\Revslider\Helper;
use \Magento\Framework\UrlInterface;
use \Magento\Framework\App\Filesystem\DirectoryList;
class Plugin extends \Magento\Framework\App\Helper\AbstractHelper {
const WP_PLUGIN_DIR = 'revslider/plugins/';
const MAX_FAILS = 5;
const PLUGIN_PREFIX = 'revslider-';
protected $_registerHelper;
protected $_optionsHelper;
protected $_storeManager;
protected $_queryHelper;
protected $_curlHelper;
protected $_filesystemHelper;
protected $_imagesHelper;
protected $_resource;
protected $_googleFonts;
protected $_revSliderLoadBalancer;
protected static $directory;
protected static $storeManager;
private $_plugins = null;
private $_pluginsLoaded = false;
private $_activePlugins = null;
/**
* Constructor
*/
public function __construct(
\Magento\Framework\App\Helper\Context $context,
\Magento\Framework\Filesystem $filesystem,
\Nwdthemes\Revslider\Helper\Data $dataHelper,
\Nwdthemes\Revslider\Helper\Options $optionsHelper,
\Nwdthemes\Revslider\Helper\Register $registerHelper,
\Magento\Store\Model\StoreManagerInterface $storeManager,
\Nwdthemes\Revslider\Helper\Query $queryHelper,
\Nwdthemes\Revslider\Helper\Curl $curlHelper,
\Nwdthemes\Revslider\Helper\Filesystem $filesystemHelper,
\Nwdthemes\Revslider\Helper\Images $imagesHelper,
\Magento\Framework\App\ResourceConnection $resource,
\Nwdthemes\Revslider\Model\Revslider\GoogleFonts $googleFonts
) {
$this->_optionsHelper = $optionsHelper;
$this->_registerHelper = $registerHelper;
$this->_storeManager = $storeManager;
$this->_queryHelper = $queryHelper;
$this->_curlHelper = $curlHelper;
$this->_filesystemHelper = $filesystemHelper;
$this->_imagesHelper = $imagesHelper;
$this->_resource = $resource;
$this->_googleFonts = $googleFonts;
self::$directory = $filesystem->getDirectoryWrite(DirectoryList::MEDIA);
self::$storeManager = $storeManager;
parent::__construct($context);
}
/**
* Get plugin dir
*/
public static function getPluginDir() {
return self::$directory->getAbsolutePath() . self::WP_PLUGIN_DIR;
}
/**
* Get plugins url
*
* @param string $file
* @param string $plugin
* @return string
*/
public function getPluginUrl($file, $plugin) {
return $this->_storeManager->getStore()->getBaseUrl(UrlInterface::URL_TYPE_MEDIA)
. self::WP_PLUGIN_DIR
. $this->getPluginName($plugin)
. '/'
. $file;
}
/**
* Get installed plugins list
*
* @return array
*/
public function getPlugins() {
if (is_null($this->_plugins)) {
$this->_plugins = $this->_scanPlugins();
}
return $this->_plugins;
}
/**
* Check if plugin is active
*
* @param string $plugin
* @return boolean
*/
public function isPluginActive($plugin) {
return in_array($plugin, $this->getActivePlugins());
}
/**
* Get list of active plugins
*
* @return array
*/
public function getActivePlugins() {
if (is_null($this->_activePlugins)) {
$activePlugins = $this->_optionsHelper->getOption('active_plugins');
$this->_activePlugins = $activePlugins ? $activePlugins : array();
}
return $this->_activePlugins;
}
/**
* Activate plugin
*
* @param string $plugin
* @return boolean
*/
public function activatePlugin($plugin) {
$activePlugins = $this->getActivePlugins();
if ( ! in_array($plugin, $activePlugins)) {
$activePlugins[] = $plugin;
$this->_updateActivePlugins($activePlugins);
}
return true;
}
/**
* Deactivate plugin
*
* @param string $plugin
* @return boolean
*/
public function deactivatePlugin($plugin) {
$activePlugins = $this->getActivePlugins();
foreach ($activePlugins as $key => $_plugin) {
if ($plugin == $_plugin) {
unset($activePlugins[$key]);
}
}
$this->_updateActivePlugins($activePlugins);
return true;
}
/**
* Update plugin
*
* @param string $updateUrl
* @param string $plugin
* @return boolean
*/
public function updatePlugin($updateUrl, $plugin) {
$url = "$updateUrl/magento2/addons/{$plugin}/{$plugin}.zip";
$file = self::getPluginDir() . $plugin . '.zip';
if ( ! $response = $this->_curlHelper->request($url, array('timeout' => 45))) {
$result = false;
}else{
$this->_filesystemHelper->wp_mkdir_p(dirname($file));
if ( ! @file_put_contents($file, $response['body'])) {
$result = false;
} else {
if ($this->_filesystemHelper->unzip_file($file, self::getPluginDir())) {
$result = true;
}
@unlink($file);
}
}
return $result;
}
/**
* Load active plugins
*
* @param \Nwdthemes\Revslider\Helper\Framework $frameworkHelper
*/
public function loadPlugins(\Nwdthemes\Revslider\Helper\Framework $frameworkHelper) {
if ( ! $this->_pluginsLoaded) {
if ($failed_plugin = $this->_optionsHelper->getOption('try_load_plugin')) {
$fails_count = $this->_optionsHelper->getOption('fails_count', 0);
if ($fails_count >= self::MAX_FAILS) {
$this->deactivatePlugin($failed_plugin);
$this->_optionsHelper->updateOption('fails_count', 0);
} else {
$this->_optionsHelper->updateOption('fails_count', $fails_count + 1);
}
$this->_optionsHelper->updateOption('try_load_plugin', false);
}
foreach ($this->getActivePlugins() as $plugin) {
if (file_exists(self::getPluginDir() . $plugin)) {
$this->_optionsHelper->updateOption('try_load_plugin', $plugin);
$frameworkHelper->includeFile(self::getPluginDir() . $plugin);
if ($failed_plugin == $plugin) {
$this->_optionsHelper->updateOption('fails_count', 0);
}
$this->_optionsHelper->updateOption('try_load_plugin', false);
}
}
$frameworkHelper->do_action('plugins_loaded', $frameworkHelper);
$this->_pluginsLoaded = true;
}
}
/**
* Get plugin name from path
* @param string $plugin
* @return string
*/
public function getPluginName($plugin) {
$pluginName = basename($plugin, '.php');
if ($pluginName && strpos($pluginName, self::PLUGIN_PREFIX) !== 0) {
$pluginName = $this->getPluginName(substr($plugin, 0, -strlen($pluginName)));
}
return $pluginName;
}
/**
* Find installed plugins
*
* @return array
*/
private function _scanPlugins() {
$path = self::getPluginDir();
$plugins = array();
foreach (glob($path . '*' , GLOB_ONLYDIR) as $dir) {
$dirName = basename($dir);
$fileName = $dirName . '.php';
$filePath = $dir . '/' . $fileName;
if (file_exists($filePath)) {
$plugin = array();
$fileContent = file_get_contents($filePath);
$fileContent = strstr($fileContent, '*/', true);
foreach (explode("\n", $fileContent) as $line) {
$parts = explode(': ', $line);
if (count($parts) == 2) {
switch (trim(strtolower(str_replace('*', '', $parts[0])))) {
case 'plugin name' : $key = 'Name'; break;
case 'plugin uri' : $key = 'PluginURI'; break;
case 'description' : $key = 'Description'; break;
case 'author' : $key = 'Author'; break;
case 'version' : $key = 'Version'; break;
case 'author uri' : $key = 'AuthorURI'; break;
default: $key = str_replace(' ', '', trim($parts[0])); break;
}
$plugin[$key] = trim($parts[1]);
}
}
if (isset($plugin['Name']) && isset($plugin['Version'])) {
$plugin['Network'] = false;
$plugin['Title'] = $plugin['Name'];
$plugin['AuthorName'] = $plugin['Author'];
$plugins[$dirName . '/' . $fileName] = $plugin;
}
}
}
return $plugins;
}
/**
* Update active plugins
*
* @param array $plugins
*/
private function _updateActivePlugins($plugins) {
$this->_activePlugins = $plugins;
$this->_optionsHelper->updateOption('active_plugins', $plugins);
}
/**
* Deactivate old plugins to avoid compatibility issues
*/
public function deactivateOldPlugins() {
// TODO: Re-activate when pllugin data updates will be online
/*
foreach ($this->getPlugins() as $pluginName => $pluginData) {
$requiredVersion = $pluginName == 'revslider-backup-addon/revslider-backup-addon.php' ? '2.0.2' : '3';
if (version_compare($pluginData['Version'], $requiredVersion, '<')) {
$this->deactivatePlugin($pluginName);
}
}
*/
}
}