From 6a847ab7b5c704eff900547083eb7f643bbe38f5 Mon Sep 17 00:00:00 2001 From: Konstantin Date: Sat, 30 May 2026 14:59:49 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A0=D0=B5=D0=BA=D0=BE=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D0=B4=D1=83=D0=B5=D0=BC=D1=8B=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/extension/module/featured.php | 21 ++++++++++ .../ru-ru/extension/module/featured.php | 4 ++ public/admin/model/catalog/product.php | 14 +++++++ .../template/extension/module/featured.twig | 41 +++++++++++++++++++ 4 files changed, 80 insertions(+) diff --git a/public/admin/controller/extension/module/featured.php b/public/admin/controller/extension/module/featured.php index 21a0835..3450d16 100644 --- a/public/admin/controller/extension/module/featured.php +++ b/public/admin/controller/extension/module/featured.php @@ -156,6 +156,27 @@ class ControllerExtensionModuleFeatured extends Controller { $this->response->setOutput($this->load->view('extension/module/featured', $data)); } + public function random() { + $json = array(); + + $this->load->model('catalog/product'); + + $limit = isset($this->request->get['limit']) ? (int)$this->request->get['limit'] : 5; + $exclude = isset($this->request->get['exclude']) ? $this->request->get['exclude'] : array(); + + $results = $this->model_catalog_product->getRandomProducts($limit, $exclude); + + foreach ($results as $result) { + $json[] = array( + 'product_id' => $result['product_id'], + 'name' => html_entity_decode($result['name'], ENT_QUOTES, 'UTF-8') + ); + } + + $this->response->addHeader('Content-Type: application/json'); + $this->response->setOutput(json_encode($json)); + } + protected function validate() { if (!$this->user->hasPermission('modify', 'extension/module/featured')) { $this->error['warning'] = $this->language->get('error_permission'); diff --git a/public/admin/language/ru-ru/extension/module/featured.php b/public/admin/language/ru-ru/extension/module/featured.php index 3928a41..a3afad2 100644 --- a/public/admin/language/ru-ru/extension/module/featured.php +++ b/public/admin/language/ru-ru/extension/module/featured.php @@ -13,11 +13,15 @@ $_['text_edit'] = 'Редактирование'; // Entry $_['entry_name'] = 'Название модуля'; $_['entry_product'] = 'Товары'; +$_['entry_random'] = 'Случайные товары'; $_['entry_limit'] = 'Лимит'; $_['entry_width'] = 'Ширина'; $_['entry_height'] = 'Высота'; $_['entry_status'] = 'Статус'; +// Button +$_['button_random'] = 'Добавить случайные'; + // Help $_['help_product'] = '(Автозаполнение)'; diff --git a/public/admin/model/catalog/product.php b/public/admin/model/catalog/product.php index fb62f3f..1b3e6c9 100644 --- a/public/admin/model/catalog/product.php +++ b/public/admin/model/catalog/product.php @@ -924,6 +924,20 @@ class ModelCatalogProduct extends Model { return $query->row['total']; } + public function getRandomProducts($limit = 5, $exclude = array()) { + $sql = "SELECT p.product_id, pd.name FROM " . DB_PREFIX . "product p LEFT JOIN " . DB_PREFIX . "product_description pd ON (p.product_id = pd.product_id) WHERE pd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1'"; + + if (!empty($exclude)) { + $sql .= " AND p.product_id NOT IN (" . implode(',', array_map('intval', $exclude)) . ")"; + } + + $sql .= " ORDER BY RAND() LIMIT " . (int)$limit; + + $query = $this->db->query($sql); + + return $query->rows; + } + public function getTotalProductsByLayoutId($layout_id) { $query = $this->db->query("SELECT COUNT(*) AS total FROM " . DB_PREFIX . "product_to_layout WHERE layout_id = '" . (int)$layout_id . "'"); diff --git a/public/admin/view/template/extension/module/featured.twig b/public/admin/view/template/extension/module/featured.twig index b299f60..d6df738 100644 --- a/public/admin/view/template/extension/module/featured.twig +++ b/public/admin/view/template/extension/module/featured.twig @@ -47,6 +47,17 @@ +
+ +
+
+ + + + +
+
+
@@ -123,5 +134,35 @@ $('input[name=\'product_name\']').autocomplete({ $('#featured-product').delegate('.fa-minus-circle', 'click', function() { $(this).parent().remove(); }); + +$('#button-random').on('click', function() { + var limit = parseInt($('#input-random').val()) || 5; + var exclude = []; + + $('#featured-product input[name=\'product[]\']').each(function() { + exclude.push($(this).val()); + }); + + $.ajax({ + url: 'index.php?route=extension/module/featured/random&user_token={{ user_token }}&limit=' + limit, + type: 'GET', + dataType: 'json', + traditional: true, + data: { exclude: exclude }, + beforeSend: function() { + $('#button-random').button('loading'); + }, + complete: function() { + $('#button-random').button('reset'); + }, + success: function(json) { + $.each(json, function(i, item) { + $('#featured-product' + item['product_id']).remove(); + $('#featured-product').append(''); + }); + $('#featured-product div input').before(' '); + } + }); +}); //-->
{{ footer }}