Files
wyczarujprezent.pl/modules/ets_reviews/ets_reviews.php
2024-10-28 22:14:22 +01:00

2331 lines
114 KiB
PHP

<?php
/**
* Copyright ETS Software Technology Co., Ltd
*
* NOTICE OF LICENSE
*
* This file is not open source! Each license that you purchased is only available for 1 website only.
* If you want to use this file on more websites (or projects), you need to purchase additional licenses.
* You are not allowed to redistribute, resell, lease, license, sub-license or offer our resources to any third party.
*
* DISCLAIMER
*
* Do not edit or add to this file if you wish to upgrade PrestaShop to newer
* versions in the future.
*
* @author ETS Software Technology Co., Ltd
* @copyright ETS Software Technology Co., Ltd
* @license Valid for 1 website (or project) for each purchase of license
*/
if (!defined('_PS_VERSION_')) {
exit;
}
require_once dirname(__FILE__) . '/classes/EtsRVSmartyCache.php';
require_once dirname(__FILE__) . '/classes/EtsRVCore.php';
require_once dirname(__FILE__) . '/classes/EtsRVTools.php';
require_once dirname(__FILE__) . '/classes/EtsRVLink.php';
require_once dirname(__FILE__) . '/classes/EtsRVModel.php';
require_once dirname(__FILE__) . '/classes/EtsRVEmailQueue.php';
require_once dirname(__FILE__) . '/classes/EtsRVTracking.php';
require_once dirname(__FILE__) . '/classes/EtsRVEmailTemplate.php';
require_once dirname(__FILE__) . '/classes/EtsRVStaff.php';
require_once dirname(__FILE__) . '/classes/EtsRVUnsubscribe.php';
require_once dirname(__FILE__) . '/classes/EtsRVProductCommentOrder.php';
require_once dirname(__FILE__) . '/classes/EtsRVProductCommentImage.php';
require_once dirname(__FILE__) . '/classes/EtsRVProductCommentVideo.php';
require_once dirname(__FILE__) . '/classes/EtsRVProductCommentCustomer.php';
require_once dirname(__FILE__) . '/classes/EtsRVProductCommentCriterion.php';
require_once dirname(__FILE__) . '/classes/EtsRVProductComment.php';
require_once dirname(__FILE__) . '/classes/EtsRVComment.php';
require_once dirname(__FILE__) . '/classes/EtsRVReplyComment.php';
require_once dirname(__FILE__) . '/classes/EtsRVCartRule.php';
require_once dirname(__FILE__) . '/classes/EtsRVMail.php';
require_once dirname(__FILE__) . '/src/Repository/EtsRVProductCommentRepository.php';
require_once dirname(__FILE__) . '/src/Repository/EtsRVProductCommentCriterionRepository.php';
require_once dirname(__FILE__) . '/src/Repository/EtsRVCommentRepository.php';
require_once dirname(__FILE__) . '/src/Repository/EtsRVReplyCommentRepository.php';
require_once dirname(__FILE__) . '/classes/EtsRVActivity.php';
require_once dirname(__FILE__) . '/classes/EtsRVDefines.php';
require_once dirname(__FILE__) . '/src/Entity/EtsRVEntity.php';
require_once dirname(__FILE__) . '/src/Entity/EtsRVProductCommentEntity.php';
require_once dirname(__FILE__) . '/src/Entity/EtsRVCommentEntity.php';
require_once dirname(__FILE__) . '/src/Entity/EtsRVReplyCommentEntity.php';
require_once dirname(__FILE__) . '/src/Entity/EtsRVActivityEntity.php';
class Ets_reviews extends Module
{
const DEFAULT_MAX_SIZE = 104857600;
const INSTALL_SQL_FILE = 'install.sql';
const UNINSTALL_SQL_FILE = 'uninstall.sql';
const TAB_PREFIX = 'AdminEtsRV';
const DEFAULT_MAX_COLOR = 5;
const _DIR_IMG_ = [
'a',
'r'
];
public $is17 = 0;
public $ps1760 = 0;
public $backOffice;
public $employee;
public function __construct()
{
$this->name = 'ets_reviews';
$this->tab = 'front_office_features';
$this->version = '2.3.0';
$this->author = 'PrestaHero';
$this->module_key = 'a5caad3049534ce42e31c97dd3ee9c7b';
$this->need_instance = 0;
$this->bootstrap = true;
if (version_compare(_PS_VERSION_, '1.7', '>='))
$this->is17 = true;
parent::__construct();
$this->secure_key = Tools::encrypt($this->name);
$this->displayName = $this->l('Trusted Reviews');
$this->description = $this->l('Fully managed reviews, ratings & FAQ system to make your product reviews editable, multi-languages and easy to manage.');
$this->ps_versions_compliancy = array('min' => '1.6.0', 'max' => _PS_VERSION_);
$this->is17 = version_compare(_PS_VERSION_, '1.7', '>=') ? 1 : 0;
$this->ps1760 = version_compare(_PS_VERSION_, '1.7.6.0', '>=');
$this->employee = isset($this->context->employee->id) && $this->context->employee->id ? $this->context->employee->id : 0;
$this->backOffice = $this->isBackOffice();
}
public function isBackOffice($id_customer = 0)
{
return $this->employee || $this->isStaffLogged($id_customer) ? 1 : 0;
}
public function isStaffLogged($id_customer = 0)
{
if (trim($id_customer) !== '' && !Validate::isUnsignedInt($id_customer))
return false;
if ($id_customer < 1 && $this->isCustomerLogged())
$id_customer = $this->context->customer->id;
return $id_customer > 0 && EtsRVProductCommentCustomer::isGrandStaff($id_customer);
}
public function install($keep = true)
{
Configuration::updateValue('ETS_RV_INSTALL_TIME', time());
if (!@is_dir(_PS_IMG_DIR_ . $this->name))
@mkdir(_PS_IMG_DIR_ . $this->name, 0755);
if (self::_DIR_IMG_) {
foreach (self::_DIR_IMG_ as $dir) {
if (!@is_dir(_PS_IMG_DIR_ . $this->name . DIRECTORY_SEPARATOR . $dir))
@mkdir(_PS_IMG_DIR_ . $this->name . DIRECTORY_SEPARATOR . $dir, 0755);
}
}
if (Module::isEnabled('productcomments'))
Module::getInstanceByName('productcomments')->disable(true);
if ($keep) {
if (!EtsRVTools::executeSQL(self::INSTALL_SQL_FILE))
return false;
}
EtsRVTools::getInstance()->initEmailTemplate();
EtsRVStaff::initSupperAdmin();
Configuration::updateValue('ETS_RV_FREE_DOWNLOADS_ENABLED', Module::isEnabled('ets_free_downloads') ? 1 : 0);
self::_clearLogByCronjob();
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-ajax');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-comment');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-detail');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-activity');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-all');
if (parent::install() == false ||
!$this->registerHook('displayHome') || //Back Office
!$this->registerHook('displayBackOfficeHeader') || //Back Office
!$this->registerHook('displayFooterProduct') || //Product page footer
!$this->registerHook('header') || //Adds css and javascript on front
!$this->registerHook('displayProductListReviews') || //Product list miniature
!$this->registerHook('displayProductAdditionalInfo') || //Display info in checkout column
!$this->registerHook('displayRightColumnProduct') || //Display info in checkout column
!$this->registerHook('registerGDPRConsent') ||
!$this->registerHook('actionDeleteGDPRCustomer') ||
!$this->registerHook('actionExportGDPRData') ||
!$this->registerHook('productTab') ||
!$this->registerHook('productTabContent') ||
!$this->registerHook('actionObjectLanguageAddAfter') ||
!$this->registerHook('displayFooter') ||
!$this->registerHook('displayCustomerAccount') ||
!$this->registerHook('displayCustomerAccountBlock') ||
!$this->registerHook('moduleRoutes') ||
!$this->registerHook('actionValidateOrder') ||
!$this->registerHook('actionOrderStatusUpdate') ||
!$this->registerHook('displayCustomETSReviews') ||
!$this->registerHook('actionFrontControllerInitAfter') ||
!$this->registerHook('actionObjectEmployeeAddAfter') ||
!$this->registerHook('displayMicrodataAggregateRating') ||
!$this->registerHook('actionObjectShopDeleteAfter') ||
!$this->registerHook('actionObjectShopAddAfter') ||
!$this->registerHook('filterProductContent') ||
!$this->registerHook('displayProductActions') ||
!$this->registerHook('displayProductPriceBlock') ||
!$this->registerHook('displayReassurance') ||
!$this->_installConfigs() ||
!$this->installQuickTabs() ||
!$this->_copyMailTmp()
) {
return false;
}
return true;
}
public function hookRegisterGDPRConsent($params)
{
}
public function hookActionObjectEmployeeAddAfter($params)
{
if (isset($params['object']) && Validate::isLoadedObject($params['object']) && $params['object'] instanceof Employee && $params['object']->id_profile == _PS_ADMIN_PROFILE_) {
EtsRVStaff::initSupperAdmin($params['object']->id);
}
}
public function hookDisplayHome()
{
if ((int)Configuration::get('ETS_RV_DISPLAY_ON_HOME') && (int)Configuration::get('ETS_RV_REVIEW_ENABLED')) {
if (!(int)Configuration::get('ETS_RV_SLICK_LIBRARY_DISABLED')) {
$this->context->controller->addJS($this->_path . 'views/js/slick.js');
$this->context->controller->addCSS([
$this->_path . 'views/css/slick.css',
$this->_path . 'views/css/slick-theme.css',
]);
}
$this->context->controller->addJS($this->_path . 'views/js/home.js');
$cacheLifeTimeBefore = (int)Configuration::get('ETS_RV_CACHE_LIFETIME_BEFORE');
$cacheLifeTime = Configuration::get('ETS_RV_CACHE_LIFETIME');
if ($cacheLifeTime !== '' && ((time() - $cacheLifeTimeBefore) >= (int)$cacheLifeTime * 3600)) {
$cacheLifeTimeBefore = time();
} else {
$cacheLifeTimeBefore = null;
}
if (($cache_id = $this->getCacheId('home', null, $cacheLifeTimeBefore)) == null || !$this->isCached('home.tpl', $cache_id)) {
if ($cache_id !== null && $cacheLifeTimeBefore !== null) {
Configuration::updateValue('ETS_RV_CACHE_LIFETIME_BEFORE', $cacheLifeTimeBefore);
EtsRVSmartyCache::clearCacheFoSmarty('*', 'home');
}
$tpl_vars = [
'average_grade' => EtsRVProductComment::getAverageRate(),
'nb_reviews' => EtsRVProductComment::getNbReviews(),
'latest_reviews' => EtsRVProductComment::getLatestReviews(),
'ETS_RV_DESIGN_COLOR1' => Configuration::get('ETS_RV_DESIGN_COLOR1'),
'ETS_RV_DESIGN_COLOR2' => Configuration::get('ETS_RV_DESIGN_COLOR2'),
'ETS_RV_DESIGN_COLOR3' => Configuration::get('ETS_RV_DESIGN_COLOR3'),
'ETS_RV_DESIGN_COLOR4' => Configuration::get('ETS_RV_DESIGN_COLOR4'),
'ETS_RV_DESIGN_COLOR5' => Configuration::get('ETS_RV_DESIGN_COLOR5'),
'link_all_reviews' => $this->context->link->getModuleLink($this->name, 'all', [], Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')),
];
$this->smarty->assign($tpl_vars);
}
return $this->display(__FILE__, 'home.tpl', $cache_id);
}
}
public function clearCacheTime($cache_id, $date)
{
$path = _PS_CACHE_DIR_ . '/smarty/cache/' . str_replace('|', DIRECTORY_SEPARATOR, $cache_id) . DIRECTORY_SEPARATOR;
if ($dirs = scandir($path)) {
foreach ($dirs as $dir) {
if (is_dir($path . $dir) && $dir != '.' && $dir != '..' && strtotime($dir) < strtotime($date)) {
$this->clearCache('*', $cache_id . '|' . $dir);
@rmdir($path . $dir);
}
}
}
}
/**
* @param Language $language
* @return bool
*/
public function _copyMailTmp($language = null)
{
if ($language !== null) {
$this->_recurseCopy(dirname(__FILE__) . '/mails/en', dirname(__FILE__) . '/mails/' . $language->iso_code);
} elseif ($languages = Language::getLanguages(false)) {
foreach ($languages as $l) {
$path_email = dirname(__FILE__) . '/mails/';
if (!@file_exists($path_email . trim($l['iso_code'])) || !glob($path_email . trim($l['iso_code']) . '/*')) {
$this->_recurseCopy($path_email . 'en', $path_email . trim($l['iso_code']));
}
}
}
return true;
}
public function _recurseCopy($src, $dst)
{
if (!@file_exists($src)) {
return false;
}
$dir = opendir($src);
if (!@mkdir($dst)) {
return false;
}
while (false !== ($file = readdir($dir))) {
if (($file != '.') && ($file != '..')) {
if (is_dir($src . '/' . $file)) {
$this->_recurseCopy($src . '/' . $file, $dst . '/' . $file);
} else {
@copy($src . '/' . $file, $dst . '/' . $file);
}
}
}
closedir($dir);
}
public function cleanUploadImages()
{
if (self::_DIR_IMG_) {
foreach (self::_DIR_IMG_ as $dir) {
$this->removeTree(_PS_IMG_DIR_ . $this->name . DIRECTORY_SEPARATOR . $dir);
}
}
}
/**
* Remove Directory and all Files
* @param $dir
* @return bool
*/
public function removeTree($dir, $rmdir = true)
{
if (@is_dir($dir)) {
$files = array_diff(scandir($dir), array('.', '..'));
foreach ($files as $file) {
$each = $dir . DIRECTORY_SEPARATOR . $file;
if (is_dir($each))
$this->removeTree($each);
elseif (@file_exists($each))
@unlink($each);
}
if ($rmdir)
@rmdir($dir);
}
return true;
}
public function uninstall($keep = true)
{
Configuration::deleteByName('ETS_RV_INSTALL_TIME');
self::_clearLogByCronjob();
$this->cleanUploadImages();
Configuration::deleteByName('ETS_RV_FREE_DOWNLOADS_ENABLED');
if (self::_DIR_IMG_) {
foreach (self::_DIR_IMG_ as $dir) {
if (@is_dir(_PS_IMG_DIR_ . $this->name . DIRECTORY_SEPARATOR . $dir))
@rmdir(_PS_IMG_DIR_ . $this->name . DIRECTORY_SEPARATOR . $dir);
}
}
if (@is_dir(_PS_IMG_DIR_ . $this->name))
@rmdir(_PS_IMG_DIR_ . $this->name);
if (@file_exists(($dest = _PS_THEME_DIR_ . ($this->is17 ? 'assets' : '') . '/cache/productcomments.color.css')))
@unlink($dest);
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-ajax');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-comment');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-detail');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-activity');
Configuration::deleteByName('PS_ROUTE_module-' . $this->name . '-all');
$this->clearCache('*');
if (!parent::uninstall() ||
($keep && !EtsRVTools::executeSQL(self::UNINSTALL_SQL_FILE)) ||
!$this->_uninstallConfigs() ||
!$this->unregisterHook('registerGDPRConsent') ||
!$this->unregisterHook('displayBackOfficeHeader') || //Back Office
!$this->unregisterHook('displayFooterProduct') || //Product page footer
!$this->unregisterHook('header') || //Adds css and javascript on front
!$this->unregisterHook('displayProductListReviews') || //Product list miniature
!$this->unregisterHook('displayProductAdditionalInfo') || //Display info in checkout column
!$this->unregisterHook('displayRightColumnProduct') || //Display info in checkout column
!$this->unregisterHook('registerGDPRConsent') ||
!$this->unregisterHook('actionDeleteGDPRCustomer') ||
!$this->unregisterHook('actionExportGDPRData') ||
!$this->unregisterHook('productTab') ||
!$this->unregisterHook('productTabContent') ||
!$this->unregisterHook('actionObjectLanguageAddAfter') ||
!$this->unregisterHook('displayFooter') ||
!$this->unregisterHook('displayCustomerAccount') ||
!$this->unregisterHook('displayCustomerAccountBlock') ||
!$this->unregisterHook('moduleRoutes') ||
!$this->unregisterHook('actionValidateOrder') ||
!$this->unregisterHook('actionOrderStatusUpdate') ||
!$this->unregisterHook('displayCustomETSReviews') ||
!$this->unregisterHook('actionFrontControllerInitAfter') ||
!$this->unregisterHook('actionObjectEmployeeAddAfter') ||
!$this->unregisterHook('displayMicrodataAggregateRating') ||
!$this->unregisterHook('actionObjectShopDeleteAfter') ||
!$this->unregisterHook('actionObjectShopAddAfter') ||
!$this->unregisterHook('filterProductContent') ||
!$this->unregisterHook('displayProductActions') ||
!$this->unregisterHook('displayProductPriceBlock') ||
!$this->unregisterHook('displayReassurance') ||
!$this->uninstallQuickTabs()
) {
return false;
}
return true;
}
public function reset()
{
if (!$this->uninstall(false)) {
return false;
}
if (!$this->install(false)) {
return false;
}
return true;
}
public function installQuickTabs()
{
$id_parent = $this->addQuickTab(
0,
'',
'Trusted reviews'
);
if ($id_parent && ($quick_tabs = EtsRVDefines::getInstance()->getQuickTabs())) {
foreach ($quick_tabs as $t) {
if (isset($t['class']) && isset($t['label']) && !($parent_id = $this->addQuickTab($id_parent, $t['class'], $t['origin'])))
return false;
if (isset($t['sub']) && $t['sub'] && isset($parent_id) && $parent_id) {
foreach ($t['sub'] as $st) {
if (isset($st['class']) && isset($st['label']) && (!isset($st['tab']) || trim($st['tab']) === '') && !$this->addQuickTab($parent_id, $st['class'], $st['origin']))
return false;
}
}
}
}
return true;
}
public function uninstallQuickTabs()
{
if ($this->removeQuickTab()) {
if ($quick_tabs = EtsRVDefines::getInstance()->getQuickTabs()) {
foreach ($quick_tabs as $t) {
if (isset($t['class']) && !$this->removeQuickTab($t['class']))
return false;
if (isset($t['sub']) && $t['sub']) {
foreach ($t['sub'] as $st) {
if (isset($st['class']) && !$this->removeQuickTab($st['class']))
return false;
}
}
}
}
}
return true;
}
public function addQuickTab($id_parent, $class = '', $label = '')
{
if ($id_parent && !$class)
return 0;
$class_name = trim(self::TAB_PREFIX . $class);
$id = (int)Tab::getIdFromClassName($class_name);
if ($id)
return 0;
$t = new Tab((int)$id);
$t->active = 1;
$t->class_name = $class_name;
$t->name = array();
if ($languages = Language::getLanguages(false)) {
foreach ($languages as $l) {
$t->name[$l['id_lang']] = EtsRVCore::trans($label, $l['iso_code'], 'EtsRVDefines') ?: $label;
}
}
$t->id_parent = (int)$id_parent;
$t->module = $this->name;
return $t->save() ? $t->id : 0;
}
public function removeQuickTab($class_name = '')
{
$id = (int)Tab::getIdFromClassName(self::TAB_PREFIX . $class_name);
if (!$id)
return true;
$tab = new Tab($id);
return !$tab->id || $tab->delete();
}
public function getCacheId($name = null, $before = null, $after = null)
{
if (!(int)Configuration::get('ETS_RV_CACHE_ENABLED'))
return null;
$cache_id = $this->name . (trim(Tools::strtolower($name)) ? '|' . trim(Tools::strtolower($name)) : '') . (is_array($before) ? '|' . implode('|', $before) : ($before ? '|' . trim($before, '|') : ''));
$cache_id = parent::getCacheId($cache_id);
return $cache_id . (is_array($after) ? '|' . implode('|', $after) : ($after ? '|' . trim($after, '|') : ''));
}
public function _installConfigs($configs = [])
{
if (!$configs)
$configs = EtsRVDefines::getInstance()->getALlConfigs();
if ($configs) {
$languages = Language::getLanguages(false);
foreach ($configs as $config) {
if (!isset($config['name']) || !$config['name'])
continue;
$global = isset($config['global']) && $config['global'] ? 1 : 0;
if (isset($config['lang']) && $config['lang']) {
$values = [];
foreach ($languages as $l) {
if (!empty($config['init_content_file']))
$values[$l['id_lang']] = $this->init_content_file(trim($config['name']), $l['iso_code']);
elseif (isset($config['default'])) {
if (is_array($config['default']) && count($config['default']) > 0)
$values[$l['id_lang']] = !empty($config['default']['og']) ? EtsRVTools::trans($config['default']['og'], $l['iso_code']) : '';
else
$values[$l['id_lang']] = $config['default'];
}
}
$this->configUpdateValue($config['name'], $global, $values, true);
} else {
$this->configUpdateValue($config['name'], $global, isset($config['default']) ? $config['default'] : '', true);
}
}
}
Configuration::updateGlobalValue('ETS_RV_IMPORT_PRESTASHOP', 0);
Configuration::updateGlobalValue('ETS_RV_MAX_ID_IMPORT_PRESTASHOP', 0);
return true;
}
public function init_content_file($key, $iso_code)
{
$source_file = dirname(__FILE__) . '/views/init/%s/' . Tools::strtolower($key) . '.html';
if (@file_exists(sprintf($source_file, $iso_code)))
return Tools::file_get_contents(sprintf($source_file, $iso_code));
return file_exists(sprintf($source_file, 'en')) ? Tools::file_get_contents(sprintf($source_file, 'en')) : '';
}
public function _uninstallConfigs()
{
$configs = EtsRVDefines::getInstance()->getALlConfigs();
if ($configs) {
foreach ($configs as $config) {
if (!isset($config['name']) || !$config['name'])
continue;
Configuration::deleteByName($config['name']);
}
}
Configuration::deleteByName('ETS_RV_IMPORT_PRESTASHOP');
Configuration::deleteByName('ETS_RV_EMAIL_NOTIFICATIONS');
return true;
}
public function configUpdateValue($key, $global, $values, $html = false)
{
return $global ? Configuration::updateGlobalValue($key, $values, $html) : Configuration::updateValue($key, $values, $html);
}
public function getContent()
{
if (!Configuration::getGlobalValue('ETS_RV_IMPORT_PRESTASHOP')
&& Module::isEnabled('productcomments')
&& EtsRVTools::hasProductComments()
) {
Configuration::updateGlobalValue('ETS_RV_IMPORT_PRESTASHOP', 1);
$this->smarty->assign(
array(
'link_import' => EtsRVLink::getAdminLink(self::TAB_PREFIX . 'ImportExport', true, [], [], $this->context),
'link_review' => EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Reviews', true, [], [], $this->context),
)
);
return $this->display(__FILE__, 'prestashop_comment.tpl');
} else {
Configuration::updateGlobalValue('ETS_RV_IMPORT_PRESTASHOP', 1);
Tools::redirectAdmin(EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Reviews', true, [], [], $this->context));
}
}
public function findProductId($product)
{
return $product && is_object($product) && method_exists($product, 'getId') ? $product->getId() : (is_object($product) && property_exists($product, 'id') ? $product->id : (is_array($product) && isset($product['id_product']) ? (int)$product['id_product'] : 0));
}
public function hookActionObjectShopDeleteAfter($params)
{
if (isset($params['object']) && $params['object'] instanceof Shop && (int)$params['object']->id > 0) {
EtsRVEmailTemplate::deleteByIdShop((int)$params['object']->id);
}
}
public function hookActionObjectShopAddAfter($params)
{
if (isset($params['object']) && $params['object'] instanceof Shop && (int)$params['object']->id > 0) {
EtsRVEmailTemplate::duplicateByIdShop((int)$params['object']->id);
}
}
public function hookActionValidateOrder($params)
{
if (trim(Configuration::get('ETS_RV_EMAIL_TO_CUSTOMER_ORDER_STATUS')) == 'new'
&& !empty($params['order'])
&& $params['order'] instanceof Order
&& Validate::isLoadedObject($params['order'])
) {
$this->invitationEmail($params['order']);
}
}
public function hookActionOrderStatusUpdate($params)
{
$orderStatusId = !empty($params['newOrderStatus']) && $params['newOrderStatus'] instanceof OrderState && Validate::isLoadedObject($params['newOrderStatus']) ? (int)$params['newOrderStatus']->id : 0;
$orderId = !empty($params['id_order']) ? (int)$params['id_order'] : 0;
if (trim(Configuration::get('ETS_RV_EMAIL_TO_CUSTOMER_ORDER_STATUS')) == 'validated'
&& $orderStatusId > 0
&& $orderId > 0
&& ($verify_purchase = Configuration::get('ETS_RV_VERIFY_PURCHASE'))
) {
$order_status = explode(',', $verify_purchase);
if (in_array($orderStatusId, $order_status)) {
$order = new Order((int)$params['id_order']);
$this->invitationEmail($order);
}
}
if ($orderId > 0 && ($orderStatusId == 5 || $orderStatusId == 6)) {
//EtsRVTracking::clearQueueByIdOrder($orderId);
}
}
public function checkCartRuleValidity()
{
if (Tools::getValue('controller') == 'cart'
&& Tools::isSubmit('addDiscount')//1.7
&& Tools::isSubmit('ajax')
&& !Tools::getIsset('fc')
&& !Tools::getIsset('module')
&& !Configuration::get('ETS_RV_USE_OTHER_VOUCHER_SAME_CART')
) {
$error = '';
$code = trim(Tools::getValue('discount_name'));
$this->checkValidityVoucher($code, $this->context);
if ($error !== '') {
die(json_encode(array(
'errors' => array($error),
'hasError' => true,
'quantity' => null,
)));
}
}
}
public function checkValidityVoucher($code, $context = null)
{
$error = '';
if ($context == null)
$context = Context::getContext();
if ($code !== '' && !Validate::isCleanHtml($code)) {
$error = $this->l('Your voucher code is invalid');
} else {
if (Module::isEnabled('ets_promotion') && EtsRVCartRule::getCartRuleByPromotion($code))
return $error;
if ($id_cart_rule = CartRule::getIdByCode($code)) {
$voucherCode = null;
if (!EtsRVCartRule::canUseCartRule($context->cart->id, $id_cart_rule, $voucherCode)) {
$error = sprintf($this->l('Cannot use voucher code %s with other voucher codes'), $voucherCode);
}
} else {
$error = $this->l('Your voucher code does not exist');
}
}
return $error;
}
public function hookActionFrontControllerInitAfter()
{
$this->checkCartRuleValidity();
}
public function invitationEmail(Order $order)
{
if ((int)Configuration::get('ETS_RV_SEND_RATING_INVITATION') < 1 || !(EtsRVEmailTemplate::isEnabled('tocustomer_rating_invitation') || EtsRVEmailTemplate::isEnabled('tocustomer_rating_invitation_getvoucher')) || EtsRVTracking::getTrackingByOrderId($order->id)) {
return false;
}
$customer = new Customer((int)$order->id_customer);
if (!$customer->id || $customer->is_guest) {
return false;
}
$exclude_id_product = (int)Configuration::getGlobalValue('PH_EXTEND_ID_PRODUCT');
$languageObj = new Language($customer->id_lang);
$idLang = $languageObj->id ?: $this->context->language->id;
$customer_name = $customer->firstname . ' ' . $customer->lastname;
$products = [];
$first_product_name = null;
if ($order_products = $order->getProducts()) {
foreach ($order_products as $product) {
if ($exclude_id_product == (int)$product['product_id'])
continue;
$product = new Product((int)$product['product_id'], false, $idLang);
$image = Product::getCover($product->id);
$products[] = [
'link' => $this->context->link->getProductLink($product, $product->link_rewrite, $product->category, $product->ean13, $idLang),
'name' => trim($product->name),
'image' => $this->context->link->getImageLink($product->link_rewrite, isset($image['id_image']) ? $image['id_image'] : 0, EtsRVTools::getFormattedName('cart')),
];
if ($first_product_name == null)
$first_product_name = $product->name;
}
}
if ($exclude_id_product > 0 && !count($products))
return false;
$templateVars = [
'{customer_name}' => $customer_name,
'{product_list}' => $products,
'{product_name}' => $first_product_name,
'{rate_url}' => $this->context->link->getModuleLink($this->name, 'comment', ['current_tab' => 'waiting_for_review']),
];
if (Configuration::get('ETS_RV_DISCOUNT_ENABLED') && EtsRVEmailTemplate::isEnabled('tocustomer_rating_invitation_getvoucher')) {
$discount_option = Configuration::get('ETS_RV_DISCOUNT_OPTION');
$apply_discount = Configuration::get('ETS_RV_APPLY_DISCOUNT');
$free_shipping = Configuration::get('ETS_RV_FREE_SHIPPING');
$discount_value = '';
if ($discount_option == 'auto') {
switch ($apply_discount) {
case 'percent':
$discount_value = Configuration::get('ETS_RV_REDUCTION_PERCENT') . '%';
break;
case 'amount':
$discount_value = Tools::displayPrice((float)Configuration::get('ETS_RV_REDUCTION_AMOUNT'), Currency::getCurrencyInstance((int)Configuration::get('ETS_RV_MINIMUM_AMOUNT_CURRENCY')));
break;
}
} else {
$cart_rule = new CartRule(CartRule::getIdByCode(Configuration::get('ETS_RV_DISCOUNT_CODE')));
if ($cart_rule->id) {
if ($cart_rule->reduction_percent) {
$discount_value = $cart_rule->reduction_percent . '%';
} elseif ($cart_rule->reduction_amount) {
$discount_value = Tools::displayPrice($cart_rule->reduction_amount, Currency::getCurrencyInstance($cart_rule->reduction_currency));
}
}
}
$templateVars['{voucher_value}'] = $discount_value != '' ? sprintf($this->l('with discount of %s'), $discount_value) . ' ' . ($free_shipping ? $this->l('and free shipping') : '') : ($free_shipping ? $this->l('of free shipping') : '');
return EtsRVMail::send(
$idLang
, 'tocustomer_rating_invitation_getvoucher'
, null
, $templateVars
, $customer->email
, $customer_name
, true
, $customer->id
, 0
, 0
, $this->context->shop->id
, 0
, isset($cart_rule) && $cart_rule->id > 0 ? $cart_rule->id : 0
, $order->id
, true
);
}
if (EtsRVEmailTemplate::isEnabled('tocustomer_rating_invitation')) {
return EtsRVMail::send(
$idLang
, 'tocustomer_rating_invitation'
, null
, $templateVars
, $customer->email
, $customer_name
, true
, $customer->id
, 0
, 0
, $this->context->shop->id
, 0
, 0
, $order->id
, true
);
}
}
const _REWRITE_PATTERN_ = '[_a-zA-Z0-9\x{0600}-\x{06FF}\pL\pS-]*?';
const _REWRITE_ = 'review/my-reviews';
public function hookModuleRoutes()
{
return array(
'module-' . $this->name . '-ajax' => array(
'controller' => 'comment',
'rule' => 'module/' . $this->name . '/comment',
'keywords' => [],
'params' => array(
'fc' => 'module',
'module' => $this->name,
),
),
'module-' . $this->name . '-comment' => array(
'controller' => 'comment',
'rule' => self::_REWRITE_ . '.html',
'keywords' => array(),
'params' => array(
'fc' => 'module',
'module' => $this->name,
),
),
'module-' . $this->name . '-detail' => [
'controller' => 'comment',
'rule' => self::_REWRITE_ . '/{id_product_comment}-{id_product}.html',//{-:rewrite}
'keywords' => [
'id_product_comment' => ['regexp' => '[0-9]+', 'param' => 'id_product_comment'],
'id_product' => ['regexp' => '[0-9]+', 'param' => 'id_product'],
//'rewrite' => ['regexp' => self::_REWRITE_PATTERN_, 'param' => 'rewrite'],
],
'params' => array(
'fc' => 'module',
'module' => $this->name,
),
],
'module-' . $this->name . '-activity' => array(
'controller' => 'activity',
'rule' => 'activity/activity-list.html',
'keywords' => [],
'params' => array(
'fc' => 'module',
'module' => $this->name,
),
),
'module-' . $this->name . '-all' => [
'controller' => 'all',
'rule' => 'review/all-reviews.html',
'keywords' => [],
'params' => array(
'fc' => 'module',
'module' => $this->name,
),
]
);
}
static $per_pages = [
20,
50,
100,
300,
1000
];
static $cache_review_tabs = [];
public function reviewTabs($id_customer = 0)
{
if ($id_customer <= 0 && isset($this->context->customer) && $this->context->customer->id) {
$id_customer = (int)$this->context->customer->id;
}
if (!self::$cache_review_tabs) {
self::$cache_review_tabs = [];
if ((int)Configuration::get('ETS_RV_REVIEW_ENABLED')) {
self::$cache_review_tabs['waiting_for_review'] = array(
'title' => $this->l('Waiting for review'),
'class' => 'ets_rv_waiting_for_review',
'link' => $this->context->link->getModuleLink($this->name, 'comment', ['current_tab' => 'waiting_for_review'])
);
self::$cache_review_tabs['my_review'] = array(
'title' => $this->l('My reviews'),
'class' => 'ets_rv_my_review',
'link' => $this->context->link->getModuleLink($this->name, 'comment', ['current_tab' => 'my_review']),
);
}
if ((int)Configuration::get('ETS_RV_QUESTION_ENABLED')) {
self::$cache_review_tabs['my_question'] = array(
'title' => $this->l('My questions'),
'class' => 'ets_rv_my_question',
'link' => $this->context->link->getModuleLink($this->name, 'comment', ['current_tab' => 'my_question']),
);
}
self::$cache_review_tabs['activity'] = [
'title' => $this->l('Activities'),
'class' => 'ets_rv_my_activity',
'link' => $this->context->link->getModuleLink($this->name, 'activity'),
];
if (EtsRVProductCommentCustomer::isGrandStaff($id_customer)) {
if ((int)Configuration::get('ETS_RV_REVIEW_ENABLED')) {
self::$cache_review_tabs['manager_review'] = array(
'title' => $this->l('Manage reviews'),
'class' => 'ets_rv_manager_review',
'link' => $this->context->link->getModuleLink($this->name, 'comment', ['current_tab' => 'manager_review']),
);
}
if ((int)Configuration::get('ETS_RV_QUESTION_ENABLED')) {
self::$cache_review_tabs['manager_question'] = array(
'title' => $this->l('Manage questions'),
'class' => 'ets_rv_manager_question',
'link' => $this->context->link->getModuleLink($this->name, 'comment', ['current_tab' => 'manager_question']),
);
}
}
}
return self::$cache_review_tabs;
}
static $st_products = [];
public function hookDisplayCustomerAccountBlock($params)
{
if ($this->isCustomerLogged() && ((int)Configuration::get('ETS_RV_REVIEW_ENABLED') || (int)Configuration::get('ETS_RV_QUESTION_ENABLED'))) {
$id_product = (int)Tools::getValue('id_product');
$current_tab = trim(Tools::getValue('current_tab', Tools::getValue('back')));
if (!$current_tab || !Validate::isCleanHtml($current_tab)) {
$current_tab = 'waiting_for_review';
}
$idCustomer = isset($this->context->customer) && $this->context->customer->id && $this->context->customer->isLogged() ? $this->context->customer->id : 0;
if ((trim($current_tab) == 'manager_review' || trim($current_tab) == 'manager_question') && ($idCustomer <= 0 || !EtsRVProductCommentCustomer::isGrandStaff($idCustomer))) {
if ($idCustomer <= 0)
Tools::redirect($this->context->link->getPageLink('my-account'));
else
Tools::redirect($this->context->link->getModuleLink($this->name, 'comment', ['current_tab' => (trim($current_tab) == 'manager_review' ? 'my_review' : 'my_question')]));
}
$assigns = array(
'href' => $this->context->link->getModuleLink($this->name, 'comment'),
'current_tab' => $current_tab,
'tabs' => $this->reviewTabs(),
'ETS_RV_DESIGN_COLOR2' => Configuration::get('ETS_RV_DESIGN_COLOR2'),
);
if ($id_product) {
$id_product_comment = (int)Tools::getValue('id_product_comment');
$productComment = new EtsRVProductComment($id_product_comment);
if (!$productComment->id) {
Tools::redirect($this->context->link->getPageLink('my-account'));
}
$qa = (int)Tools::getValue('qa') || $productComment->question ? 1 : 0;
$product = new Product($id_product, true, $this->context->language->id);
if ($product->id > 0) {
$product->link = $this->context->link->getProductLink($product, $product->link_rewrite, $product->category, $product->ean13, $this->context->language->id);
}
$params = [
'id_product' => $id_product,
'id_product_comment' => $id_product_comment
];
$assigns = array_merge($assigns, array(
'qa' => $qa,
'product' => $product,
'id_product_comment' => $id_product_comment,
'ets_rv_product' => $this->productModal($id_product),
'list' => $qa ? $this->displayProductQuestionsList($params) : $this->displayProductCommentsList($params),
));
} else {
$min_per_page = min(self::$per_pages);
$page = Tools::getValue('page');
if (!$page || !Validate::isUnsignedInt($page)) {
$page = 1;
}
$per_page = Tools::getValue('per_page');
if (!$per_page || !Validate::isUnsignedInt($per_page)) {
$per_page = $min_per_page;
}
if (trim($current_tab) == 'waiting_for_review') {
$order_states = Configuration::get('ETS_RV_VERIFY_PURCHASE');
if (trim($order_states) !== '') {
$order_states = explode(',', $order_states);
$assigns['order_states'] = EtsRVProductComment::getOrderStateByIds($order_states);
}
$maximum_product_comment = trim(Configuration::get('ETS_RV_MAXIMUM_REVIEW_PER_USER'));
$purchasedInTime = EtsRVTools::isCustomerPurchased() && (int)Configuration::get('ETS_RV_REVIEW_AVAILABLE_TIME') > 0 ? (int)Configuration::get('ETS_RV_REVIEW_AVAILABLE_TIME') : 0;
$orders = EtsRVProductComment::getOrders($this->context->customer->id, 0, $page, $per_page, $this->context, $maximum_product_comment, $purchasedInTime);
if ($orders) {
foreach ($orders as &$order) {
$order['image_link'] = $order['id_image'] > 0 ? $this->context->link->getImageLink($order['link_rewrite'], $order['id_image'], EtsRVTools::getFormattedName('cart')) : '';
$order['product_link'] = $this->context->link->getProductLink((new Product($order['id_product'])), $order['link_rewrite'], null, null, $this->context->language->id);
$order['purchased'] = isset($order['current_state']) && is_array($order_states) && in_array($order['current_state'], $order_states);
}
}
$total_records = EtsRVProductComment::getOrders($this->context->customer->id, 1, 0, 0, $this->context, $maximum_product_comment, $purchasedInTime);
$assigns['total_records'] = $total_records;
$assigns['orders'] = $orders;
$assigns['ETS_RV_DESIGN_COLOR2'] = Configuration::get('ETS_RV_DESIGN_COLOR2');
$assigns['ETS_RV_DESIGN_COLOR3'] = Configuration::get('ETS_RV_DESIGN_COLOR3');
} else {
$question = trim($current_tab) == 'my_question' || trim($current_tab) == 'manager_question' ? 1 : 0;
$isGrandStaff = (trim($current_tab) == 'manager_review' || trim($current_tab) == 'manager_question') && EtsRVProductCommentCustomer::isGrandStaff($idCustomer);
$productComments = EtsRVProductComment::getList($this->context->customer->id, $this->context->language->id, 0, $page, $per_page, $question, $isGrandStaff);
if ($productComments) {
foreach ($productComments as &$productComment) {
$productComment['link'] = $this->context->link->getModuleLink($this->name, 'detail', ['id_product_comment' => (int)$productComment['id_ets_rv_product_comment'], 'id_product' => (int)$productComment['id_product']]);
if (isset($productComment['id_product']) && $productComment['id_product'] > 0) {
if (!isset(self::$st_products[$productComment['id_product']])) {
$p = new Product($productComment['id_product'], false, $this->context->language->id);
$cover = Product::getCover($p->id, $this->context);
$productComment['image_link'] = isset($cover['id_image']) && $cover['id_image'] > 0 ? $this->context->link->getImageLink($p->link_rewrite, $cover['id_image'], EtsRVTools::getFormattedName('cart')) : '';
} else
$productComment['image_link'] = self::$st_products[$productComment['id_product']];
} else {
$productComment['id_image'] = null;
}
}
}
$total_records = EtsRVProductComment::getList($this->context->customer->id, $this->context->language->id, true, 0, 0, $question, $isGrandStaff);
$assigns['total_records'] = $total_records;
$assigns['productComments'] = $productComments;
$assigns['fields_list'] = EtsRVDefines::getInstance()->getFieldsList($question, true);
$assigns['isGrandStaff'] = $isGrandStaff;
}
$paginates = EtsRVLink::getPagination($this->name, 'comment', $total_records, $page, $per_page, array('current_tab' => $current_tab), 7, $this->context);
$per_pages = array();
if (self::$per_pages) {
foreach (self::$per_pages as $n) {
$per_pages[$n] = $this->context->link->getModuleLink($this->name, 'comment', array('page' => 1, 'per_page' => $n, 'current_tab' => $current_tab));
}
}
$assigns = array_merge($assigns, array(
'paginates' => $paginates,
'per_pages' => $per_pages,
'current_per_page' => $per_page,
'show_footer_btn' => $min_per_page > 0 && ceil($total_records / $min_per_page) > 1,
));
}
$this->smarty->assign($assigns);
return $this->display(__FILE__, 'front-comments-list.tpl');
} else {
Tools::redirect($this->context->link->getPageLink('my-account'));
}
}
public function hookFilterProductContent($params)
{
if (true || empty($params['object']->id) || version_compare(_PS_VERSION_, '1.7.8.0', '<')) {
return $params;
}
$productCommentRepository = EtsRVProductCommentRepository::getInstance();
$validateOnly = $this->validateOnly();
$averageGrade = $productCommentRepository->getAverageGrade($params['object']->id, $this->context->language->id, $validateOnly, $this->backOffice, $this->context);
$commentsNb = $productCommentRepository->getCommentsNumber($params['object']->id, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context);
$params['object']->productComments = [
'averageRating' => $averageGrade,
'nbComments' => $commentsNb,
];
return $params;
}
public function hookProductTab($params)
{
if (!$this->is17 || !(int)Configuration::get('ETS_RV_REVIEW_ENABLED') && !Configuration::get('ETS_RV_QUESTION_ENABLED'))
return '';
$product = $params['product'];
$idProduct = $this->findProductId($product);
$repository = EtsRVProductCommentRepository::getInstance();
$validateOnly = $this->validateOnly();
$nbComment = $repository->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context);
$nbQA = $repository->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context, 1);
$this->context->smarty->assign([
'nbComment' => $nbComment,
'nbQA' => $nbQA,
]);
return $this->display(__FILE__, 'product-tab.tpl');
}
public function hookDisplayCustomerAccount()
{
if (!isset($this->context->customer->id) || !$this->context->customer->id || !(int)Configuration::get('ETS_RV_REVIEW_ENABLED'))
return '';
$this->smarty->assign(array(
'link' => $this->context->link->getModuleLink($this->name, 'comment'),
'is17' => $this->is17
));
return $this->display(__FILE__, 'front-block.tpl');
}
public function hookActionObjectLanguageAddAfter($params)
{
if (isset($params['object']) && Validate::isLoadedObject($params['object'])) {
EtsRVProductComment::updateNewLanguage((int)$params['object']->id);
$this->_copyMailTmp($params['object']);
}
}
public function hookActionDeleteGDPRCustomer($customer)
{
if (isset($customer['id'])) {
EtsRVProductCommentRepository::getInstance()->cleanCustomerData($customer['id']);
EtsRVCommentRepository::getInstance()->cleanCustomerData($customer['id']);
EtsRVReplyCommentRepository::getInstance()->cleanCustomerData($customer['id']);
}
return true;
}
public function hookActionExportGDPRData($customer)
{
if (isset($customer['id'])) {
$langId = isset($customer['id_lang']) ? $customer['id_lang'] : $this->context->language->id;
return json_encode(EtsRVProductCommentRepository::getInstance()->getCustomerData($customer['id'], $langId));
}
}
public function hookDisplayBackOfficeHeader()
{
$controller = Tools::getValue('controller');
//die($controller);
if (($controller == 'AdminEtsRVReviewsRatings' || $controller == 'AdminEtsRVReplies' || $controller == 'AdminEtsRVActivity' || $controller == 'AdminEtsRVReviews' || $controller == 'AdminEtsRVComments')) {
$this->context->controller->addCSS($this->_path . 'views/css/review-media.css');
}
$css_files = [
$this->_path . 'views/css/admin_all.css'
];
if ($this->context->controller instanceof AdminEtsRVBaseController) {
$this->addJss(true);
}
if (trim(Tools::getValue('configure')) == $this->name) {
$css_files[] = $this->_path . 'views/css/productcomments.admin.css';
}
$this->context->controller->addCSS($css_files);
$this->context->smarty->assign([
'ETS_RV_REVIEW_LINK' => EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Reviews', true, [], [], $this->context),
'ETS_RV_ACTIVITY_LINK' => EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Activity', true, [], [], $this->context),
]);
Media::addJsDef([
'ETS_RV_DELETE_TITLE' => $this->l('Delete'),
'ETS_RV_CLEAN_LOG_CONFIRM' => $this->l('Do you want to clear all mail logs?')
]);
return $this->display(__FILE__, 'admin-head.tpl');
}
public function hookHeader()
{
$controller = Tools::getValue('controller');
$js_files = [];
$css_files = [
'/modules/' . $this->name . '/views/css/productcomments.all.css',
];
if (!$this->is17) {
$css_files[] = '/modules/' . $this->name . '/views/css/productcomment_16_all.css';
}
if ($controller == 'index' && (int)Configuration::get('ETS_RV_DISPLAY_ON_HOME') && (int)Configuration::get('ETS_RV_REVIEW_ENABLED')) {
$css_files[] = '/modules/' . $this->name . '/views/css/review_home.css';
}
if ($controller == 'activity') {
$css_files[] = '/modules/' . $this->name . '/views/css/review_activity.css';
}
if ($controller == 'identity') {
$css_files[] = '/modules/' . $this->name . '/views/css/review_identity.css';
}
if ($controller == 'myaccount') {
$css_files[] = '/modules/' . $this->name . '/views/css/review_my-account.css';
}
$html = '';
if ($this->context->controller instanceof ProductControllerCore ||
$this->context->controller instanceof Ets_reviewsCommentModuleFrontController ||
$this->context->controller instanceof Ets_reviewsActivityModuleFrontController
) {
$this->context->controller->addJqueryUI('ui.datepicker');
$html .= $this->addJss(true);
if (Configuration::get('ETS_RV_UPLOAD_PHOTO_ENABLED') || Configuration::get('ETS_RV_UPLOAD_VIDEO_ENABLED') || Configuration::get('ETS_RV_DISPLAY_ALL_PHOTO')) {
$css_files[] = '/modules/' . $this->name . '/views/css/review-media.css';
}
if (!(int)Configuration::get('ETS_RV_SLICK_LIBRARY_DISABLED')) {
$css_files[] = '/modules/' . $this->name . '/views/css/slick-theme.css';
$css_files[] = '/modules/' . $this->name . '/views/css/slick.css';
$js_files[] = '/modules/' . $this->name . '/views/js/slick.js';
}
$js_files = array_merge($js_files, [
'/modules/' . $this->name . '/views/js/modal.js',
'js/jquery/plugins/growl/jquery.growl.js',
'js/jquery/plugins/fancybox/jquery.fancybox.js',
'/modules/' . $this->name . '/views/js/jquery.rating.plugin.js',
'/modules/' . $this->name . '/views/js/function.js',
'/modules/' . $this->name . '/views/js/list-comments.js',
'/modules/' . $this->name . '/views/js/front.js'
]);
$css_files = array_merge($css_files, [
'/js/jquery/plugins/growl/jquery.growl.css',
'/modules/' . $this->name . '/views/css/productcomments.css',
]);
if (!$this->is17)
$css_files[] = '/modules/' . $this->name . '/views/css/productcomment_16.css';
} elseif ($this->context->controller instanceof IdentityController) {
$js_files = array_merge([
'/js/jquery/plugins/growl/jquery.growl.js',
'/modules/' . $this->name . '/views/js/front.js'
]);
$css_files = array_merge($css_files, [
'/js/jquery/plugins/growl/jquery.growl.css',
]);
}
$physical_uri = rtrim($this->context->shop->physical_uri, '/');
if ($css_files) {
foreach ($css_files as $cssUrl) {
if ($this->is17 && method_exists($this->context->controller, 'registerStylesheet'))
$this->context->controller->registerStylesheet(sha1($cssUrl), $cssUrl, ['media' => 'all', 'priority' => 80]);
else
$this->context->controller->addCSS($physical_uri . $cssUrl, 'all');
}
}
if ($js_files) {
foreach ($js_files as $jsUrl) {
if ($this->is17 && method_exists($this->context->controller, 'registerJavascript'))
$this->context->controller->registerJavascript(sha1($jsUrl), $jsUrl, ['position' => 'bottom', 'priority' => 80]);
else
$this->context->controller->addJS($physical_uri . $jsUrl);
}
}
if ($this->context->controller instanceof ProductControllerCore ||
$this->context->controller instanceof Ets_reviewsCommentModuleFrontController ||
$this->context->controller instanceof Ets_reviewsActivityModuleFrontController ||
$this->context->controller instanceof IndexController ||
$this->context->controller instanceof Ets_reviewsAllModuleFrontController)
$html .= $this->generateColor();
return $html;
}
public function generateColor()
{
if (($cache_id = $this->getCacheId('color')) == null || !$this->isCached('color-css.tpl', $cache_id)) {
$colorCss = Tools::file_get_contents($this->getLocalPath() . 'views/css/productcomments.color.css');
if (trim($colorCss) !== '') {
$colors = $this->getColors();
if (count($colors) > 0)
for ($loop = 1; $loop <= self::DEFAULT_MAX_COLOR; $loop++)
$colorCss = str_replace('#00000' . $loop, $colors['ETS_RV_DESIGN_COLOR' . $loop], $colorCss);
}
$this->smarty->assign('colorCss', $colorCss);
}
return $this->display(__FILE__, 'color-css.tpl', $cache_id);
}
public function hookDisplayFooter($params)
{
if (!empty($this->context->customer->id) && $this->context->controller instanceof IdentityController) {
$this->smarty->assign(array(
'avatar' => $this->context->customer->id ? EtsRVProductCommentCustomer::getAvatarByIdCustomer($this->context->customer->id) : '',
'upload_dir' => $this->getMediaLink(_PS_IMG_ . $this->name . '/a/'),
'upload_url' => $this->context->link->getModuleLink($this->name, 'upload', ['id_customer' => (int)$this->context->customer->id], Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')),
));
return $this->display(__FILE__, 'footer.tpl');
}
}
public function getMediaLink($path)
{
return $this->employee ? $path : $this->context->link->getMediaLink($path);
}
public function hookDisplayFooterProduct($params)
{
if ($this->is17) {
return $this->hookDisplayFrontend($params['product']);
}
}
public function hookDisplayRightColumnProduct($params)
{
if (($this->is17 || trim(Tools::getValue('controller')) == 'product' && !(int)Tools::getValue('content_only')) && trim(Configuration::get('ETS_RV_AVERAGE_RATE_POSITION')) == 'product_price') {
return $this->hookDisplayProductAdditionalInfo(['id_product' => (int)Tools::getValue('id_product'), 'hook' => 'product_price']);
}
}
public function hookDisplayCustomETSReviews()
{
if ((trim(Tools::getValue('controller')) == 'product' && !(int)Tools::getValue('content_only')) && trim(Configuration::get('ETS_RV_AVERAGE_RATE_POSITION')) == 'custom') {
return $this->hookDisplayProductAdditionalInfo(['id_product' => (int)Tools::getValue('id_product'), 'hook' => 'custom']);
}
}
public function hookDisplayProductActions()
{
if ((trim(Tools::getValue('controller')) == 'product' && !(int)Tools::getValue('content_only')) && trim(Configuration::get('ETS_RV_AVERAGE_RATE_POSITION')) == 'add_to_cart') {
return $this->hookDisplayProductAdditionalInfo(['id_product' => (int)Tools::getValue('id_product'), 'hook' => 'add_to_cart']);
}
}
public function hookDisplayProductPriceBlock($params)
{
if (!empty($params['type']) && $params['type'] == 'after_price' && (trim(Tools::getValue('controller')) == 'product' && !(int)Tools::getValue('content_only')) && trim(Configuration::get('ETS_RV_AVERAGE_RATE_POSITION')) == 'product_price') {
return $this->hookDisplayProductAdditionalInfo(['id_product' => (int)Tools::getValue('id_product'), 'hook' => 'product_price']);
}
}
public function hookDisplayReassurance()
{
if ((trim(Tools::getValue('controller')) == 'product' && !(int)Tools::getValue('content_only')) && trim(Configuration::get('ETS_RV_AVERAGE_RATE_POSITION')) == 'product_reassurance') {
return $this->hookDisplayProductAdditionalInfo(['id_product' => (int)Tools::getValue('id_product'), 'hook' => 'product_reassurance']);
}
}
public function hookProductTabContent($params)
{
return $this->hookDisplayFrontend($params['product']);
}
public function getGradeStats($idProduct, $force_smarty = false)
{
$validateOnly = $this->validateOnly();
$repository = EtsRVProductCommentRepository::getInstance();
//Reviews:
$averageGrade = $repository->getAverageGrade($idProduct, $this->context->language->id, $validateOnly, $this->backOffice, $this->context, 0);
$reviewHasImageVideoNb = $repository->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context, 0, true);
$gradesNb = $repository->getGradesNumber($idProduct, $this->context->language->id, $validateOnly, $this->backOffice, $this->context);
$stats = array(
'5' => array(
'id' => 'excellent',
'name' => $this->l('Excellent')
),
'4' => array(
'id' => 'good',
'name' => $this->l('Good')
),
'3' => array(
'id' => 'medium',
'name' => $this->l('Medium')
),
'2' => array(
'id' => 'poor',
'name' => $this->l('Poor')
),
'1' => array(
'id' => 'terrible',
'name' => $this->l('Terrible')
),
);
foreach ($stats as $grade => &$stat) {
$gradeNbItem = (int)$repository->getGradesNumber($idProduct, $this->context->language->id, $validateOnly, $this->backOffice, $this->context, $grade);
$stat['grade_percent'] = $gradesNb > 0 ? $gradeNbItem * 100 / $gradesNb : 0;
$stat['grade_total'] = $gradeNbItem;
}
$array_result = [
'average_grade' => $averageGrade,
'grade_stats' => $stats,
'nb_reviewHasImageVideo' => $reviewHasImageVideoNb,
'has_video_image' => Configuration::get('ETS_RV_UPLOAD_PHOTO_ENABLED') || Configuration::get('ETS_RV_UPLOAD_VIDEO_ENABLED'),
];
if (!$force_smarty) {
$array_result['nb_reviews'] = $repository->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context, 0);
$array_result['nb_questions'] = $repository->getCommentsNumber($idProduct, $this->context->language->id, 0, $this->validateOnly(1), $this->backOffice, 0, $this->context, 1);
return $array_result;
}
$this->smarty->assign($array_result);
}
public function getReCaptchaConfigs()
{
return array(
'ETS_RV_RECAPTCHA_TYPE' => ($recaptcha_type = Configuration::get('ETS_RV_RECAPTCHA_TYPE')),
'ETS_RV_RECAPTCHA_ENABLED' => (int)Configuration::get('ETS_RV_RECAPTCHA_ENABLED'),
'ETS_RV_RECAPTCHA_SITE_KEY' => Configuration::get('ETS_RV_RECAPTCHA_SITE_KEY_V' . ($recaptcha_type != 'recaptcha_v3' ? '2' : '3')),
'ETS_RV_RECAPTCHA_FOR' => Configuration::get('ETS_RV_RECAPTCHA_FOR') ? explode(',', Configuration::get('ETS_RV_RECAPTCHA_FOR')) : array(),
'ETS_RV_RECAPTCHA_USER_REGISTERED' => (int)Configuration::get('ETS_RV_RECAPTCHA_USER_REGISTERED'),
);
}
public function getCurrentCustomer($force_smarty = false)
{
if ($this->employee) {
$info = EtsRVStaff::getInfos($this->employee);
} elseif (isset($this->context->customer) && $this->context->customer->id > 0) {
$info = EtsRVProductCommentCustomer::getCustomer($this->context->customer->id);
}
if (isset($info['avatar']) && trim($info['avatar']) !== '')
$profile_photo = $info['avatar'];
if (isset($info['display_name']) && trim($info['display_name']) !== '')
$customer_name = $info['display_name'];
if (!isset($profile_photo) || trim($profile_photo) == '')
$profile_photo = $this->employee ? null : ($this->context->customer->id ? EtsRVProductCommentCustomer::getAvatarByIdCustomer($this->context->customer->id) : null);
if (trim($profile_photo) !== '')
$profile_photo = $this->getMediaLink(_PS_IMG_ . $this->name . '/a/' . $profile_photo);
if (!isset($customer_name) || trim($customer_name) == '')
$customer_name = $this->employee ? ($this->context->employee->id ? $this->context->employee->firstname . ' ' . $this->context->employee->lastname : $this->l('Administrator')) : (isset($this->context->customer->id) && $this->context->customer->id ? $this->context->customer->firstname . ' ' . $this->context->customer->lastname : $this->l('Guest'));
$tpl_vars = [
'profile_photo' => $profile_photo,
'customer_name' => $customer_name,
'my_account_link' => $this->context->link->getPageLink('identity', true),
];
if (!$force_smarty)
return $tpl_vars;
$this->smarty->assign($tpl_vars);
}
public function hookDisplayFrontend($product)
{
$idProduct = $this->findProductId($product);
if (!$idProduct)
return '';
$repo = EtsRVProductCommentRepository::getInstance();
$validateOnly = $this->validateOnly();
$commentsNb = $repo->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context);
$questionsNb = $repo->getCommentsNumber($idProduct, $this->context->language->id, 0, $this->validateOnly(1), $this->backOffice, 0, $this->context, 1);
$isPostAllowed = $this->backOffice ?: $repo->isPostAllowed($idProduct, (int)$this->context->cookie->id_customer, (int)$this->context->cookie->id_guest);
$maximum_review = Configuration::get('ETS_RV_MAXIMUM_REVIEW_PER_USER');
$default_sort_by = trim(Configuration::get('ETS_RV_DEFAULT_SORT_BY')) ?: 'date_add.desc';
$default_sort_by_question = trim(Configuration::get('ETS_RV_QA_DEFAULT_SORT_BY')) ?: 'date_add.desc';
$commentUrl = $this->context->link->getModuleLink($this->name, 'ajax', $idProduct ? array('id_product' => $idProduct) : array(), Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE'));
$params = ['id_product' => $idProduct, 'nb_reviews' => $commentsNb, 'nb_questions' => $questionsNb];
$tpl_vars = [
'commentUrl' => $commentUrl,
'id_product' => $idProduct,
'back_office' => $this->backOffice,
'sort_by' => EtsRVDefines::getInstance()->getSortBy(),
'sort_by_question' => EtsRVDefines::getInstance()->getSortByQuestion(),
'post_allowed' => $isPostAllowed,
'question_enabled' => ($question_enabled = (int)Configuration::get('ETS_RV_QUESTION_ENABLED')),
'review_enabled' => ($review_enabled = (int)Configuration::get('ETS_RV_REVIEW_ENABLED')),
'nb_comments' => $commentsNb,
'nb_reviews' => $commentsNb,
'nb_questions' => $questionsNb,
'employee' => $this->employee,
'review_allowed' => trim($maximum_review) === '' || (int)$maximum_review > EtsRVProductComment::getNbReviewsOfUser($idProduct, $this->context),
'default_sort_by' => $default_sort_by,
'default_sort_by_info' => EtsRVDefines::getInstance()->getSortBy($default_sort_by),
'default_sort_by_question' => $default_sort_by_question,
'default_sort_by_question_info' => EtsRVDefines::getInstance()->getSortByQuestion($default_sort_by_question),
'PRODUCT_COMMENTS_LIST' => $review_enabled ? $this->displayProductCommentsList($params) : '',
'PRODUCT_QUESTIONS_LIST' => $question_enabled ? $this->displayProductQuestionsList($params) : '',
];
$tpl_vars['ETS_RV_UPLOAD_PHOTO_ENABLED'] = (int)Configuration::get('ETS_RV_UPLOAD_PHOTO_ENABLED');
$tpl_vars['ETS_RV_UPLOAD_VIDEO_ENABLED'] = (int)Configuration::get('ETS_RV_UPLOAD_VIDEO_ENABLED');
$this->getGradeStats($idProduct, true);
$this->getCurrentCustomer(true);
$this->smarty->assign($tpl_vars);
$this->getColors(true);
$this->displayAllPhotos($idProduct);
return $this->display(__FILE__, 'product-wrap.tpl');
}
public function displayAllPhotos($idProduct, $return = false)
{
if (!$idProduct || !Validate::isUnsignedInt($idProduct)) {
return '';
}
$tpl_vars = [];
$tpl_vars['ETS_RV_DISPLAY_ALL_PHOTO'] = (int)Configuration::get('ETS_RV_DISPLAY_ALL_PHOTO');
$tpl_vars['ETS_RV_PHOTOS_OF_PRODUCT'] = EtsRVProductComment::getAllImages($idProduct, $this->context);
$tpl_vars['ETS_RV_UPLOAD_PHOTO_ENABLED'] = (int)Configuration::get('ETS_RV_UPLOAD_PHOTO_ENABLED');
$tpl_vars['ETS_RV_UPLOAD_VIDEO_ENABLED'] = (int)Configuration::get('ETS_RV_UPLOAD_VIDEO_ENABLED');
$tpl_vars['photo_path_uri'] = $this->getMediaLink(_PS_IMG_ . $this->name . '/r/');
$this->smarty->assign($tpl_vars);
if ($return)
return $this->display(__FILE__, 'all-photo.tpl');
}
public function getColors($force_smarty = false)
{
$colors = [];
for ($ik = 1; $ik <= self::DEFAULT_MAX_COLOR; $ik++)
$colors['ETS_RV_DESIGN_COLOR' . $ik] = Configuration::get('ETS_RV_DESIGN_COLOR' . $ik);
if (!$force_smarty)
return $colors;
$this->smarty->assign($colors);
}
public function displayProductCommentsList($params)
{
$idProduct = !empty($params['id_product']) ? (int)$params['id_product'] : 0;
$qa = !empty($params['qa']) ? 1 : 0;
if ($qa && !(int)Configuration::get('ETS_RV_QUESTION_ENABLED') || !$qa && !(int)Configuration::get('ETS_RV_REVIEW_ENABLED'))
return '';
if ($this->context->controller instanceof AdminEtsRVBaseController)
$url_params = $params;
else
$url_params = ['id_product' => $idProduct];
if ($qa) {
$url_params['qa'] = $qa;
}
$sf = ($qa ? 'QA_' : '');
$id_product_comment = isset($params['id_product_comment']) ? (int)$params['id_product_comment'] : 0;
if ($id_product_comment)
$url_params['id_product_comment'] = (int)$id_product_comment;
$refreshController = isset($params['refreshController']) && $params['refreshController'] !== '' ? $params['refreshController'] : false;
if ($refreshController) {
$url_params['refreshController'] = $refreshController;
}
$ssl = Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE');
$commentUrl = $this->context->link->getModuleLink($this->name, 'ajax', $url_params, $ssl);
$tpl_vars = array(
'reviews_initial' => (int)Configuration::get('ETS_RV_' . $sf . 'REVIEWS_INITIAL') ?: 1,
'reviews_per_page' => (int)Configuration::get('ETS_RV_' . $sf . 'REVIEWS_PER_PAGE') ?: 5,
'comments_initial' => (int)Configuration::get('ETS_RV_' . $sf . 'COMMENTS_INITIAL') ?: 1,
'comments_per_page' => (int)Configuration::get('ETS_RV_' . $sf . 'COMMENTS_PER_PAGE') ?: 5,
'replies_initial' => (int)Configuration::get('ETS_RV_' . $sf . 'REPLIES_INITIAL') ?: 1,
'replies_per_page' => (int)Configuration::get('ETS_RV_' . $sf . 'REPLIES_PER_PAGE') ?: 5,
'comment_url' => $this->backOffice && $this->employee ? EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Reviews', true, [], $url_params, $this->context) : $commentUrl,
'qa_comment_url' => $this->backOffice && $this->employee ? EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Questions', true, [], $url_params, $this->context) : $commentUrl,
'back_office' => $this->backOffice,
'qa' => $qa,
'id_product_comment' => $id_product_comment,
'employee' => $this->employee,
'nb_reviews' => isset($params['nb_reviews']) ? $params['nb_reviews'] : 0,
'nb_questions' => isset($params['nb_questions']) ? $params['nb_questions'] : 0,
);
if ($this->employee || $id_product_comment) {
$tpl_vars['nb_' . ($qa ? 'question' : 'review') . 's'] = EtsRVProductCommentRepository::getInstance()->getCommentsNumber($idProduct, $this->context->language->id, 0, $this->validateOnly(), $this->backOffice, 0, $this->context, $qa);
$this->getCurrentCustomer(true);
$this->getColors(true);
}
$this->smarty->assign($tpl_vars);
return $this->display(__FILE__, 'product-comments-list.tpl');
}
public function displayProductQuestionsList($params)
{
$params['qa'] = true;
return $this->displayProductCommentsList($params);
}
public function hookDisplayVerifyPurchase($params)
{
$id_product = isset($params['id_product']) && $params['id_product'] > 0 ? $params['id_product'] : (int)Tools::getValue('id_product', 0);
if ($id_product > 0 && (int)Configuration::get('ETS_RV_FREE_DOWNLOADS_ENABLED')) {
$product = new Product($id_product, true, $this->context->language->id);
$params['free_product'] = $product->id > 0 && $product->price <= 0;
}
$prop = isset($params['prop']) && trim($params['prop']) !== '' ? $params['prop'] : '';
$attrs = [
'class' => $prop . '-order-status verify_label purchased' . (!empty($params['ETS_RV_DESIGN_COLOR4']) ? 'color4' : ''),
];
return EtsRVTools::displayText('@VERIFY_PURCHASE@', 'span', $attrs);
}
public function renderTemplateModal($params)//hookRenderTemplateModal
{
$idProduct = isset($params['id_product']) && Validate::isUnsignedInt($params['id_product']) ? (int)$params['id_product'] : 0;
$multiLang = (int)Configuration::get('ETS_RV_MULTILANG_ENABLED');
$languages = Language::getLanguages(false);
$ssl = Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE');
$commentUrl = $this->context->link->getModuleLink($this->name, 'ajax', $idProduct ? array('id_product' => $idProduct) : array(), $ssl);
$url_params = array();
$refreshController = isset($params['refreshController']) && $params['refreshController'] !== '' ? $params['refreshController'] : false;
if ($refreshController) {
$url_params['refreshController'] = $refreshController;
EtsRVProductCommentEntity::getInstance()->extraParams($url_params);
} elseif ($this->context->controller instanceof AdminEtsRVBaseController) {
if (Tools::isSubmit('submitFilter' . $this->context->controller->list_id)) {
$url_params['submitFilter' . $this->context->controller->list_id] = (int)Tools::getValue('submitFilter' . $this->context->controller->list_id);
} elseif (Tools::getValue('page')) {
$url_params['submitFilter' . $this->context->controller->list_id] = (int)Tools::getValue('page');
}
}
$fields_form = [
'content' => array(
'type' => 'textarea',
'name' => $this->l('Content'),
'lang' => $multiLang,
'required' => true,
'col' => 10,
)
];
if ($this->employee)
$fields_form['date_add'] = [
'type' => 'datetime',
'name' => $this->l('Date'),
'required' => true,
'default' => date('Y-m-d H:i:s'),
'form_group_class' => 'date_add',
];
$tpl_vars = array(
'comment_url' => $this->backOffice && $this->employee ? EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Reviews', true, array(), $url_params, $this->context) : $commentUrl,
'qa_comment_url' => $this->backOffice && $this->employee ? EtsRVLink::getAdminLink(self::TAB_PREFIX . 'Questions', true, array(), $url_params, $this->context) : $commentUrl,
'usefulness_enabled' => (int)Configuration::get('ETS_RV_USEFULNESS'),
'ETS_RV_SHOW_DATE_ADD' => (int)Configuration::get('ETS_RV_SHOW_DATE_ADD') || $this->backOffice,
'ETS_RV_QA_SHOW_DATE_ADD' => Configuration::get('ETS_RV_QA_SHOW_DATE_ADD') || $this->backOffice,
'allow_delete_comment' => (int)Configuration::get('ETS_RV_ALLOW_DELETE_COMMENT') || $this->backOffice,
'allow_edit_comment' => (int)Configuration::get('ETS_RV_ALLOW_EDIT_COMMENT') || $this->backOffice,
'qa_usefulness_enabled' => Configuration::get('ETS_RV_QA_USEFULNESS'),
'qa_allow_delete_comment' => (int)Configuration::get('ETS_RV_QA_ALLOW_DELETE_COMMENT') || $this->backOffice,
'qa_allow_edit_comment' => (int)Configuration::get('ETS_RV_QA_ALLOW_EDIT_COMMENT') || $this->backOffice,
'upload_dir' => $this->getMediaLink($this->_path . 'views/img/flag/'),
'back_office' => $this->backOffice,
'multilang_enabled' => $multiLang,
'languages' => $languages,
'defaultFormLanguage' => (int)Configuration::get('PS_LANG_DEFAULT'),
'form_fields' => $fields_form,
'press_enter_enabled' => (int)Configuration::get('ETS_RV_PRESS_ENTER_ENABLED'),
'question_enabled' => (int)Configuration::get('ETS_RV_QUESTION_ENABLED') && (!isset($params['no_qa']) || !$params['no_qa']),
'review_enabled' => (int)Configuration::get('ETS_RV_REVIEW_ENABLED') || $this->employee,
'discount_enabled' => (int)Configuration::get('ETS_RV_DISCOUNT_ENABLED'),
'show_comment_box' => (int)Configuration::get('ETS_RV_SHOW_COMMENT_BOX'),
'show_reply_box' => (int)Configuration::get('ETS_RV_SHOW_REPLY_BOX'),
'employee' => $this->employee,
'logged' => $this->backOffice ?: (bool)$this->context->cookie->id_customer,
'qa_show_comment_box' => (int)Configuration::get('ETS_RV_QA_SHOW_COMMENT_BOX'),
'show_answer_box' => (int)Configuration::get('ETS_RV_SHOW_ANSWER_BOX'),
'date_format' => str_replace(['d', 'm', 'Y'], ['dd', 'mm', 'yy'], $this->context->language->date_format_lite),
'guest' => (!isset($this->context->customer->id) || !$this->context->customer->id) && isset($this->context->cookie->id_guest) && $this->context->cookie->id_guest,
'product_id' => $idProduct,
'photo_enabled' => (int)Configuration::get('ETS_RV_UPLOAD_PHOTO_ENABLED'),
'video_enabled' => (int)Configuration::get('ETS_RV_UPLOAD_VIDEO_ENABLED'),
);
$this->smarty->assign($tpl_vars);
$this->getColors(true);
return $this->display(__FILE__, 'product-comment-modal.tpl');
}
public function productModal($idProduct)
{
if (!$idProduct ||
!Validate::isUnsignedInt($idProduct)) {
return 0;
}
$cover = Product::getCover($idProduct, $this->context);
$p = new Product($idProduct, true, $this->context->language->id);
$p->image = new Image($cover ? (int)$cover['id_image'] : 0, $this->context->language->id);
$p->image->url = $this->context->link->getImageLink($p->link_rewrite, $p->image->id_image, EtsRVTools::getFormattedName('large'));
$p->link = $this->context->link->getProductLink($p, $p->link_rewrite, $p->category, $p->ean13, $this->context->language->id);
$p->description_short = Tools::truncateString($p->description_short);
return $p;
}
public function isCustomerLogged()
{
return isset($this->context->customer) && $this->context->customer->id > 0 && $this->context->customer->isLogged();
}
public function configsModal($idProduct, $qa = 0)
{
$product = $this->productModal($idProduct);
$requestUri = Tools::getValue('currentUrl', $_SERVER['REQUEST_URI']);
if (!$this->isCustomerLogged() && !preg_match('/(\?|&)' . ($qa ? 'ets_rv_add_question' : 'ets_rv_add_review') . '\s*=\s*1/i', $requestUri)) {
$requestUri .= (strpos('?', $requestUri) === false ? '?' : '&') . ($qa ? 'ets_rv_add_question=1' : 'ets_rv_add_review=1');
}
$tpl_vars = [
'link' => $this->context->link,
'product_modal' => $product,
'currentUrl' => (Validate::isAbsoluteUrl($requestUri) ? '' : Tools::getCurrentUrlProtocolPrefix() . $_SERVER['HTTP_HOST']) . $requestUri,
'moderation_active' => (!$qa
&& (
!(int)Configuration::get('ETS_RV_MODERATE') ||
(int)Configuration::get('ETS_RV_PURCHASED_PRODUCT_APPROVE') && EtsRVProductComment::verifyPurchase($idProduct, $this->context->customer->id)
) || $qa && !(int)Configuration::get('ETS_RV_QA_MODERATE')
),
'logged' => $this->isCustomerLogged(),
'is_block_customer' => $this->isCustomerLogged() && EtsRVProductCommentCustomer::isBlockByIdCustomer($this->context->customer->id),
'ETS_RV' . ($qa ? '_QA' : '') . '_ALLOW_GUESTS' => $qa ? (int)Configuration::get('ETS_RV_QA_ALLOW_GUESTS') : EtsRVTools::reviewGrand('guest'),
'ETS_RV_DISPLAY_PRODUCT_INFO' => (int)Configuration::get('ETS_RV_DISPLAY_PRODUCT_INFO'),
];
if (!$qa) {
$maximumRating = Configuration::get('ETS_RV_MAXIMUM_RATING_PER_USER');
$nbRated = EtsRVProductComment::getNbReviewsOfUser($idProduct, $this->context, true);
$freeDownload = (int)Configuration::get('ETS_RV_FREE_DOWNLOADS_ENABLED');
$purchasedAvailableTime = (int)Configuration::get('ETS_RV_REVIEW_AVAILABLE_TIME');
$customerPurchasedTime = EtsRVTools::isCustomerPurchased() && $purchasedAvailableTime > 0;
$purchased = $this->isCustomerLogged() && EtsRVProductComment::isPurchased($this->context->customer->id, $idProduct);
$purchasedTime = $this->isCustomerLogged() && $customerPurchasedTime && EtsRVProductComment::getLastOrderValid($this->context->customer->id, $idProduct, $purchasedAvailableTime);
$tpl_vars = array_merge($tpl_vars, [
'nbRated' => $nbRated,
'allowRating' => trim($maximumRating) === '' || (int)$maximumRating > $nbRated,
'orderNotValid' => $this->isCustomerLogged() && EtsRVProductComment::isPurchased($this->context->customer->id, $idProduct, false),
'purchasedAvailableTime' => $purchasedAvailableTime,
'purchasedInTime' => $customerPurchasedTime,
'purchased' => $purchased,
'purchasedTime' => $purchasedTime || !$customerPurchasedTime && $purchased,
'freeDownload' => $freeDownload,
'productPrice' => $product->price,
'maximumRating' => (int)$maximumRating,
'ETS_RV_ALLOW_GUESTS_RATE' => EtsRVTools::ratingGrand('guest'),
'ETS_RV_PURCHASED_PRODUCT' => EtsRVTools::reviewGrand('purchased'),
'ETS_RV_PURCHASED_PRODUCT_RATE' => EtsRVTools::ratingGrand('purchased'),
'ETS_RV_CUSTOMER' => EtsRVTools::reviewGrand('no_purchased'),
'ETS_RV_CUSTOMER_INCL' => EtsRVTools::reviewGrand('no_purchased_incl'),
'ETS_RV_CUSTOMER_EXCL' => EtsRVTools::reviewGrand('no_purchased_excl'),
'ETS_RV_CUSTOMER_RATE_INCL' => EtsRVTools::ratingGrand('no_purchased_incl'),
'ETS_RV_CUSTOMER_RATE_EXCL' => EtsRVTools::ratingGrand('no_purchased_excl'),
'ETS_RV_CUSTOMER_RATE' => EtsRVTools::ratingGrand('no_purchased'),
'ETS_RV_DEFAULT_RATE' => (int)Configuration::get('ETS_RV_DEFAULT_RATE'),
]);
}
return $tpl_vars;
}
public function renderProductCommentModal($params)
{
$idProduct = !empty($params['id_product']) ? (int)$params['id_product'] : 0;
$id_order = isset($params['id_order']) && Validate::isUnsignedInt($params['id_order']) ? (int)$params['id_order'] : 0;
$criterions = EtsRVProductCommentCriterionRepository::getInstance()->getByProduct($idProduct, $this->context->language->id);
$maximum_review = trim(Configuration::get('ETS_RV_MAXIMUM_REVIEW_PER_USER'));
$tpl_vars = array_merge(
$this->configsModal($idProduct),
[
'post_product_comment_url' => $this->context->link->getModuleLink($this->name, 'ajax', ['id_product' => $idProduct, '__ac' => 'post_product_comment'], Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE')),
'criterions' => $criterions,
'ETS_RV_REQUIRE_TITLE' => (int)Configuration::get('ETS_RV_REQUIRE_TITLE'),
'review_allowed' => $maximum_review === '' || (int)$maximum_review > EtsRVProductComment::getNbReviewsOfUser($idProduct, $this->context),
'maximum_review_per_user' => $maximum_review,
'id_order' => $id_order,
]
);
$this->context->smarty->assign($tpl_vars);
return $this->display(__FILE__, 'post-comment-modal.tpl');
}
public function renderProductQuestionModal($params)//hookRenderProductQuestionModal
{
$idProduct = !empty($params['id_product']) ? (int)$params['id_product'] : 0;
$tpl_vars = $this->configsModal($idProduct, 1);
$tpl_vars['post_product_question_url'] = $this->context->link->getModuleLink($this->name, 'ajax', ['id_product' => $idProduct, '__ac' => 'post_product_question', 'qa' => 1], Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE'));
$this->context->smarty->assign($tpl_vars);
return $this->display(__FILE__, 'post-question-modal.tpl');
}
public function renderUploadImage($params = [])//hookRenderUploadImage
{
$id_product_comment = isset($params['product_comment_id']) && (int)$params['product_comment_id'] ? (int)$params['product_comment_id'] : 0;
$productComment = new EtsRVProductComment((int)$id_product_comment);
if (!$productComment->question) {
$count = EtsRVProductCommentImage::getImages($id_product_comment, true);
$this->context->smarty->assign(array(
'ETS_RV_UPLOAD_PHOTO_ENABLED' => $count ? 1 : (int)Configuration::get('ETS_RV_UPLOAD_PHOTO_ENABLED'),
'ETS_RV_MAX_UPLOAD_PHOTO' => max($count, (int)Configuration::get('ETS_RV_MAX_UPLOAD_PHOTO')),
'ETS_RV_UPLOAD_VIDEO_ENABLED' => $count ? 1 : (int)Configuration::get('ETS_RV_UPLOAD_VIDEO_ENABLED'),
'ETS_RV_MAX_UPLOAD_VIDEO' => max($count, (int)Configuration::get('ETS_RV_MAX_UPLOAD_VIDEO')),
'PS_ATTACHMENT_MAXIMUM_SIZE' => EtsRVTools::formatBytes(EtsRVTools::getPostMaxSizeBytes()),
));
return $this->display(__FILE__, 'product-comment-images.tpl');
}
}
public function addJss($addJsDef = false)
{
$isLogged = $this->backOffice ?: $this->isCustomerLogged();
$vars = [
'language_code' => $this->context->language->iso_code,
'ETS_RV_PRESS_ENTER_ENABLED' => (int)Configuration::get('ETS_RV_PRESS_ENTER_ENABLED'),
'isLogged' => $isLogged,
'ETS_RV_CUSTOMER_IS_LOGGED' => $isLogged,
'back_office' => $this->backOffice,
'ETS_RV_REQUIRE_TITLE' => (int)Configuration::get('ETS_RV_REQUIRE_TITLE'),
'ETS_RV_DEFAULT_RATE' => (int)Configuration::get('ETS_RV_DEFAULT_RATE'),
'ETS_RV_DESIGN_COLOR1' => (int)Configuration::get('ETS_RV_DESIGN_COLOR1'),
'ETS_RV_QUESTION_ENABLED' => (int)Configuration::get('ETS_RV_QUESTION_ENABLED'),
'ETS_RV_REVIEW_ENABLED' => (int)Configuration::get('ETS_RV_REVIEW_ENABLED'),
'PS_ATTACHMENT_MAXIMUM_SIZE' => EtsRVTools::getPostMaxSizeBytes(),
'PS_ATTACHMENT_MAXIMUM_SIZE_TEXT' => EtsRVTools::formatBytes(EtsRVTools::getPostMaxSizeBytes()),
'addJsDef' => !$addJsDef,
];
$ETS_RV_RECAPTCHA_ENABLED = (int)Configuration::get('ETS_RV_RECAPTCHA_ENABLED');
$vars = array_merge($vars, $this->getReCaptchaConfigs());
if ($ETS_RV_RECAPTCHA_ENABLED)
$this->smarty->assign($vars);
if ($addJsDef) {
$vars = array_merge($vars, [
'ETS_RV_RECAPTCHA_VALID' => 0,
'productCommentPostErrorMessage' => $this->l('Sorry, your review cannot be posted.'),
'productCommentUpdatePostErrorMessage' => $this->l('Sorry, your review appreciation cannot be sent.'),
'productCommentAbuseReportErrorMessage' => $this->l('Sorry, your abuse report cannot be sent.'),
'ets_rv_please_sign_review' => $this->l('Please sign in or register to write your review'),
'ets_rv_please_sign_question' => $this->l('Please sign in or register to ask your question'),
'ets_rv_please_sign_like' => $this->l('Please sign in or register to like'),
'ets_rv_please_sign_dislike' => $this->l('Please sign in or register to dislike'),
'file_is_to_large_text' => $this->l('File is too large. Maximum size allowed: %s'),
'file_not_valid_text' => $this->l('File type is not allowed'),
'ets_rv_datetime_picker' => json_encode([
'prevText' => '',
'nextText' => '',
'dateFormat' => 'yy-mm-dd',
'currentText' => $this->l('Now'),
'closeText' => $this->l('Done'),
'ampm' => false,
'amNames' => ['AM', 'A'],
'pmNames' => ['PM', 'P'],
'timeFormat' => 'hh:mm:ss tt',
'timeSuffix' => '',
'timeOnlyTitle' => $this->l('Choose time'),
'timeText' => $this->l('Time'),
'hourText' => $this->l('Hour'),
'minuteText' => $this->l('Minute'),
'maxDate' => date('Y-m-d H:i:s'),
]),
'ETS_RV_DEFAULT_LANGUAGE_MSG' => $this->l('Default language cannot be empty!'),
]);
}
Media::addJsDef($vars);
return $ETS_RV_RECAPTCHA_ENABLED ? $this->display(__FILE__, 'javascript.tpl') : '';
}
public function hookRenderReCaptcha($params)
{
if ($this->backOffice)
return '';
$reCaptchaFor = !empty($params['reCaptchaFor']) ? $params['reCaptchaFor'] : '';
if (($cache_id = $this->getCacheId('recaptcha', [$reCaptchaFor])) == null || !$this->isCached('product-comment-recaptcha.tpl', $cache_id)) {
$configs = $this->getReCaptchaConfigs();
if (!$reCaptchaFor || !(int)$configs['ETS_RV_RECAPTCHA_ENABLED'] || !in_array($reCaptchaFor, $configs['ETS_RV_RECAPTCHA_FOR']) && !in_array('all', $configs['ETS_RV_RECAPTCHA_FOR']) || (int)$configs['ETS_RV_RECAPTCHA_USER_REGISTERED'] && $this->isCustomerLogged())
return '';
$configs['reCaptchaFor'] = $reCaptchaFor;
$configs['class'] = isset($params['class']) && $params['class'] ? $params['class'] : '';
$this->context->smarty->assign($configs);
}
return $this->display(__FILE__, 'product-comment-recaptcha.tpl', $cache_id);
}
public function displayPCListImages($id, $json = false)
{
if (!$id || !Validate::isUnsignedInt($id) || !($productComment = new EtsRVProductComment($id)))
return $json ? [] : '';
$images = EtsRVProductCommentImage::getImages($id);
$path_uri = $this->getMediaLink(_PS_IMG_ . $this->name . '/r/');
if ($json) {
if ($images) {
foreach ($images as &$image) {
$image['url'] = $path_uri . $image['image'] . '-thumbnail.jpg';
}
}
return $images;
}
$tpl_vars = [
'images' => $images,
'path_uri' => $path_uri,
];
if (!$this->employee && (int)Configuration::get('ETS_RV_UPLOAD_PHOTO_ENABLED') &&
($max_upload_photo = (int)Configuration::get('ETS_RV_MAX_UPLOAD_PHOTO')) > count($images) &&
($this->backOffice || $productComment->id_customer && (int)$this->context->cookie->id_customer && (int)$productComment->id_customer === (int)$this->context->cookie->id_customer || $productComment->id_guest && (int)$this->context->cookie->id_customer && (int)$productComment->id_guest === (int)$this->context->cookie->id_guest)
) {
$tpl_vars['productComment'] = $productComment;
$tpl_vars['action'] = $this->context->link->getModuleLink($this->name, 'ajax', ['id_product' => $productComment->id_product, '__ac' => 'post_image', 'id' => $productComment->id], Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE'));
$tpl_vars['ETS_RV_MAX_UPLOAD_PHOTO'] = $max_upload_photo;
}
$this->context->smarty->assign($tpl_vars);
return $this->display(__FILE__, 'product-comment-item-image.tpl');
}
public function displayPCListVideos($id, $json = false)
{
if (!$id || !Validate::isUnsignedInt($id) || !($productComment = new EtsRVProductComment($id))) {
return $json ? [] : '';
}
$videos = EtsRVProductCommentVideo::getVideos($id);
$path_uri = $this->getMediaLink(_PS_IMG_ . $this->name . '/r/');
if ($videos) {
foreach ($videos as &$video)
$video['url'] = $path_uri . $video['video'];
}
if ($json) {
return $videos;
}
$tpl_vars = [
'videos' => $videos,
'path_uri' => $path_uri,
];
if (!$this->employee && (int)Configuration::get('ETS_RV_UPLOAD_VIDEO_ENABLED') &&
($max_upload_video = (int)Configuration::get('ETS_RV_MAX_UPLOAD_VIDEO')) > count($videos) &&
($this->backOffice || $productComment->id_customer && (int)$this->context->cookie->id_customer && (int)$productComment->id_customer === (int)$this->context->cookie->id_customer || $productComment->id_guest && (int)$this->context->cookie->id_customer && (int)$productComment->id_guest === (int)$this->context->cookie->id_guest)
) {
$tpl_vars['productComment'] = $productComment;
$tpl_vars['action'] = $this->context->link->getModuleLink($this->name, 'ajax', ['id_product' => $productComment->id_product, '__ac' => 'post_video', 'id' => $productComment->id], Configuration::get('PS_SSL_ENABLED') && Configuration::get('PS_SSL_ENABLED_EVERYWHERE'));
$tpl_vars['ETS_RV_MAX_UPLOAD_VIDEO'] = $max_upload_video;
}
$this->context->smarty->assign($tpl_vars);
return $videos ? $this->display(__FILE__, 'product-comment-item-video.tpl') : '';
}
public function hookDisplayProductListReviews($params)
{
if (!(int)Configuration::get('ETS_RV_REVIEW_ENABLED'))
return '';
$product = $params['product'];
$idProduct = $this->findProductId($product);
$repository = EtsRVProductCommentRepository::getInstance();
$validateOnly = $this->validateOnly();
$commentsNb = $repository->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context);
$averageGrade = $repository->getAverageGrade($idProduct, $this->context->language->id, $validateOnly, $this->backOffice, $this->context);
if (!$this->is17)
$product['id'] = (int)$idProduct;
$this->smarty->assign(array(
'review_enabled' => (int)Configuration::get('ETS_RV_REVIEW_ENABLED'),
'product' => $product,
'nb_comments' => $commentsNb,
'average_grade' => $averageGrade,
'position' => isset($params['page']) ? $params['page'] : '',
));
$this->getColors(true);
return $this->display(__FILE__, 'product-list-reviews.tpl');
}
public function hookDisplayMicrodataAggregateRating($params)
{
$idProduct = isset($params['id_product']) && (int)$params['id_product'] ? $params['id_product'] : (int)Tools::getValue('id_product');
if (!$idProduct)
return '';
$productCommentRepository = EtsRVProductCommentRepository::getInstance();
$validateOnly = $this->validateOnly();
$averageGrade = $productCommentRepository->getAverageGrade($idProduct, $this->context->language->id, $validateOnly, $this->backOffice, $this->context);
$commentsNb = $productCommentRepository->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context);
$tpl_vars = array(
'average_grade' => $averageGrade,
'nb_comments' => $commentsNb,
'review_enabled' => (int)Configuration::get('ETS_RV_REVIEW_ENABLED'),
);
$this->smarty->assign($tpl_vars);
return $this->display(__FILE__, 'microdata-aggregate-rating.tpl');
}
public function hookDisplayProductAdditionalInfo($params)
{
if (trim(Tools::getValue('controller')) == 'product' && trim(Tools::getValue('action')) == 'quickview' || empty($params['hook']) && trim(Configuration::get('ETS_RV_AVERAGE_RATE_POSITION')) !== 'product_additional_info')
return '';
$product = $this->is17 && isset($params['product']) ? $params['product'] : (int)Tools::getValue('id_product');
$idProduct = isset($params['id_product']) && (int)$params['id_product'] ? $params['id_product'] : $this->findProductId($product);
if (!$idProduct)
return '';
$productCommentRepository = EtsRVProductCommentRepository::getInstance();
$validateOnly = $this->validateOnly();
$averageGrade = $productCommentRepository->getAverageGrade($idProduct, $this->context->language->id, $validateOnly, $this->backOffice, $this->context);
$commentsNb = $productCommentRepository->getCommentsNumber($idProduct, $this->context->language->id, 0, $validateOnly, $this->backOffice, 0, $this->context);
$isPostAllowed = $productCommentRepository->isPostAllowed($idProduct, (int)$this->context->cookie->id_customer, (int)$this->context->cookie->id_guest);
$questionsNb = $productCommentRepository->getCommentsNumber($idProduct, $this->context->language->id, 0, $this->validateOnly(1), $this->backOffice, 0, $this->context, 1);
$maximum_review_per_user = Configuration::get('ETS_RV_MAXIMUM_REVIEW_PER_USER');
$p = new Product($idProduct, true, $this->context->language->id);
$imgCover = Product::getCover($p->id, $this->context);
if (!empty($imgCover['id_image']))
$p->imageCover = $this->context->link->getImageLink($p->link_rewrite, $imgCover['id_image'], EtsRVTools::getFormattedName('home'));
$tpl_vars = array(
'average_grade' => $averageGrade,
'nb_comments' => $commentsNb,
'post_allowed' => $isPostAllowed,
'review_enabled' => (int)Configuration::get('ETS_RV_REVIEW_ENABLED'),
'question_enabled' => (int)Configuration::get('ETS_RV_QUESTION_ENABLED'),
'nb_questions' => $questionsNb,
'maximum_review_allowed' => trim($maximum_review_per_user) === '' || (int)$maximum_review_per_user > EtsRVProductComment::getNbReviewsOfUser($idProduct, $this->context),
'p' => $p,
'displaySchema' => $commentsNb > 0 && $averageGrade > 0,//version_compare(_PS_VERSION_, '1.7.8.0', '<')
);
$this->smarty->assign($tpl_vars);
$this->getColors(true);
return $this->display(__FILE__, 'product-additional-info.tpl');
}
public function ajaxRender($value = null)
{
die($value);
}
public function postProcess()
{
$qa = (int)Tools::getValue('qa') ? 1 : 0;
$productCommentEntity = EtsRVProductCommentEntity::getInstance()
->setEmployee($this->employee)
->setBackOffice($this->backOffice)
->setQA($qa);
$commentEntity = EtsRVCommentEntity::getInstance()
->setEmployee($this->employee)
->setBackOffice($this->backOffice)
->setQA($qa);
$replyEntity = EtsRVReplyCommentEntity::getInstance()
->setEmployee($this->employee)
->setBackOffice($this->backOffice)
->setQA($qa);
if (($action = Tools::getValue('__ac')) && Validate::isCleanHtml($action)) {
switch ($action) {
// Check guest:
case 'is_guest_login':
$productCommentEntity->isGuestLogin();
break;
case 'list_product_comment':
$productCommentEntity->getProductComments();
break;
case 'post_product_question':
case 'post_product_comment':
$productCommentEntity->postProductComment();
break;
case 'post_image':
$productCommentEntity->postProductCommentImages();
break;
case 'delete_product_comment':
$productCommentEntity->deleteProductComment();
break;
case 'delete_product_comment_image':
$productCommentEntity->deleteProductCommentImage();
break;
case 'delete_product_comment_video':
$productCommentEntity->deleteProductCommentVideo();
break;
case 'report_product_comment':
$productCommentEntity->reportProductComment();
break;
case 'useful_product_comment':
$productCommentEntity->updateProductCommentUsefulness();
break;
case 'private_product_comment':
$productCommentEntity->privateProductComment();
break;
case 'approve_product_comment':
$productCommentEntity->approveProductComment();
break;
case 'update_date_product_comment':
$productCommentEntity->updateDateProductComment();
break;
// Comments
case 'comment':
$commentEntity->getComment();
break;
case 'list_comment':
$commentEntity->getComments();
break;
case 'post_comment':
$commentEntity->postComment();
break;
case 'delete_comment':
$commentEntity->deleteComment();
break;
case 'private_comment':
$commentEntity->privateComment();
break;
case 'approve_comment':
$commentEntity->approveComment();
break;
case 'update_date_comment':
$commentEntity->updateDateComment();
break;
case 'report_comment':
$commentEntity->reportComment();
break;
case 'useful_comment':
$commentEntity->updateCommentUsefulness();
break;
case 'useful_answer':
$commentEntity->updateAnswerUsefulness();
break;
// Reply comments
case 'reply_comment':
$replyEntity->getReplyComment();
break;
case 'list_reply_comment':
$replyEntity->getReplyComments();
break;
case 'post_reply_comment':
$replyEntity->postReplyComment();
break;
case 'delete_reply_comment':
$replyEntity->deleteReplyComment();
break;
case 'private_reply_comment':
$replyEntity->privateReplyComment();
break;
case 'approve_reply_comment':
$replyEntity->approveReplyComment();
break;
case 'update_date_reply_comment':
$replyEntity->updateDateReplyComment();
break;
case 'report_reply_comment':
$replyEntity->reportReplyComment();
break;
case 'useful_reply_comment':
$replyEntity->updateReplyCommentUsefulness();
break;
}
}
$action = Tools::getValue('action');
if (trim($action) === 'formPostComment') {
$id_product = Tools::getValue('id_product');
if (!$id_product) {
$this->_errors[] = $this->l('Product does not exist.');
} elseif (!Validate::isUnsignedInt($id_product)) {
$this->_errors[] = $this->l('Product is invalid.');
}
$id_order = Tools::getValue('id_order');
if ($id_order == '' || !Validate::isUnsignedInt($id_order)) {
$id_order = 0;
}
$has_error = count($this->_errors);
die(json_encode(array(
'errors' => $has_error ? implode(PHP_EOL, $this->_errors) : false,
'form' => !$has_error ? $this->renderProductCommentModal(array('id_product' => $id_product, 'id_order' => $id_order)) . $this->renderTemplateModal(array('id_product' => $id_product)) : '',
)));
} elseif (trim($action) === 'renderTemplateModal') {
$id_product = (int)Tools::getValue('id_product');
$params = ['id_product' => $id_product];
die(json_encode(array(
'html' => htmlentities($this->renderProductCommentModal($params) . $this->renderProductQuestionModal($params) . $this->renderTemplateModal($params)),
)));
}
}
public function toLink($href, $title, $target = '_blank', $content = null)
{
if (!$href)
return '';
if ($content === null) {
$content = $title;
}
$attrs = [
'href' => $href,
'title' => $title,
'target' => $target
];
return EtsRVTools::displayText($content, 'a', $attrs);
}
public function validateOnly($qa = 0)
{
return $this->backOffice || (!$qa && !(int)Configuration::get('ETS_RV_MODERATE') || $qa && !(int)Configuration::get('ETS_RV_QA_MODERATE')) ? null : 1;//ETS_RV_QA_AUTO_APPROVE
}
public static function _clearLogByCronjob()
{
Configuration::deleteByName('ETS_RV_LAST_CRONJOB');
if (@file_exists(($dest = _PS_ROOT_DIR_ . '/var/logs/ets_reviews.cronjob.log')))
@unlink($dest);
}
public function hookDisplayCronjobInfo()
{
if (!Module::isEnabled($this->name))
return '';
if ($this->context->controller instanceof AdminEtsRVQueueController ||
$this->context->controller instanceof AdminEtsRVEmailController ||
$this->context->controller instanceof AdminEtsRVTrackingController ||
$this->context->controller instanceof AdminEtsRVCronjobController ||
$this->context->controller instanceof AdminEtsRVActivityController
) {
$cache_time = Configuration::get('ETS_RV_INSTALL_TIME');
if (!$cache_time) {
$cache_time = Configuration::updateValue('ETS_RV_INSTALL_TIME', time());
}
$last_cronjob = Configuration::getGlobalValue('ETS_RV_LAST_CRONJOB');
$overtime = $last_cronjob ? (time() - (strtotime($last_cronjob) + 43200)) : (time() - ($cache_time + 86400));
if ($last_cronjob && ($seconds = (time() - strtotime($last_cronjob))) <= 86400) {
$dt1 = new DateTime("@0");
$dt2 = new DateTime("@" . $seconds);
if ($seconds > 3600)
$format = $this->l('%h hours, %i minutes and %s seconds');
elseif ($seconds > 60)
$format = $this->l('%i minutes and %s seconds');
else
$format = $this->l('%s seconds');
$last_cronjob = $dt1->diff($dt2)->format($format);
}
$this->smarty->assign(array(
'ETS_RV_LAST_CRONJOB' => $last_cronjob,
'ETS_RV_OVERTIME' => $overtime,
'automationLink' => $this->context->link->getAdminLink(self::TAB_PREFIX . 'Cronjob')
));
return $this->display(__FILE__, 'bo-cronjob.tpl');
}
}
public function displayProductInfo($idProduct, $grade, $idLang = null, $idShop = null)
{
if (!$idProduct || !Validate::isUnsignedId($idProduct) || (int)$grade <= 0)
return '';
if ($idLang == null)
$idLang = $this->context->language->id;
if ($idShop == null)
$idShop = $this->context->shop->id;
$product = new Product($idProduct, false, $idLang, $idShop);
$imageCover = Product::getCover($product->id);
$productGrade = Tools::ps_round(($grade * 2)) / 2;
return [
'productName' => $product->name,
'productLink' => $this->context->link->getProductLink($product, $product->link_rewrite, $product->category, $product->ean13, $idLang, $idShop),
'productGrade' => $productGrade,
'productCover' => isset($imageCover['id_image']) && (int)$imageCover['id_image'] > 0 ? $this->context->link->getImageLink($product->link_rewrite, (int)$imageCover['id_image'], EtsRVTools::getFormattedName('home')) : '',
'image_dir' => $productGrade > 0 && @file_exists(dirname(__FILE__) . '/views/img/star/' . $productGrade . '-star.png') ? $this->context->link->getMediaLink($this->_path . 'views/img/star/' . $productGrade . '-star.png') : '',
];
}
public function addOverride($classname)
{
if (version_compare(_PS_VERSION_, '8.0.0', '>=')
&& !file_exists(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'override' . DIRECTORY_SEPARATOR . 'index.php')
&& file_exists(_PS_CONFIG_DIR_ . 'index.php')
) {
$directoryPath = _PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'override';
if (is_dir($directoryPath)) {
@copy(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'index.php', _PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'override' . DIRECTORY_SEPARATOR . 'index.php');
} else {
$fs = new Symfony\Component\Filesystem\Filesystem();
$fs->mkdir($directoryPath, PrestaShop\PrestaShop\Core\Foundation\Filesystem\FileSystem::DEFAULT_MODE_FOLDER);
@copy(_PS_ROOT_DIR_ . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'index.php', $directoryPath . DIRECTORY_SEPARATOR . 'index.php');
}
}
if ($classname == 'CartRule' && Module::isEnabled('etsdiscountcombinations')) {
@file_put_contents(_PS_OVERRIDE_DIR_ . '/classes/CartRule.php', preg_replace('/(function\s+checkValidity\s*)\(/', '$1Override(', Tools::file_get_contents(_PS_OVERRIDE_DIR_ . '/classes/CartRule.php')));
}
return parent::addOverride($classname);
}
public function removeOverride($classname)
{
$res = parent::removeOverride($classname);
if ($res && $classname == 'CartRule' && Module::isEnabled('etsdiscountcombinations')) {
@file_put_contents(_PS_OVERRIDE_DIR_ . '/classes/CartRule.php', preg_replace('/(function\s+checkValidity)Override\s*\(/', '$1(', Tools::file_get_contents(_PS_OVERRIDE_DIR_ . '/classes/CartRule.php')));
}
return $res;
}
public function clearCache($template, $cache_id = null, $compile_id = null)
{
if ($compile_id === null) {
$compile_id = $this->getDefaultCompileId();
}
if (static::$_batch_mode) {
if ($cache_id === null) {
$cache_id = $this->name;
}
$key = $template . '-' . $cache_id . '-' . $compile_id;
if (!isset(static::$_defered_clearCache[$key])) {
static::$_defered_clearCache[$key] = [$this->getTemplatePath($template), $cache_id, $compile_id];
}
} else {
if ($cache_id === null) {
$cache_id = $this->name;
}
Tools::enableCache();
$number_of_template_cleared = Tools::clearCache(Context::getContext()->smarty, $this->getTemplatePath($template), $cache_id, $compile_id);
Tools::restoreCacheSettings();
return $number_of_template_cleared;
}
}
public function getDefaultCompileId()
{
return Context::getContext()->shop->theme_name;
}
public function uninstallOverrides()
{
if (parent::uninstallOverrides()) {
require_once(dirname(__FILE__) . '/classes/OverrideUtil');
$class = 'Ets_rv_overrideUtil';
$method = 'restoreReplacedMethod';
call_user_func_array(array($class, $method), array($this));
return true;
}
return false;
}
public function installOverrides()
{
require_once(dirname(__FILE__) . '/classes/OverrideUtil');
$class = 'Ets_rv_overrideUtil';
$method = 'resolveConflict';
call_user_func_array(array($class, $method), array($this));
if (parent::installOverrides()) {
call_user_func_array(array($class, 'onModuleEnabled'), array($this));
return true;
}
return false;
}
public function disable($force_all = false)
{
$res = parent::disable($force_all);
if ($res && !$force_all && EtsRVTools::checkEnableOtherShop($this->id)) {
if ($this->getOverrides() != null) {
try {
$this->installOverrides();
} catch (Exception $e) {
$this->_errors[] = $e->getMessage();
}
}
if (method_exists($this, 'get') && $dispatcher = $this->get('event_dispatcher')) {
/** @var \Symfony\Component\EventDispatcher\Debug\TraceableEventDispatcher|\Symfony\Component\EventDispatcher\EventDispatcherInterface $dispatcher */
$dispatcher->addListener(\PrestaShopBundle\Event\ModuleManagementEvent::DISABLE, function (\PrestaShopBundle\Event\ModuleManagementEvent $event) {
EtsRVTools::activeTab($this->name);
});
}
}
return $res;
}
public function enable($force_all = false)
{
if (!$force_all && EtsRVTools::checkEnableOtherShop($this->id) && $this->getOverrides() != null) {
try {
$this->uninstallOverrides();
} catch (Exception $e) {
$this->_errors[] = $e->getMessage();
}
}
return parent::enable($force_all);
}
}