OpenCart — Вывод случайного товара

Добрый день, уважаемые читатели!

Сегодня я хочу рассказать вам о том, как вывести случайный товар в OpenCart.

У меня стояла задача вывести название товара над поиском (как пример в Яндексе) и по клику переносить в строку поиска.

Начнем с того, что создадим функцию в модели продуктов

/catalog/model/catalog/product.php


public function getRandomProduct() {

$offset_result = $this->db->query("SELECT FLOOR(RAND() * COUNT(*)) AS `offset` FROM `" . DB_PREFIX . "product_description`");
 $offset = $offset_result->row['offset'];
 $query = $this->db->query("
 SELECT * FROM `" . DB_PREFIX . "product_description` as `t1`
 LEFT JOIN `product` as `t2` ON (`t1`.`product_id` = `t2`.`product_id`)
 WHERE `t2`.`quantity` > 0
 LIMIT $offset, 1 " );

return $query->row;

}

Выборку мы делаем поэтапно (данное решение взято с этого сайта)

1. Мы выбираем максимальное количество товаров (n) и берем случайный ID. Т.к. ID берется из диапазона от 1 до n, то возможно, что такого ID и не существует в БД (например, если вы удалили товар — на этот случай мы сделаем проверку в контроллере).

2. Потом мы делаем следующий запрос: выбираем товар по полученному ID из первого шага, добавляем условие «количество должно быть больше нуля».

3. Последним шагом возвращаем результат.

Теперь переходим к контроллеру

/catalog/controller/common/header.php

ищем там


$this->children = array(
 'module/language',
 'module/currency',
 'module/cart'
 );

и перед ним вставляем наш код:


// получаем случайный товар
 $random_product = $this->model_catalog_product->getRandomProduct();
 if(!empty($random_product['name'])) {
 $this->data['random_product']['name'] = $random_product['name'];
 $this->data['random_product']['model'] = $random_product['model'];
 } else {
 $this->data['random_product']['name'] = 'Название товара';
 $this->data['random_product']['model'] = 'Модель';
 }

Проверка на правильность выборки происходит путем сравнения строки !empty($random_product[‘name’]) — если она пустая, то выборка не прошла и я принудительно присваиваю название товара и его модель, но вообще можно делать выборку до тех пор, пока она не сработает (через do { … } while(), например).

Далее идем в отображение и немного переделываем вид под строку с названием случайного товара


<div class="search">
 <div class="example">Например, <a style="cursor: pointer;" onclick="<strong>$('#search-field')</strong>.val(this.title)" title="<?php echo $random_product['model']; ?>"><?php echo $random_product['name']; ?></a></div>
 <input type="text"<strong> id="search-field"</strong> name="filter_name" value="<?php echo $filter_name; ?>" class="input-medium" placeholder="Поиск..." />
 <button id="button-search" class="btn"><img src="<?php echo HTTP_SERVER; ?>catalog/view/theme/<strong>{THEME_NAME}</strong>/image/search.png" alt="Поиск" /></button>
 </div>

При нажатии на ссылку, в поле поиска будет вставляться модель товара (почему модель? потому что OpenCart лучше ищет совпадение именно по модели, если же вы хотите, чтобы он искал все возможные товары, то в строке


<div>Например, <a style="cursor: pointer;" onclick="<strong>$('#search-field')</strong>.val(this.title)" title="<?php echo $random_product['model']; ?>">

замените

<?php echo $random_product[‘model’]; ?>

на

<?php echo $random_product[‘name’]; ?>

На этом все! Данный исходный код вы можете использовать для написания других модулей, связанных с выводом случайных товаров!

One comment

Leave a Reply