Количество просмотров товара

Правила раздела: faq.php?mode=okay
Модератор: Модераторы

MotoR4ik
MotoR4ik
Репутация: 3
Сообщения: 14
Зарегистрирован: 06.08.2019
С нами: 2 месяца 11 дней

Сообщение #21 MotoR4ik » 07.08.2019, 08:16

korshunov, Это проверял сразу, нашел ошибку, случайно допустил ее, и возился 2 часа. Позже выложу более развернутою инструкцию.

Добавлено спустя 3 часа 37 минут:
И так рабочее решения по внедрению просмотров:

в api/Products.php

Спойлер
/*Выборка всех товаров*/
public function get_products($filter = array(), $count = false) {
// По умолчанию
$limit = 100;
$page = 1;
$joins = '';
$where = '1';
$group_by = '';
$order = 'p.position DESC';
$lang_sql = $this->languages->get_query(array('object'=>'product'));
$select = "DISTINCT
p.id,
p.url,
p.brand_id,
p.position,
p.created as created,
p.visible,
p.featured,
p.rating,
p.votes,
p.views as views,
p.last_modify,
p.main_category_id,
p.main_image_id,
$lang_sql->fields";
Спойлер
if(!empty($filter['sort'])) {
switch ($filter['sort']) {
case 'rand':
$order = 'RAND()';
break;
case 'position':
$order = 'p.position DESC';
break;
case 'name':
$order = 'p.name ASC';
break;
case 'name_desc':
$order = 'p.name DESC';
break;
case 'rating':
$order = 'p.rating ASC';
break;
case 'rating_desc':
$order = 'p.rating DESC';
break;
case 'views':
$order = 'p.views ASC';
break;
case 'views_desc':
$order = 'p.views DESC';
break;

case 'created':
$order = 'p.created DESC';
break;
case 'price':


Спойлер
/*Выборка конкретного товара*/
public function get_product($id) {
if (empty($id)) {
return false;
}
if(is_int($id)) {
$filter = $this->db->placehold('AND p.id = ?', $id);
} else {
$filter = $this->db->placehold('AND p.url = ?', $id);
}

$lang_sql = $this->languages->get_query(array('object'=>'product'));
$query = "SELECT DISTINCT
p.id,
p.url,
p.brand_id,
p.position,
p.created as created,
p.visible,
p.featured,
p.rating,
p.votes,
p.views as views,
p.last_modify,
p.main_category_id,
p.main_image_id,
$lang_sql->fields
FROM __products AS p
$lang_sql->join
WHERE
1
$filter
GROUP BY p.id
LIMIT 1
";

Код для добавления просмотров:
Спойлер
/*Обновление товара*/

public function update_product($id, $product) {
$product = (object)$product;
$result = $this->languages->get_description($product, 'product');


$query = $this->db->placehold("UPDATE __products SET ?%, last_modify=NOW() WHERE id in (?@) LIMIT ?", $product, (array)$id, count((array)$id));
if($this->db->query($query)) {
if(!empty($result->description)) {
$this->languages->action_description($id, $result->description, 'product', $this->languages->lang_id());
}
return $id;

} else {
return false;

}
}
public function update_views($id)
{
$this->db->query("UPDATE __products SET views=views+1 WHERE id=?", $id);
return true;

}

В БД выполням такой запрос:

Код: Выделить всё

ALTER TABLE `ok_products` ADD `views` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `featured`


В view/ProductView.php добавляем так как указано в шапке.

Код: Выделить всё

if($product->visible && empty($_SESSION['admin']))
$this->products->update_views($product->id);


В нужном вам месте в шаблоне добавляем код:

Код: Выделить всё

 <small class="views_block">Просмотров: <span class="views_counts">{$product->views}</span></small>


Ну и по желанию в css:

Код: Выделить всё

.views_block
{
   color: black;
    background: #ebf0f9;
    padding: 5px 0px 2px 3px;
    font-size: 15px;
    border-radius: 5px;
   
}
.views_counts
{
    color: black;
    background: #eebf20;
    padding: 5px 7px 2px 5px;
    border-radius: 0px 5px 5px 0px;
    font-weight: bold;
}


Учтите что если просматривайте товары под админом, просмотры не считаются.
Получится вот так:
Изображение


Название раздела: Полезные решения для OkayCMS
Правила раздела: faq.php?mode=okay

Быстрый ответ


Введите код в точности так, как вы его видите. Регистр символов не имеет значения.
Код подтверждения

   

Вернуться в «Полезные решения для OkayCMS»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 1 гость