hotel_commerce/controllers/admin/AdminModulesCatalogController.php
2023-06-26 13:09:26 +05:30

322 lines
13 KiB
PHP

<?php
/**
* 2010-2020 Webkul.
*
* NOTICE OF LICENSE
*
* All right is reserved,
* Please go through this link for complete license : https://store.webkul.com/license.html
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade this module to newer
* versions in the future. If you wish to customize this module for your
* needs please refer to https://store.webkul.com/customisation-guidelines/ for more information.
*
* @author Webkul IN <support@webkul.com>
* @copyright 2010-2020 Webkul IN
* @license https://store.webkul.com/license.html
*/
class AdminModulesCatalogControllerCore extends AdminController
{
public $modules;
const CATALOG_RECOMMENDATION_CONTENT = '/cache/catalog_recommendation.html';
const ELEMENT_TYPE_MODULE = 1;
const ELEMENT_TYPE_THEME = 2;
const MODULES_PER_PAGE = 18;
public function __construct()
{
$this->bootstrap = true;
parent::__construct();
}
public function init()
{
parent::init();
$this->initSuggestedModulesList();
}
public function initContent()
{
parent::initContent();
$suggestedModules = Module::getSuggestedModules();
$modulesToAdd = array();
$dirModules = ModuleCore::getModulesOnDisk();
$modules_name = array_column($suggestedModules, 'name');
foreach ($dirModules as $mod) {
if (($id = array_search($mod->name, $modules_name)) !== false) {
if ($mod->installed) {
unset($suggestedModules[$id]);
} else {
$suggestedModules[$id]->not_on_disk = false;
}
} else {
if (!$mod->installed) {
$modulesToAdd[] = $mod;
}
}
}
$modules = array_merge($suggestedModules, $modulesToAdd);
$link_admin_modules = $this->context->link->getAdminLink('AdminModules', true);
foreach ($modules as $key => $module) {
$module->options['install_url'] = $link_admin_modules.'&install='.urlencode($module->name).'&tab_module='.$module->tab.'&module_name='.$module->name.'&anchor='.ucfirst($module->name);
$module->element_type = self::ELEMENT_TYPE_MODULE;
$module->logo = '../../img/questionmark.png';
if (@filemtime(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.basename(_PS_MODULE_DIR_).DIRECTORY_SEPARATOR.$module->name
.DIRECTORY_SEPARATOR.'logo.gif')) {
$module->logo = 'logo.gif';
}
if (@filemtime(_PS_ROOT_DIR_.DIRECTORY_SEPARATOR.basename(_PS_MODULE_DIR_).DIRECTORY_SEPARATOR.$module->name
.DIRECTORY_SEPARATOR.'logo.png')) {
$module->logo = 'logo.png';
}
$modules[$key] = $module;
}
$this->sortList($modules, 'module');
$this->modules = $modules;
$this->themes = $this->getSuggestedThemes();
$this->assignSortCriteria();
$this->context->smarty->assign(array(
'modules' => $this->modules,
'themes' => $this->themes,
'modules_uri' => __PS_BASE_URI__.basename(_PS_MODULE_DIR_),
'element_type_module' => self::ELEMENT_TYPE_MODULE,
'element_type_theme' => self::ELEMENT_TYPE_THEME,
));
}
public function initModal()
{
parent::initModal();
$modal_content = $this->context->smarty->fetch('controllers/modules/'.(($this->context->mode == Context::MODE_HOST) ? 'modal_not_trusted_blocked.tpl' : 'modal_not_trusted.tpl'));
$this->modals[] = array(
'modal_id' => 'moduleNotTrusted',
'modal_class' => 'modal-lg',
'modal_title' => ($this->context->mode == Context::MODE_HOST) ? $this->l('This module cannot be installed') : $this->l('Important Notice'),
'modal_content' => $modal_content
);
}
public function assignSortCriteria()
{
$sortCriterta = array(
array (
'key' => 'popularity',
'value' => 'popularity',
'title' => $this->l('Popularity')
),
array (
'key' => 'name',
'value' => 'name',
'title' => $this->l('Name')
),
array (
'key' => 'price_increasing',
'value' => 'price_increasing',
'title' => $this->l('Price (low to high)')
),
array (
'key' => 'price_decreasing',
'value' => 'price_decreasing',
'title' => $this->l('Price (high to low)')
),
);
$this->context->smarty->assign(array(
'sort_criterta' => $sortCriterta,
'module_sort' => Configuration::get('PS_SORT_MODULE_MODULES_CATALOG_'.(int)$this->context->employee->id),
'theme_sort' => Configuration::get('PS_SORT_THEME_MODULES_CATALOG_'.(int)$this->context->employee->id),
));
}
public function getSuggestedThemes()
{
$installedThemes = array();
$themes = Theme::getAllThemes()->getAll();
foreach ($themes as $theme) {
$installedThemes[] = Theme::getThemeInfo($theme->id);
}
$files_list = array(
array('type' => 'addonsMustHave', 'file' => _PS_ROOT_DIR_.Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, 'loggedOnAddons' => 0),
);
$theme_list = array();
foreach ($files_list as $f) {
$file = $f['file'];
$content = Tools::file_get_contents($file);
$xml = @simplexml_load_string($content, null, LIBXML_NOCDATA);
if ($xml && isset($xml->theme)) {
foreach ($xml->theme as $modthemes) {
foreach ($installedThemes as $theme) {
if ($theme['theme_name'] == $modthemes->name)
continue;
$item = new stdClass();
$item->id = 0;
$item->warning = '';
$item->type = strip_tags((string)$f['type']);
$item->element_type = self::ELEMENT_TYPE_THEME;
$item->name = strip_tags((string)$modthemes->name);
$item->version = strip_tags((string)$modthemes->version);
$item->displayName = strip_tags((string)$modthemes->displayName);
$item->description = stripslashes(strip_tags((string)$modthemes->description));
$item->description_full = stripslashes(strip_tags((string)$modthemes->description_full));
$item->author = strip_tags((string)$modthemes->author);
$item->limited_countries = array();
$item->parent_class = '';
$item->onclick_option = false;
$item->available_on_addons = 1;
$item->active = 0;
$item->additional_description = isset($modthemes->additional_description) ? stripslashes($modthemes->additional_description) : null;
$item->compatibility = isset($modthemes->compatibility) ? (array)$modthemes->compatibility : null;
$item->nb_rates = isset($modthemes->nb_rates) ? (array)$modthemes->nb_rates : null;
$item->avg_rate = isset($modthemes->avg_rate) ? (array)$modthemes->avg_rate : null;
$item->badges = isset($modthemes->badges) ? (array)$modthemes->badges : null;
$item->url = isset($modthemes->url) ? $modthemes->url : null;
if (isset($modthemes->img)) {
if (!file_exists(_PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg')) {
if (!file_put_contents(_PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg', Tools::file_get_contents($modthemes->img))) {
copy(_PS_IMG_DIR_.'404.gif', _PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg');
}
}
if (file_exists(_PS_TMP_IMG_DIR_.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg')) {
$item->image = '../img/tmp/'.md5((int)$modthemes->id.'-'.$modthemes->name).'.jpg';
}
}
if ($item->type == 'addonsMustHave') {
$item->addons_buy_url = strip_tags((string)$modthemes->url);
$prices = (array)$modthemes->price;
$id_default_currency = Configuration::get('PS_CURRENCY_DEFAULT');
foreach ($prices as $currency => $price) {
if ($id_currency = Currency::getIdByIsoCode($currency)) {
$item->price = (float)$price;
$item->id_currency = (int)$id_currency;
if ($id_default_currency == $id_currency) {
break;
}
}
}
}
$theme_list[$modthemes->id.'-'.$item->name] = $item;
}
}
}
}
$theme_list = array_values($theme_list);
$this->sortList($theme_list, 'theme');
return $theme_list;
}
public function initToolbar()
{
parent::initToolbar();
$this->page_header_toolbar_btn['addons'] = array(
'href' => 'https://QloApps.com/addons/',
'desc' => $this->l('Explore all Addons'),
'imgclass' => 'modules-list',
'target' => true
);
}
public function getRecommendationContent()
{
if (!Tools::isFresh(self::CATALOG_RECOMMENDATION_CONTENT, _TIME_1_DAY_, false)) {
@file_put_contents(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT, Tools::addonsRequest('catalog-recommendation'));
}
if (file_exists(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT)) {
return Tools::file_get_contents(_PS_ROOT_DIR_.self::CATALOG_RECOMMENDATION_CONTENT);
}
return false;
}
public function sortList(&$list, $type)
{
switch($type) {
case 'module':
$criteria = Configuration::get('PS_SORT_MODULE_MODULES_CATALOG_'.(int)$this->context->employee->id);
break;
case 'theme':
$criteria = Configuration::get('PS_SORT_THEME_MODULES_CATALOG_'.(int)$this->context->employee->id);
break;
}
if ($criteria != 'popularity') {
usort($list, function($a, $b) use($criteria){
if ($criteria == 'name') {
return strnatcasecmp($a->displayName, $b->displayName);
} else if ($criteria == 'price_increasing') {
if (isset($a->price) && isset($b->price))
return $a->price > $b->price;
else if (isset($b->price) && $b->price)
return true;
} else if ($criteria == 'price_decreasing') {
if (isset($a->price) && isset($b->price))
return $a->price < $b->price;
else if (isset($b->price) && $b->price)
return true;
}
});
}
return true;
}
protected function setSorting($module_sorting, $theme_sorting)
{
Configuration::updateValue('PS_SORT_MODULE_MODULES_CATALOG_'.(int)$this->context->employee->id, $module_sorting);
Configuration::updateValue('PS_SORT_THEME_MODULES_CATALOG_'.(int)$this->context->employee->id, $theme_sorting);
}
public function ajaxProcessSetSorting()
{
$this->setSorting(Tools::getValue('module_sorting'), Tools::getValue('theme_sorting'));
$this->ajaxDie(json_encode(array(
'success' => true
)));
}
protected function initSuggestedModulesList()
{
if (!Tools::isFresh(Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, _TIME_1_DAY_)) {
file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_DEFAULT_COUNTRY_MODULES_LIST, Tools::addonsRequest('native'));
}
if (!Tools::isFresh(Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, _TIME_1_DAY_)) {
@file_put_contents(_PS_ROOT_DIR_.Module::CACHE_FILE_MUST_HAVE_MODULES_LIST, Tools::addonsRequest('must-have'));
}
}
public function setMedia()
{
parent::setMedia();
$this->addJS(_PS_JS_DIR_.'admin/modules_catalog.js');
$this->context->controller->addJS(_PS_JS_DIR_.'/twbs-pagination/jquery.twbsPagination.min.js');
Media::addJSdef(array(
'num_block_per_page' => self::MODULES_PER_PAGE
));
}
}