Сообщение #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;
}
Учтите что если просматривайте товары под админом, просмотры не считаются.
Получится вот так:
[b]korshunov[/b], Это проверял сразу, нашел ошибку, случайно допустил ее, и возился 2 часа. Позже выложу более развернутою инструкцию.
И так рабочее решения по внедрению просмотров:
в api/Products.php
[spoiler]/*Выборка всех товаров*/
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,
[b]p.views as views,[/b]
p.last_modify,
p.main_category_id,
p.main_image_id,
$lang_sql->fields";
[/spoiler]
[spoiler]
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;
[b]case 'views':
$order = 'p.views ASC';
break;
case 'views_desc':
$order = 'p.views DESC';
break;[/b]
case 'created':
$order = 'p.created DESC';
break;
case 'price':[/spoiler]
[spoiler]/*Выборка конкретного товара*/
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,
[b]p.views as views,[/b]
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
";[/spoiler]
Код для добавления просмотров:
[spoiler]/*Обновление товара*/
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;
}
}
[b]public function update_views($id)
{
$this->db->query("UPDATE __products SET views=views+1 WHERE id=?", $id);
return true;[/b]
}[/spoiler]
В БД выполням такой запрос:
[code]ALTER TABLE `ok_products` ADD `views` INT( 10 ) UNSIGNED NOT NULL DEFAULT '0' AFTER `featured`[/code]
В [b]view/ProductView.php[/b] добавляем так как указано в шапке.
[code]if($product->visible && empty($_SESSION['admin']))
$this->products->update_views($product->id);[/code]
В нужном вам месте в шаблоне добавляем код:
[code] <small class="views_block">Просмотров: <span class="views_counts">{$product->views}</span></small>[/code]
Ну и по желанию в css:
[code].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;
}[/code]
Учтите что если просматривайте товары под админом, просмотры не считаются.
Получится вот так:
[url=https://imgbb.com/][img]https://i.ibb.co/hd0F9gH/image.png[/img][/url]