* @copyright 2007-2014 PrestaShop SA * @license http://opensource.org/licenses/afl-3.0.php Academic Free License (AFL 3.0) * International Registered Trademark & Property of PrestaShop SA */ if (!defined('_PS_VERSION_')) exit; class ProductComments extends Module { const INSTALL_SQL_FILE = 'install.sql'; private $_html = ''; private $_postErrors = array(); private $_filters = array(); private $_productCommentsCriterionTypes = array(); private $_baseUrl; public function __construct() { $this->name = 'productcomments'; $this->tab = 'front_office_features'; $this->version = '3.3.8'; $this->author = 'PrestaShop'; $this->need_instance = 0; $this->bootstrap = true; $this->_setFilters(); parent::__construct(); $this->secure_key = Tools::encrypt($this->name); $this->displayName = $this->l('Product Comments'); $this->description = $this->l('Allows users to post reviews and rate products on specific criteria.'); } public function install($keep = true) { if ($keep) { if (!file_exists(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) return false; else if (!$sql = file_get_contents(dirname(__FILE__).'/'.self::INSTALL_SQL_FILE)) return false; $sql = str_replace(array('PREFIX_', 'ENGINE_TYPE'), array(_DB_PREFIX_, _MYSQL_ENGINE_), $sql); $sql = preg_split("/;\s*[\r\n]+/", trim($sql)); foreach ($sql as $query) if (!Db::getInstance()->execute(trim($query))) return false; } if (parent::install() == false || !$this->registerHook('productTab') || !$this->registerHook('extraProductComparison') || !$this->registerHook('productTabContent') || !$this->registerHook('header') || !$this->registerHook('displayRightColumnProduct') || !$this->registerHook('displayProductListReviews') || !Configuration::updateValue('PRODUCT_COMMENTS_MINIMAL_TIME', 30) || !Configuration::updateValue('PRODUCT_COMMENTS_ALLOW_GUESTS', 0) || !Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', 1)) return false; return true; } public function uninstall($keep = true) { if (!parent::uninstall() || ($keep && !$this->deleteTables()) || !Configuration::deleteByName('PRODUCT_COMMENTS_MODERATE') || !Configuration::deleteByName('PRODUCT_COMMENTS_ALLOW_GUESTS') || !Configuration::deleteByName('PRODUCT_COMMENTS_MINIMAL_TIME') || !$this->unregisterHook('extraProductComparison') || !$this->unregisterHook('displayRightColumnProduct') || !$this->unregisterHook('productTabContent') || !$this->unregisterHook('header') || !$this->unregisterHook('productTab') || !$this->unregisterHook('top') || !$this->unregisterHook('displayProductListReviews')) return false; return true; } public function reset() { if (!$this->uninstall(false)) return false; if (!$this->install(false)) return false; return true; } public function deleteTables() { return Db::getInstance()->execute(' DROP TABLE IF EXISTS `'._DB_PREFIX_.'product_comment`, `'._DB_PREFIX_.'product_comment_criterion`, `'._DB_PREFIX_.'product_comment_criterion_product`, `'._DB_PREFIX_.'product_comment_criterion_lang`, `'._DB_PREFIX_.'product_comment_criterion_category`, `'._DB_PREFIX_.'product_comment_grade`, `'._DB_PREFIX_.'product_comment_usefulness`, `'._DB_PREFIX_.'product_comment_report`'); } public function getCacheId($id_product = null) { return parent::getCacheId().'|'.(int)$id_product; } protected function _postProcess() { $this->_setFilters(); if (Tools::isSubmit('submitModerate')) { Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', (int)Tools::getValue('PRODUCT_COMMENTS_MODERATE')); Configuration::updateValue('PRODUCT_COMMENTS_ALLOW_GUESTS', (int)Tools::getValue('PRODUCT_COMMENTS_ALLOW_GUESTS')); Configuration::updateValue('PRODUCT_COMMENTS_MINIMAL_TIME', (int)Tools::getValue('PRODUCT_COMMENTS_MINIMAL_TIME')); $this->_html .= '
'.$this->l('Settings updated').'
'; } elseif (Tools::isSubmit('productcomments')) { $id_product_comment = (int)Tools::getValue('id_product_comment'); $comment = new ProductComment($id_product_comment); $comment->validate(); ProductComment::deleteReports($id_product_comment); } elseif (Tools::isSubmit('deleteproductcomments')) { $id_product_comment = (int)Tools::getValue('id_product_comment'); $comment = new ProductComment($id_product_comment); $comment->delete(); } elseif (Tools::isSubmit('submitEditCriterion')) { $criterion = new ProductCommentCriterion((int)Tools::getValue('id_product_comment_criterion')); $criterion->id_product_comment_criterion_type = Tools::getValue('id_product_comment_criterion_type'); $criterion->active = Tools::getValue('active'); $languages = Language::getLanguages(); $name = array(); foreach ($languages as $key => $value) { $name[$value['id_lang']] = Tools::getValue('name_'.$value['id_lang']); } $criterion->name = $name; $criterion->save(); // Clear before reinserting data $criterion->deleteCategories(); $criterion->deleteProducts(); if ($criterion->id_product_comment_criterion_type == 2) { if ($categories = Tools::getValue('categoryBox')) if (count($categories)) foreach ($categories as $id_category) $criterion->addCategory((int)$id_category); } else if ($criterion->id_product_comment_criterion_type == 3) { if ($products = Tools::getValue('ids_product')) if (count($products)) foreach ($products as $product) $criterion->addProduct((int)$product); } if ($criterion->save()) Tools::redirectAdmin(Context::getContext()->link->getAdminLink('AdminModules').'&configure='.$this->name.'&conf=4'); else $this->_html .= '
'.$this->l('The criterion could not be saved').'
'; } elseif (Tools::isSubmit('deleteproductcommentscriterion')) { $productCommentCriterion = new ProductCommentCriterion((int)Tools::getValue('id_product_comment_criterion')); if ($productCommentCriterion->id) if ($productCommentCriterion->delete()) $this->_html .= '
'.$this->l('Criterion deleted').'
'; } elseif (Tools::isSubmit('statusproductcommentscriterion')) { $criterion = new ProductCommentCriterion((int)Tools::getValue('id_product_comment_criterion')); if ($criterion->id) { $criterion->active = (int)(!$criterion->active); $criterion->save(); } Tools::redirectAdmin($this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&tab_module='.$this->tab.'&conf=4&module_name='.$this->name); } elseif ($id_product_comment = (int)Tools::getValue('approveComment')) { $comment = new ProductComment($id_product_comment); $comment->validate(); } elseif ($id_product_comment = (int)Tools::getValue('noabuseComment')) { ProductComment::deleteReports($id_product_comment); } $this->_clearcache('productcomments_reviews.tpl'); } public function getContent() { include_once(dirname(__FILE__).'/ProductComment.php'); include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); $this->_html = ''; if (Tools::isSubmit('updateproductcommentscriterion')) $this->_html .= $this->renderCriterionForm((int)Tools::getValue('id_product_comment_criterion')); else { $this->_postProcess(); $this->_html .= $this->renderConfigForm(); $this->_html .= $this->renderModerateLists(); $this->_html .= $this->renderCriterionList(); $this->_html .= $this->renderCommentsList(); } $this->_setBaseUrl(); $this->_productCommentsCriterionTypes = ProductCommentCriterion::getTypes(); $this->context->controller->addJs($this->_path.'js/moderate.js'); return $this->_html; } private function _setBaseUrl() { $this->_baseUrl = 'index.php?'; foreach ($_GET as $k => $value) if (!in_array($k, array('deleteCriterion', 'editCriterion'))) $this->_baseUrl .= $k.'='.$value.'&'; $this->_baseUrl = rtrim($this->_baseUrl, '&'); } public function renderConfigForm() { $fields_form_1 = array( 'form' => array( 'legend' => array( 'title' => $this->l('Configuration'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('All reviews must be validated by an employee'), 'name' => 'PRODUCT_COMMENTS_MODERATE', 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('Allow guest reviews'), 'name' => 'PRODUCT_COMMENTS_ALLOW_GUESTS', 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), array( 'type' => 'text', 'label' => $this->l('Minimum time between 2 reviews from the same user'), 'name' => 'PRODUCT_COMMENTS_MINIMAL_TIME', 'class' => 'fixed-width-xs', 'suffix' => 'seconds', ), ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right', 'name' => 'submitModerate', ) ), ); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->name; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->module = $this; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $helper->identifier = $this->identifier; $helper->submit_action = 'submitProducCommentsConfiguration'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'fields_value' => $this->getConfigFieldsValues(), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id ); return $helper->generateForm(array($fields_form_1)); } public function renderModerateLists() { require_once(dirname(__FILE__).'/ProductComment.php'); $return = null; if (Configuration::get('PRODUCT_COMMENTS_MODERATE')) { $comments = ProductComment::getByValidate(0, false); $fields_list = $this->getStandardFieldList(); if (version_compare(_PS_VERSION_, '1.6', '<')) { $return .= "

".$this->l('Reviews waiting for approval')."

"; $actions = array('enable', 'delete'); } else $actions = array('approve', 'delete'); $helper = new HelperList(); $helper->shopLinkType = ''; $helper->simple_header = true; $helper->actions = $actions; $helper->show_toolbar = false; $helper->module = $this; $helper->listTotal = count($comments); $helper->identifier = 'id_product_comment'; $helper->title = $this->l('Reviews waiting for approval'); $helper->table = $this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; //$helper->tpl_vars = array('priority' => array($this->l('High'), $this->l('Medium'), $this->l('Low'))); $return .= $helper->generateList($comments, $fields_list); } $comments = ProductComment::getReportedComments(); $fields_list = $this->getStandardFieldList(); if (version_compare(_PS_VERSION_, '1.6', '<')) { $return .= "

".$this->l('Reported Reviews')."

"; $actions = array('enable', 'delete'); } else $actions = array('delete', 'noabuse'); $helper = new HelperList(); $helper->shopLinkType = ''; $helper->simple_header = true; $helper->actions = $actions; $helper->show_toolbar = false; $helper->module = $this; $helper->listTotal = count($comments); $helper->identifier = 'id_product_comment'; $helper->title = $this->l('Reported Reviews'); $helper->table = $this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; //$helper->tpl_vars = array('priority' => array($this->l('High'), $this->l('Medium'), $this->l('Low'))); $return .= $helper->generateList($comments, $fields_list); return $return; } public function renderCriterionList() { include_once(dirname(__FILE__).'/ProductCommentCriterion.php'); $criterions = ProductCommentCriterion::getCriterions($this->context->language->id, false, false); $fields_list = array( 'id_product_comment_criterion' => array( 'title' => $this->l('ID'), 'type' => 'text', ), 'name' => array( 'title' => $this->l('Name'), 'type' => 'text', ), 'type_name' => array( 'title' => $this->l('Type'), 'type' => 'text', ), 'active' => array( 'title' => $this->l('Status'), 'active' => 'status', 'type' => 'bool', ), ); $helper = new HelperList(); $helper->shopLinkType = ''; $helper->simple_header = false; $helper->actions = array('edit', 'delete'); $helper->show_toolbar = true; $helper->toolbar_btn['new'] = array( 'href' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&module_name='.$this->name.'&updateproductcommentscriterion', 'desc' => $this->l('Add New Criterion', null, null, false) ); $helper->module = $this; $helper->identifier = 'id_product_comment_criterion'; $helper->title = $this->l('Review Criterions'); $helper->table = $this->name.'criterion'; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; //$helper->tpl_vars = array('priority' => array($this->l('High'), $this->l('Medium'), $this->l('Low'))); return $helper->generateList($criterions, $fields_list); } public function renderCommentsList() { require_once(dirname(__FILE__).'/ProductComment.php'); $comments = ProductComment::getByValidate(1, false); $fields_list = $this->getStandardFieldList(); $helper = new HelperList(); $helper->shopLinkType = ''; $helper->simple_header = true; $helper->actions = array('delete'); $helper->show_toolbar = false; $helper->module = $this; $helper->listTotal = count($comments); $helper->identifier = 'id_product_comment'; $helper->title = $this->l('Approved Reviews'); $helper->table = $this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->currentIndex = AdminController::$currentIndex.'&configure='.$this->name; //$helper->tpl_vars = array('priority' => array($this->l('High'), $this->l('Medium'), $this->l('Low'))); return $helper->generateList($comments, $fields_list); } public function getConfigFieldsValues() { return array( 'PRODUCT_COMMENTS_MODERATE' => Tools::getValue('PRODUCT_COMMENTS_MODERATE', Configuration::get('PRODUCT_COMMENTS_MODERATE')), 'PRODUCT_COMMENTS_ALLOW_GUESTS' => Tools::getValue('PRODUCT_COMMENTS_ALLOW_GUESTS', Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS')), 'PRODUCT_COMMENTS_MINIMAL_TIME' => Tools::getValue('PRODUCT_COMMENTS_MINIMAL_TIME', Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')), ); } public function getCriterionFieldsValues($id = 0) { $criterion = new ProductCommentCriterion($id); return array( 'name' => $criterion->name, 'id_product_comment_criterion_type' => $criterion->id_product_comment_criterion_type, 'active' => $criterion->active, 'id_product_comment_criterion' => $criterion->id, ); } public function getStandardFieldList() { return array( 'id_product_comment' => array( 'title' => $this->l('ID'), 'type' => 'text', ), 'title' => array( 'title' => $this->l('Review title'), 'type' => 'text', ), 'content' => array( 'title' => $this->l('Review'), 'type' => 'text', ), 'grade' => array( 'title' => $this->l('Rating'), 'type' => 'text', 'suffix' => '/5', ), 'customer_name' => array( 'title' => $this->l('Author'), 'type' => 'text', ), 'name' => array( 'title' => $this->l('Product'), 'type' => 'text', ), 'date_add' => array( 'title' => $this->l('Time of publication'), 'type' => 'date', ), ); } function renderCriterionForm($id_criterion = 0) { $types = ProductCommentCriterion::getTypes(); $query =array(); foreach ($types as $key => $value) { $query[] = array( 'id' => $key, 'label' => $value, ); } $criterion = new ProductCommentCriterion((int)$id_criterion); $selected_categories = $criterion->getCategories(); $product_table_values = Product::getSimpleProducts($this->context->language->id); $selected_products = $criterion->getProducts(); foreach ($product_table_values as $key => $product) { if(false !== array_search($product['id_product'], $selected_products)) $product_table_values[$key]['selected'] = 1; } if (version_compare(_PS_VERSION_, '1.6', '<')) $field_category_tree = array( 'type' => 'categories_select', 'name' => 'categoryBox', 'label' => $this->l('Criterion will be restricted to the following categories'), 'category_tree' => $this->initCategoriesAssociation(null, $id_criterion), ); else $field_category_tree = array( 'type' => 'categories', 'label' => $this->l('Criterion will be restricted to the following categories'), 'name' => 'categoryBox', 'desc' => $this->l('Mark the boxes of categories to which this criterion applies.'), 'tree' => array( 'use_search' => false, 'id' => 'categoryBox', 'use_checkbox' => true, 'selected_categories' => $selected_categories, ), //retro compat 1.5 for category tree 'values' => array( 'trads' => array( 'Root' => Category::getTopCategory(), 'selected' => $this->l('Selected'), 'Collapse All' => $this->l('Collapse All'), 'Expand All' => $this->l('Expand All'), 'Check All' => $this->l('Check All'), 'Uncheck All' => $this->l('Uncheck All') ), 'selected_cat' => $selected_categories, 'input_name' => 'categoryBox[]', 'use_radio' => false, 'use_search' => false, 'disabled_categories' => array(), 'top_category' => Category::getTopCategory(), 'use_context' => true, ) ); $fields_form_1 = array( 'form' => array( 'legend' => array( 'title' => $this->l('Add new criterion'), 'icon' => 'icon-cogs' ), 'input' => array( array( 'type' => 'hidden', 'name' => 'id_product_comment_criterion', ), array( 'type' => 'text', 'lang' => true, 'label' => $this->l('Criterion name'), 'name' => 'name', ), array( 'type' => 'select', 'name' => 'id_product_comment_criterion_type', 'label' => $this->l('Application scope of the criterion'), 'options' => array( 'query' => $query, 'id' => 'id', 'name' => 'label' ), ), $field_category_tree, array( 'type' => 'products', 'label' => $this->l('The criterion will be restricted to the following products'), 'name' => 'ids_product', 'values' => $product_table_values, ), array( 'type' => 'switch', 'is_bool' => true, //retro compat 1.5 'label' => $this->l('Active'), 'name' => 'active', 'values' => array( array( 'id' => 'active_on', 'value' => 1, 'label' => $this->l('Enabled') ), array( 'id' => 'active_off', 'value' => 0, 'label' => $this->l('Disabled') ) ), ), ), 'submit' => array( 'title' => $this->l('Save'), 'class' => 'btn btn-default pull-right', 'name' => 'submitEditCriterion', ) ), ); $helper = new HelperForm(); $helper->show_toolbar = false; $helper->table = $this->name; $lang = new Language((int)Configuration::get('PS_LANG_DEFAULT')); $helper->default_form_language = $lang->id; $helper->module = $this; $helper->allow_employee_form_lang = Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') ? Configuration::get('PS_BO_ALLOW_EMPLOYEE_FORM_LANG') : 0; $helper->identifier = $this->identifier; $helper->submit_action = 'submitEditCriterion'; $helper->currentIndex = $this->context->link->getAdminLink('AdminModules', false).'&configure='.$this->name.'&tab_module='.$this->tab.'&module_name='.$this->name; $helper->token = Tools::getAdminTokenLite('AdminModules'); $helper->tpl_vars = array( 'fields_value' => $this->getCriterionFieldsValues($id_criterion), 'languages' => $this->context->controller->getLanguages(), 'id_language' => $this->context->language->id ); return $helper->generateForm(array($fields_form_1)); } private function _checkDeleteComment() { $action = Tools::getValue('delete_action'); if (empty($action) === false) { $product_comments = Tools::getValue('delete_id_product_comment'); if (count($product_comments)) { require_once(dirname(__FILE__).'/ProductComment.php'); if ($action == 'delete') { foreach ($product_comments as $id_product_comment) { if (!$id_product_comment) continue; $comment = new ProductComment((int)$id_product_comment); $comment->delete(); ProductComment::deleteGrades((int)$id_product_comment); } } } } } private function _setFilters() { $this->_filters = array( 'page' => (string)Tools::getValue('submitFilter'.$this->name), 'pagination' => (string)Tools::getValue($this->name.'_pagination'), 'filter_id' => (string)Tools::getValue($this->name.'Filter_id_product_comment'), 'filter_content' => (string)Tools::getValue($this->name.'Filter_content'), 'filter_customer_name' => (string)Tools::getValue($this->name.'Filter_customer_name'), 'filter_grade' => (string)Tools::getValue($this->name.'Filter_grade'), 'filter_name' => (string)Tools::getValue($this->name.'Filter_name'), 'filter_date_add' => (string)Tools::getValue($this->name.'Filter_date_add'), ); } public function displayApproveLink($token = null, $id, $name = null) { $this->smarty->assign(array( 'href' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&module_name='.$this->name.'&approveComment='.$id, 'action' => $this->l('Approve'), )); return $this->display(__FILE__, 'views/templates/admin/list_action_approve.tpl'); } public function displayNoabuseLink($token = null, $id, $name = null) { $this->smarty->assign(array( 'href' => $this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'&module_name='.$this->name.'&noabuseComment='.$id, 'action' => $this->l('Not abusive'), )); return $this->display(__FILE__, 'views/templates/admin/list_action_noabuse.tpl'); } public function hookProductTab($params) { require_once(dirname(__FILE__).'/ProductComment.php'); require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); $average = ProductComment::getAverageGrade((int)Tools::getValue('id_product')); $this->context->smarty->assign(array( 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), 'comments' => ProductComment::getByProduct((int)(Tools::getValue('id_product'))), 'criterions' => ProductCommentCriterion::getByProduct((int)(Tools::getValue('id_product')), $this->context->language->id), 'averageTotal' => round($average['grade']), 'nbComments' => (int)(ProductComment::getCommentNumber((int)(Tools::getValue('id_product')))) )); return ($this->display(__FILE__, '/tab.tpl')); } public function hookDisplayProductListReviews($params) { $id_product = (int)$params['product']['id_product']; if (!$this->isCached('productcomments_reviews.tpl', $this->getCacheId($id_product))) { require_once(dirname(__FILE__).'/ProductComment.php'); $average = ProductComment::getAverageGrade($id_product); $this->smarty->assign(array( 'product' => $params['product'], 'averageTotal' => round($average['grade']), 'ratings' => ProductComment::getRatings($id_product), 'nbComments' => (int)ProductComment::getCommentNumber($id_product) )); } return $this->display(__FILE__, 'productcomments_reviews.tpl', $this->getCacheId($id_product)); } public function hookDisplayRightColumnProduct($params) { require_once(dirname(__FILE__).'/ProductComment.php'); require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); $id_guest = (!$id_customer = (int)$this->context->cookie->id_customer) ? (int)$this->context->cookie->id_guest : false; $customerComment = ProductComment::getByCustomer((int)(Tools::getValue('id_product')), (int)$this->context->cookie->id_customer, true, (int)$id_guest); $average = ProductComment::getAverageGrade((int)Tools::getValue('id_product')); $product = $this->context->controller->getProduct(); $image = Product::getCover((int)Tools::getValue('id_product')); $cover_image = $this->context->link->getImageLink($product->link_rewrite, $image['id_image'], 'medium_default'); $this->context->smarty->assign(array( 'id_product_comment_form' => (int)Tools::getValue('id_product'), 'product' => $product, 'secure_key' => $this->secure_key, 'logged' => $this->context->customer->isLogged(true), 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), 'productcomment_cover' => (int)Tools::getValue('id_product').'-'.(int)$image['id_image'], // retro compat 'productcomment_cover_image' => $cover_image, 'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')), 'criterions' => ProductCommentCriterion::getByProduct((int)Tools::getValue('id_product'), $this->context->language->id), 'action_url' => '', 'averageTotal' => round($average['grade']), 'ratings' => ProductComment::getRatings((int)Tools::getValue('id_product')), 'too_early' => ($customerComment && (strtotime($customerComment['date_add']) + Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) > time()), 'nbComments' => (int)(ProductComment::getCommentNumber((int)Tools::getValue('id_product'))) )); return ($this->display(__FILE__, '/productcomments-extra.tpl')); } public function hookDisplayLeftColumnProduct($params) { return $this->hookDisplayRightColumnProduct($params); } public function hookProductTabContent($params) { $this->context->controller->addJS($this->_path.'js/jquery.rating.pack.js'); $this->context->controller->addJS($this->_path.'js/jquery.textareaCounter.plugin.js'); $this->context->controller->addJS($this->_path.'js/productcomments.js'); $id_guest = (!$id_customer = (int)$this->context->cookie->id_customer) ? (int)$this->context->cookie->id_guest : false; $customerComment = ProductComment::getByCustomer((int)(Tools::getValue('id_product')), (int)$this->context->cookie->id_customer, true, (int)$id_guest); $averages = ProductComment::getAveragesByProduct((int)Tools::getValue('id_product'), $this->context->language->id); $averageTotal = 0; foreach ($averages as $average) $averageTotal += (float)($average); $averageTotal = count($averages) ? ($averageTotal / count($averages)) : 0; $product = $this->context->controller->getProduct(); $image = Product::getCover((int)Tools::getValue('id_product')); $cover_image = $this->context->link->getImageLink($product->link_rewrite, $image['id_image'], 'medium_default'); $this->context->smarty->assign(array( 'logged' => $this->context->customer->isLogged(true), 'action_url' => '', 'product' => $product, 'comments' => ProductComment::getByProduct((int)Tools::getValue('id_product'), 1, null, $this->context->cookie->id_customer), 'criterions' => ProductCommentCriterion::getByProduct((int)Tools::getValue('id_product'), $this->context->language->id), 'averages' => $averages, 'product_comment_path' => $this->_path, 'averageTotal' => $averageTotal, 'allow_guests' => (int)Configuration::get('PRODUCT_COMMENTS_ALLOW_GUESTS'), 'too_early' => ($customerComment && (strtotime($customerComment['date_add']) + Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME')) > time()), 'delay' => Configuration::get('PRODUCT_COMMENTS_MINIMAL_TIME'), 'id_product_comment_form' => (int)Tools::getValue('id_product'), 'secure_key' => $this->secure_key, 'productcomment_cover' => (int)Tools::getValue('id_product').'-'.(int)$image['id_image'], 'productcomment_cover_image' => $cover_image, 'mediumSize' => Image::getSize(ImageType::getFormatedName('medium')), 'nbComments' => (int)ProductComment::getCommentNumber((int)Tools::getValue('id_product')), 'productcomments_controller_url' => $this->context->link->getModuleLink('productcomments'), 'productcomments_url_rewriting_activated' => Configuration::get('PS_REWRITING_SETTINGS', 0), 'moderation_active' => (int)Configuration::get('PRODUCT_COMMENTS_MODERATE') )); $this->context->controller->pagination((int)ProductComment::getCommentNumber((int)Tools::getValue('id_product'))); return ($this->display(__FILE__, '/productcomments.tpl')); } public function hookHeader() { $this->context->controller->addCSS($this->_path.'productcomments.css', 'all'); $this->page_name = Dispatcher::getInstance()->getController(); if (in_array($this->page_name, array('product', 'productscomparison'))) { $this->context->controller->addJS($this->_path.'js/jquery.rating.pack.js'); if (in_array($this->page_name, array('productscomparison'))) { $this->context->controller->addjqueryPlugin('cluetip'); $this->context->controller->addJS($this->_path.'js/products-comparison.js'); } } } public function hookExtraProductComparison($params) { require_once(dirname(__FILE__).'/ProductComment.php'); require_once(dirname(__FILE__).'/ProductCommentCriterion.php'); $list_grades = array(); $list_product_grades = array(); $list_product_average = array(); $list_product_comment = array(); foreach ($params['list_ids_product'] as $id_product) { $grades = ProductComment::getAveragesByProduct($id_product, $this->context->language->id); $criterions = ProductCommentCriterion::getByProduct($id_product, $this->context->language->id); $grade_total = 0; if (count($grades) > 0) { foreach ($criterions as $criterion) { if (isset($grades[$criterion['id_product_comment_criterion']])) { $list_product_grades[$criterion['id_product_comment_criterion']][$id_product] = $grades[$criterion['id_product_comment_criterion']]; $grade_total += (float)($grades[$criterion['id_product_comment_criterion']]); } else $list_product_grades[$criterion['id_product_comment_criterion']][$id_product] = 0; if (!array_key_exists($criterion['id_product_comment_criterion'], $list_grades)) $list_grades[$criterion['id_product_comment_criterion']] = $criterion['name']; } $list_product_average[$id_product] = $grade_total / count($criterions); $list_product_comment[$id_product] = ProductComment::getByProduct($id_product, 0, 3); } } if (count($list_grades) < 1) return false; $this->context->smarty->assign(array( 'grades' => $list_grades, 'product_grades' => $list_product_grades, 'list_ids_product' => $params['list_ids_product'], 'list_product_average' => $list_product_average, 'product_comments' => $list_product_comment )); return $this->display(__FILE__, '/products-comparison.tpl'); } public function initCategoriesAssociation($id_root = null, $id_criterion = 0) { if (is_null($id_root)) $id_root = Configuration::get('PS_ROOT_CATEGORY'); $id_shop = (int)Tools::getValue('id_shop'); $shop = new Shop($id_shop); if ($id_criterion == 0) $selected_cat = array(); else { $pdc_object = new ProductCommentCriterion($id_criterion); $selected_cat = $pdc_object->getCategories(); } if (Shop::getContext() == Shop::CONTEXT_SHOP && Tools::isSubmit('id_shop')) $root_category = new Category($shop->id_category); else $root_category = new Category($id_root); $root_category = array('id_category' => $root_category->id, 'name' => $root_category->name[$this->context->language->id]); $helper = new Helper(); return $helper->renderCategoryTree($root_category, $selected_cat, 'categoryBox', false, true); } }