раз вже така петрушка, то давайте спілкуватись критеріями цифр, бо розуміння "багато" - досить відносне.
Щодо окремих поля для товару і його оновлення в процессі лайкінгу/диз, то слушне зауваження, та я чомусь звик кожну сутність в окрему таблицю пхати, з перспективою масштабування, хоча це властивість товару і може спокійнісінько бути в його таблиці, якщо брати контекст шановного ТС, то додавши поля до товару, ми втрачаємо ідентифікацію, з якого відгуку який рейтинг був висланий, якщо воно і не потрібно, важливим є лише момент 1/0 до товару в момент написання відгуку, то ось приблизний алгоритм реалізації:
0. в таблицю product нашої бази додати 2-ва поля, з типом таблиці int, та довжиною значень до 9, думаю мільярдні лайки хватить:
ALTER TABLE `oc_product` ADD `likes` INT(9) NOT NULL DEFAULT '0' AFTER `viewed`;
ALTER TABLE `oc_product` ADD `dislikes` INT(9) NOT NULL DEFAULT '0' AFTER `likes`;
1. в самому контроллері товару додати публічний метод, котрий буде опрацьовувати прийнятий аргумент, та повертати відповідь/помилку:
public function addSympathy() {
$this->load->language('product/product');
$json = array();
if ($this->request->server['REQUEST_METHOD'] == 'POST') {
if (!isset($this->request->post['sympathy'])) {
$json['error'] = $this->language->get('error_no_sympathy');
}
if (!isset($json['error'])) {
$this->load->model('catalog/product');
$callback = $this->model_catalog_review->addSympathy($this->request->get['product_id'], $this->request->post['sympathy']);
if (!$callback) {
$json['success'] = $this->language->get('text_success');
} else {
$json['error'] = $this->language->get('text_error_like');
}
}
}
$this->response->addHeader('Content-Type: application/json');
$this->response->setOutput(json_encode($json));
}2. в моделі товару, реалізувати аналогічний метод, для додавання інфи в базу по ключу product_id:
public function addSympathy($product_id, $sympathy = '') {
if (empty($sympathy)) {
return true;
}
if ($sympathy == '0') {
$this->db->query("UPDATE " . DB_PREFIX . "product SET dislikes = (dislikes + 1) WHERE product_id = '" . (int)$product_id . "'");
} elseif ($sympathy == '1') {
$this->db->query("UPDATE " . DB_PREFIX . "product SET likes = (likes + 1) WHERE product_id = '" . (int)$product_id . "'");
}
return false;
}3. для вьюшки (tpl/twig) я б накидав приблизно ось такий скрипт (якщо користуєшся twig, то {{ product_id }}, якщо tpl, то <?php echo $product_id; ?>):
function addSympaty(like) {
$.ajax({
url: 'index.php?route=product/product/addSympathy&product_id={{ product_id }}',
type: 'post',
dataType: 'json',
data: 'sympathy=' + (typeof(like) != 'undefined' ? like : 0),
beforeSend: function() {
$('#button-like').button('loading');
},
complete: function() {
$('#button-like').button('reset');
},
success: function(json) {
$('.alert-dismissible').remove();
if (json['error']) {
$('#review').after('<div class="alert alert-danger alert-dismissible"><i class="fa fa-exclamation-circle"></i> ' + json['error'] + '</div>');
}
if (json['success']) {
$('#review').after('<div class="alert alert-success alert-dismissible"><i class="fa fa-check-circle"></i> ' + json['success'] + '</div>');
}
}
});
}4. додати в мовні файли локалізації товару 2-ві змінні типу:
$_['error_no_sympathy'] = 'Помилка відправки симпатії, оновіть сторінку!';
$_['text_error_like'] = 'Симпатія не врахована, спробуйте ще раз!';
$_['text_success_like'] = 'Дякуємо за Ваше вподобання, приємних покупок!';
5. навісити на кнопочки лайкінгу відповідні евенти:
для дизлайку:
addSympaty(0)для лайку:
addSympaty(1)перевірку на наявність пряника чи локального сховища вважаю непотрібною, оскільки метод лайкінку напряму зав'язаний на відправці рейтингу.