356 lines
15 KiB
PHP
356 lines
15 KiB
PHP
<?php
|
|
|
|
class ProductComments extends Module
|
|
{
|
|
const INSTALL_SQL_FILE = 'install.sql';
|
|
|
|
private $_html = '';
|
|
private $_postErrors = array();
|
|
|
|
function __construct()
|
|
{
|
|
$this->name = 'productcomments';
|
|
$this->tab = 'Products';
|
|
$this->version = '0.2';
|
|
|
|
parent::__construct();
|
|
|
|
$this->displayName = $this->l('Product Comments');
|
|
$this->description = $this->l('Allow users to post comment about a product');
|
|
}
|
|
|
|
function install()
|
|
{
|
|
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('PREFIX_', _DB_PREFIX_, $sql);
|
|
$sql = preg_split("/;\s*[\r\n]+/",$sql);
|
|
foreach ($sql as $query)
|
|
if (!Db::getInstance()->Execute(trim($query)))
|
|
return (false);
|
|
if (parent::install() == false
|
|
OR $this->registerHook('productTab') == false
|
|
OR $this->registerHook('productTabContent') == false
|
|
OR $this->registerHook('header') == false
|
|
OR Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', 1) == false)
|
|
return (false);
|
|
return (true);
|
|
}
|
|
|
|
public function getContent()
|
|
{
|
|
$this->_html = '<h2>'.$this->displayName.'</h2>';
|
|
$this->_checkModerateComment();
|
|
$this->_checkCriterion();
|
|
$this->_checkCriterionProduct();
|
|
return $this->_html.$this->_displayForm();
|
|
}
|
|
|
|
private function _checkModerateComment()
|
|
{
|
|
$action = Tools::getValue('action');
|
|
if (Tools::isSubmit('submitModerate'))
|
|
{
|
|
$moderate = Tools::getValue('moderate');
|
|
if (intval($moderate) != 0)
|
|
$moderate = 1;
|
|
Configuration::updateValue('PRODUCT_COMMENTS_MODERATE', intval($moderate));
|
|
$this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>';
|
|
}
|
|
else if (empty($action) === false &&
|
|
intval(Configuration::get('PRODUCT_COMMENTS_MODERATE')))
|
|
{
|
|
$id_product_comment = Tools::getValue('id_product_comment');
|
|
require_once(dirname(__FILE__).'/ProductComment.php');
|
|
switch ($action)
|
|
{
|
|
case 'accept':
|
|
$comment = new ProductComment($id_product_comment);
|
|
$comment->validate();
|
|
break;
|
|
case 'delete':
|
|
$comment = new ProductComment($id_product_comment);
|
|
$comment->delete();
|
|
ProductComment::deleteGrades($id_product_comment);
|
|
break;
|
|
default:
|
|
;
|
|
}
|
|
}
|
|
}
|
|
|
|
private function _checkCriterion()
|
|
{
|
|
$action_criterion = Tools::getValue('criterion_action');
|
|
$name = Tools::getValue('criterion');
|
|
if (Tools::isSubmit('submitCriterion') AND empty($action_criterion) AND !empty($name))
|
|
{
|
|
global $cookie;
|
|
|
|
require_once(dirname(__FILE__).'/ProductCommentCriterion.php');
|
|
ProductCommentCriterion::add($cookie->id_lang, $name);
|
|
$this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>';
|
|
}
|
|
elseif (!empty($action_criterion) AND empty($name))
|
|
{
|
|
$id_product_comment_criterion = Tools::getValue('id_product_comment_criterion');
|
|
require_once(dirname(__FILE__).'/ProductCommentCriterion.php');
|
|
switch ($action_criterion)
|
|
{
|
|
case 'edit':
|
|
ProductCommentCriterion::update($id_product_comment_criterion,
|
|
Tools::getValue('criterion_id_lang'),
|
|
Tools::getValue('criterion_name'));
|
|
break;
|
|
case 'delete':
|
|
ProductCommentCriterion::delete($id_product_comment_criterion);
|
|
break;
|
|
default:
|
|
;
|
|
}
|
|
}
|
|
}
|
|
|
|
private function _checkCriterionProduct()
|
|
{
|
|
if (Tools::isSubmit('submitCriterionProduct'))
|
|
{
|
|
$id_product_comment_criterions = Tools::getValue('id_product_comment_criterion');
|
|
$id_product = Tools::getValue('id_product');
|
|
require_once(dirname(__FILE__).'/ProductCommentCriterion.php');
|
|
ProductCommentCriterion::deleteByProduct($id_product);
|
|
if (empty($id_product_comment_criterions) === false)
|
|
foreach ($id_product_comment_criterions as $id_product_comment_criterion)
|
|
ProductCommentCriterion::addToProduct($id_product_comment_criterion, $id_product);
|
|
$this->_html .= '<div class="conf confirm"><img src="../img/admin/ok.gif" alt="'.$this->l('Confirmation').'" />'.$this->l('Settings updated').'</div>';
|
|
}
|
|
}
|
|
|
|
private function _displayForm()
|
|
{
|
|
$this->_displayFormModerate();
|
|
$this->_displayFormCriterion();
|
|
$this->_displayFormProductCriterion();
|
|
return ($this->_html);
|
|
}
|
|
|
|
private function _displayFormModerate()
|
|
{
|
|
$this->_html = '<script type="text/javascript" src="'.$this->_path.'js/moderate.js"></script>
|
|
<form action="'.$_SERVER['REQUEST_URI'].'" method="post" name="comment_form">
|
|
<fieldset><legend><img src="'.$this->_path.'img/comments_delete.png" alt="" title="" />'.$this->l('Moderate Comments').'</legend>
|
|
<label>'.$this->l('Validation required').'</label>
|
|
<div class="margin-form">
|
|
<input type="radio" name="moderate" id="moderate_on" value="1" '.(Configuration::get('PRODUCT_COMMENTS_MODERATE') ? 'checked="checked" ' : '').'/>
|
|
<label class="t" for="moderate_on"> <img src="../img/admin/enabled.gif" alt="'.$this->l('Enabled').'" title="'.$this->l('Enabled').'" /></label>
|
|
<input type="radio" name="moderate" id="moderate_off" value="0" '.(!Configuration::get('PRODUCT_COMMENTS_MODERATE') ? 'checked="checked" ' : '').'/>
|
|
<label class="t" for="moderate_off"> <img src="../img/admin/disabled.gif" alt="'.$this->l('Disabled').'" title="'.$this->l('Disabled').'" /></label>
|
|
</div>
|
|
<div class="margin-form clear"><input type="submit" name="submitModerate" value="'.$this->l('Save').'" class="button" /></div>';
|
|
if (Configuration::get('PRODUCT_COMMENTS_MODERATE'))
|
|
{
|
|
require_once(dirname(__FILE__).'/ProductComment.php');
|
|
$comments = ProductComment::getByValidate();
|
|
if (sizeof($comments))
|
|
{
|
|
$this->_html .= '<input type="hidden" name="id_product_comment" id="id_product_comment" />
|
|
<input type="hidden" name="action" id="action" />
|
|
<br /><table class="table" border="0" cellspacing="0" cellpadding="0">
|
|
<thead>
|
|
<tr>
|
|
<th style="width:30px;">'.$this->l('Actions').'</th>
|
|
<th style="width:150px;">'.$this->l('Author').'</th>
|
|
<th style="width:550px;">'.$this->l('Comment').'</th>
|
|
<th style="width:150px;">'.$this->l('Product name').'</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>';
|
|
foreach ($comments as $comment)
|
|
{
|
|
$this->_html .= '<tr>
|
|
<td><a href="javascript:;" onclick="acceptComment(\''.intval($comment['id_product_comment']).'\');"><img src="'.$this->_path.'img/accept.png" alt="'.$this->l('Accept').'" title="'.$this->l('Accept').'" /></a>
|
|
<a href="javascript:;" onclick="deleteComment(\''.intval($comment['id_product_comment']).'\');"><img src="'.$this->_path.'img/delete.png" alt="'.$this->l('Delete').'" title="'.$this->l('Delete').'" /></a></td>
|
|
<td>'.htmlspecialchars($comment['firstname'], ENT_COMPAT, 'UTF-8').' '.htmlspecialchars(substr($comment['lastname'], 0, 1), ENT_COMPAT, 'UTF-8').'.</td>
|
|
<td>'.htmlspecialchars($comment['content'], ENT_COMPAT, 'UTF-8').'</td>
|
|
<td>'.$comment['id_product'].' - '.htmlspecialchars($comment['name'], ENT_COMPAT, 'UTF-8').'</td>
|
|
</tr>';
|
|
}
|
|
$this->_html .= '</tbody>
|
|
</table>';
|
|
}
|
|
else
|
|
$this->_html .= $this->l('No comments to validate.');
|
|
}
|
|
$this->_html .= '</fieldset></form><br />';
|
|
}
|
|
|
|
private function _displayFormCriterion()
|
|
{
|
|
global $cookie;
|
|
|
|
$this->_html .= '<form action="'.$_SERVER['REQUEST_URI'].'" method="post" name="criterion_form">
|
|
<fieldset><legend><img src="'.$this->_path.'img/note.png" alt="" title="" />'.$this->l('Comment\'s criterions').'</legend>
|
|
<label for="criterion">'.$this->l('Comment\'s criterion').'</label>
|
|
<div class="margin-form">
|
|
<input type="text" name="criterion" id="criterion" /> <input type="submit" name="submitCriterion" value="'.$this->l('Add').'" class="button" />
|
|
<p>'.$this->l('Create a new grading criterion for your products.').'</p>
|
|
</div>
|
|
<p>'.$this->l('Once created, you must activate it for the desired products with the form below.').'<br />'.$this->l('Be aware that the criterions are independent in each language.').'</p>';
|
|
require_once(dirname(__FILE__).'/ProductCommentCriterion.php');
|
|
$criterions = ProductCommentCriterion::get($cookie->id_lang);
|
|
if (sizeof($criterions))
|
|
{
|
|
$this->_html .= '
|
|
<input type="hidden" name="id_product_comment_criterion" id="id_product_comment_criterion" />
|
|
<input type="hidden" name="criterion_name" id="criterion_name" />
|
|
<input type="hidden" name="criterion_id_lang" id="criterion_id_lang" value="'.intval($cookie->id_lang).'" />
|
|
<input type="hidden" name="criterion_action" id="criterion_action" />
|
|
<br /><table class="table">
|
|
<thead>
|
|
<tr>
|
|
<th style="width:30px;">'.$this->l('Actions').'</th>
|
|
<th style="width:260px;">'.$this->l('Criterion').'</th>
|
|
<th style="width:30px;">'.$this->l('Actions').'</th>
|
|
<th style="width:260px;">'.$this->l('Criterion').'</th>
|
|
<th style="width:30px;">'.$this->l('Actions').'</th>
|
|
<th style="width:260px;">'.$this->l('Criterion').'</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody><tr>';
|
|
$len = sizeof($criterions);
|
|
for ($i = 0; $i < $len; ++$i)
|
|
{
|
|
$this->_html .= '
|
|
<td><a href="javascript:;" onclick="editCriterion(\''.intval($criterions[$i]['id_product_comment_criterion']).'\');"><img src="'.$this->_path.'img/accept.png" alt="'.$this->l('Accept').'" /></a>
|
|
<a href="javascript:;" onclick="deleteCriterion(\''.intval($criterions[$i]['id_product_comment_criterion']).'\');"><img src="'.$this->_path.'img/delete.png" alt="'.$this->l('Delete').'" /></a></td>
|
|
<td><input type="text" id="criterion_name_'.intval($criterions[$i]['id_product_comment_criterion']).'" value="'.htmlspecialchars($criterions[$i]['name'], ENT_COMPAT, 'UTF-8').'" /></td>';
|
|
if (!(($i + 1) % 3) || ($i + 1) >= $len)
|
|
$this->_html .= '</tr><tr>';
|
|
}
|
|
if (!$len)
|
|
$this->_html = '</tr>';
|
|
$this->_html .= '</tbody>
|
|
</table>';
|
|
}
|
|
$this->_html .= '</fieldset></form><br />';
|
|
}
|
|
|
|
private function _displayFormProductCriterion()
|
|
{
|
|
global $cookie;
|
|
|
|
$products = Product::getSimpleProducts($cookie->id_lang);
|
|
$this->_html .= '<script type="text/javascript" src="'.$this->_path.'js/productCriterion.js"></script>
|
|
<form action="'.$_SERVER['REQUEST_URI'].'" method="post" name="product_criterion_form">
|
|
<fieldset><legend><img src="'.$this->_path.'img/note_go.png" alt="" title="" />'.$this->l('Product\'s criterions').'</legend>
|
|
<p>'.$this->l('Select the grading criterions corresponding to each product. You can select multiple criterions by pressing the ctrl key.').'</p><br />
|
|
<label for="id_product">'.$this->l('Product').'</label>
|
|
<div class="margin-form">
|
|
<select name="id_product" id="id_product" onchange="getProductCriterion(\''.$this->_path.'\', this.options[this.selectedIndex].value, \''.intval($cookie->id_lang).'\');">';
|
|
foreach ($products as $product)
|
|
$this->_html .= '<option value="'.intval($product['id_product']).'">'.htmlspecialchars($product['name'], ENT_COMPAT, 'UTF-8').'</option>';
|
|
$this->_html .= '</select>
|
|
</div>
|
|
<label for="id_product_comment_criterion">'.$this->l('Grading criterions').'</label>
|
|
<div id="product_criterions" class="margin-form">
|
|
</div>
|
|
<div class="margin-form clear"><input type="submit" name="submitCriterionProduct" value="'.$this->l('Save').'" class="button" /></div>
|
|
<script type="text/javascript">
|
|
getProductCriterion(\''.$this->_path.'\', document.getElementById(\'id_product\').options[0].value, \''.intval($cookie->id_lang).'\');
|
|
</script>
|
|
</fieldset>
|
|
</form>';
|
|
}
|
|
|
|
public function hookProductTab($params)
|
|
{
|
|
global $smarty;
|
|
global $cookie;
|
|
|
|
require_once(dirname(__FILE__).'/ProductComment.php');
|
|
require_once(dirname(__FILE__).'/ProductCommentCriterion.php');
|
|
|
|
$smarty->assign(array(
|
|
'comments' => ProductComment::getByProduct(intval($_GET['id_product'])),
|
|
'criterions' => ProductCommentCriterion::getByProduct(intval($_GET['id_product']), intval($cookie->id_lang)),
|
|
'nbComments' => intval(ProductComment::getCommentNumber(intval($_GET['id_product'])))
|
|
));
|
|
return ($this->display(__FILE__, '/tab.tpl'));
|
|
}
|
|
|
|
private function _frontOfficePostProcess()
|
|
{
|
|
global $smarty, $cookie, $errors;
|
|
|
|
require_once(dirname(__FILE__).'/ProductComment.php');
|
|
require_once(dirname(__FILE__).'/ProductCommentCriterion.php');
|
|
if (Tools::isSubmit('submitMessage') AND empty($cookie->id_customer) === false)
|
|
{
|
|
if (Tools::getValue('content'))
|
|
{
|
|
$comment = new ProductComment();
|
|
$comment->content = strip_tags(Tools::getValue('content'));
|
|
$comment->id_product = intval($_GET['id_product']);
|
|
$comment->id_customer = intval($cookie->id_customer);
|
|
$comment->grade = 0;
|
|
$comment->validate = 0;
|
|
if (!$comment->content)
|
|
$errors[] = $this->l('Invalid comment text posted.');
|
|
else
|
|
{
|
|
$comment->save();
|
|
for ($i = 1, $grade = 0; isset($_POST[$i.'_grade']) === true; ++$i)
|
|
{
|
|
$cgrade = intval(Tools::getValue($i.'_grade'));
|
|
$grade += $cgrade;
|
|
$cid_product_comment_criterion = Tools::getValue('id_product_comment_criterion_'.$i);
|
|
ProductCommentCriterion::addGrade($comment->id, $cid_product_comment_criterion, $cgrade);
|
|
}
|
|
if (($i - 1) > 0)
|
|
$comment->grade = ($grade / ($i - 1));
|
|
if (!$comment->save())
|
|
$errors[] = $this->l('An error occured while saving your comment.');
|
|
else
|
|
$smarty->assign('confirmation', $this->l('Comment posted successfully.').(intval(Configuration::get('PRODUCT_COMMENTS_MODERATE')) ? $this->l(' Awaiting moderator validation.') : ''));
|
|
}
|
|
}
|
|
else
|
|
$errors[] = $this->l('Comment text is required.');
|
|
}
|
|
}
|
|
|
|
public function hookProductTabContent($params)
|
|
{
|
|
global $smarty, $cookie, $nbProducts;
|
|
|
|
$commentNumber = intval(ProductComment::getCommentNumber(intval($_GET['id_product'])));
|
|
$averages = ProductComment::getAveragesByProduct(intval($_GET['id_product']), intval($cookie->id_lang));
|
|
|
|
$averageTotal = 0;
|
|
foreach ($averages AS $average)
|
|
$averageTotal += floatval($average);
|
|
$averageTotal = count($averages) ? ($averageTotal / count($averages)) : 0;
|
|
$smarty->assign(array(
|
|
'logged' => intval($cookie->id_customer),
|
|
'action_url' => Tools::safeOutput($_SERVER['PHP_SELF']).'?'.$_SERVER['QUERY_STRING'],
|
|
'comments' => ProductComment::getByProduct(intval($_GET['id_product'])),
|
|
'criterions' => ProductCommentCriterion::getByProduct(intval($_GET['id_product']), intval($cookie->id_lang)),
|
|
'averages' => $averages,
|
|
'product_comment_path' => $this->_path,
|
|
'averageTotal' => $averageTotal
|
|
));
|
|
$nbProducts = $commentNumber;
|
|
require_once(dirname(__FILE__).'/../../pagination.php');
|
|
return ($this->display(__FILE__, '/productcomments.tpl'));
|
|
}
|
|
|
|
public function hookHeader()
|
|
{
|
|
$this->_frontOfficePostProcess();
|
|
}
|
|
}
|
|
|
|
?>
|