В Опенкарте есть отличный модуль, который называется «Рекомендуемые товары». С его помощью можно выводить произвольные товары в местах, предназначенных для модулей: в левой или правой боковой колонке, в верху или внизу сайта. Но иногда одного модуля рекомендуемых товаров бывает недостаточно. И эта статья как раз для такого случая.
Мы создадим дубликат данного расширения для Opencart 2.3. Принцип дублирования аналогичен и будет работать и на других версиях движка.
Создаём копию «Рекомендуемые товары»
Создавать копию модуля «Рекомендуемые товары» в Опенкарт 2.3 мы начнём с каталога (раздел catalog). Открываем папку по пути:
/site/catalog/view/theme/default/template/extension/module/
Здесь нас интересует файл featured.tpl — это как раз модуль рекомендуемых товаров. Создаём копию этого файла, назовём его featured_nov.tpl. Этим действием мы создаём файл, который будет отвечать за вывод товаров непосредственно на сайт. Изменений вносить в эту копию не нужно.
Далее, нам нужно задать языковые настройки. Переходим по пути:
/site/catalog/language/ru-ru/extension/module/
Здесь нужно создать копию файла featured.php. После копирования, переименовываем файл в featured_nov.php и открываем на редактирование. Здесь нужно изменить строку:
<span >$_[‘heading_title’] = ‘Рекомендуемые’;</span>
Можно написать, например, так:
<span >$_[‘heading_title’] = ‘Рекомендуемые (копия)’;</span>
— чтобы можно было различать модули в админке.
После внесения изменений — сохраняем и переходим к контроллеру.
Открываем файл /site/catalog/controller/extension/module/featured.php. Делаем его копию и называем её featured_nov.php. Открываем копию для редактирования и заменяем слово featured на featured_nov. Также, в самом начале файла ищем class ControllerExtensionModuleFeatured extends Controller и заменяем на class ControllerExtensionModuleFeaturedNov extends Controller.
В итоге должно получиться вот так (для Opencart 2.3, для других версий есть небольшие различия, но замену делать аналогично):
<span ><?php<br></span><span >class ControllerExtensionModuleFeaturedNov extends Controller {<br></span><span ><span style="white-space:pre"> </span>public function index($setting) {<br></span><span ><span style="white-space:pre"> </span>$this->load->language('extension/module/featured_nov');</span><span ><br></span><span ><span style="white-space:pre"> </span>$data['heading_title'] = $setting['name'];</span><span ><br></span><span ><span style="white-space:pre"> </span>$data['text_tax'] = $this->language->get('text_tax');</span><span ><br></span><span ><span style="white-space:pre"> </span>$data['button_cart'] = $this->language->get('button_cart');<br></span><span ><span style="white-space:pre"> </span>$data['button_wishlist'] = $this->language->get('button_wishlist');<br></span><span ><span style="white-space:pre"> </span>$data['button_compare'] = $this->language->get('button_compare');</span><span ><br></span><span ><span style="white-space:pre"> </span>$this->load->model('catalog/product');</span><span ><br></span><span ><span style="white-space:pre"> </span>$this->load->model('tool/image');</span><span ><br></span><span ><span style="white-space:pre"> </span>$data['products'] = array();</span><span ><br></span><span ><span style="white-space:pre"> </span>if (!$setting['limit']) {<br></span><span ><span style="white-space:pre"> </span>$setting['limit'] = 4;<br></span><span ><span style="white-space:pre"> </span>}</span><span ><br></span><span ><span style="white-space:pre"> </span>if (!empty($setting['product'])) {<br></span><span ><span style="white-space:pre"> </span>$products = array_slice($setting['product'], 0, (int)$setting['limit']);</span><span ><br></span><span ><span style="white-space:pre"> </span>foreach ($products as $product_id) {<br></span><span ><span style="white-space:pre"> </span>$product_info = $this->model_catalog_product->getProduct($product_id);</span><span ><br></span><span ><span style="white-space:pre"> </span>if ($product_info) {<br></span><span ><span style="white-space:pre"> </span>if ($product_info['image']) {<br></span><span ><span style="white-space:pre"> </span>$image = $this->model_tool_image->resize($product_info['image'], $setting['width'], $setting['height']);<br></span><span ><span style="white-space:pre"> </span>} else {<br></span><span ><span style="white-space:pre"> </span>$image = $this->model_tool_image->resize('placeholder.png', $setting['width'], $setting['height']);<br></span><span ><span style="white-space:pre"> </span>}</span><span ><br></span><span ><span style="white-space:pre"> </span>if ($this->customer->isLogged() ||!$this->config->get('config_customer_price')) {<br></span><span ><span style="white-space:pre"> </span>$price = $this->currency->format($this->tax->calculate($product_info['price'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);<br></span><span ><span style="white-space:pre"> </span>} else {<br></span><span ><span style="white-space:pre"> </span>$price = false;<br></span><span ><span style="white-space:pre"> </span>}</span><span ><br></span><span ><span style="white-space:pre"> </span>if ((float)$product_info['special']) {<br></span><span ><span style="white-space:pre"> </span>$special = $this->currency->format($this->tax->calculate($product_info['special'], $product_info['tax_class_id'], $this->config->get('config_tax')), $this->session->data['currency']);<br></span><span ><span style="white-space:pre"> </span>} else {<br></span><span ><span style="white-space:pre"> </span>$special = false;<br></span><span ><span style="white-space:pre"> </span>}</span><span ><br></span><span ><span style="white-space:pre"> </span>if ($this->config->get('config_tax')) {<br></span><span ><span style="white-space:pre"> </span>$tax = $this->currency->format((float)$product_info['special']? $product_info['special']: $product_info['price'], $this->session->data['currency']);<br></span><span ><span style="white-space:pre"> </span>} else {<br></span><span ><span style="white-space:pre"> </span>$tax = false;<br></span><span ><span style="white-space:pre"> </span>}</span><span ><br></span><span ><span style="white-space:pre"> </span>if ($this->config->get('config_review_status')) {<br></span><span ><span style="white-space:pre"> </span>$rating = $product_info['rating'];<br></span><span ><span style="white-space:pre"> </span>} else {<br></span><span ><span style="white-space:pre"> </span>$rating = false;<br></span><span ><span style="white-space:pre"> </span>}</span><span ><br></span><span ><span style="white-space:pre"> </span>$data['products'][] = array(<br></span><span ><span style="white-space:pre"> </span>'product_id' => $product_info['product_id'],<br></span><span ><span style="white-space:pre"> </span>'thumb' => $image,<br></span><span ><span style="white-space:pre"> </span>'name' => $product_info['name'],<br></span><span ><span style="white-space:pre"> </span>'description' => utf8_substr(strip_tags(html_entity_decode($product_info['description'], ENT_QUOTES, 'UTF-8')), 0, $this->config->get($this->config->get('config_theme'). '_product_description_length')). '..',<br></span><span ><span style="white-space:pre"> </span>'price' => $price,<br></span><span ><span style="white-space:pre"> </span>'special' => $special,<br></span><span ><span style="white-space:pre"> </span>'tax' => $tax,<br></span><span ><span style="white-space:pre"> </span>'rating' => $rating,<br></span><span ><span style="white-space:pre"> </span>'href' => $this->url->link('product/product', 'product_id='. $product_info['product_id'])<br></span><span ><span style="white-space:pre"> </span>);<br></span><span ><span style="white-space:pre"> </span>}<br></span><span ><span style="white-space:pre"> </span>}<br></span><span ><span style="white-space:pre"> </span>}</span><span ><br></span><span ><span style="white-space:pre"> </span>if ($data['products']) {<br></span><span ><span style="white-space:pre"> </span>return $this->load->view('extension/module/featured_nov', $data);<br></span><span ><span style="white-space:pre"> </span>}<br></span><span ><span style="white-space:pre"> </span>}<br></span><span >}</span><span >class ControllerExtensionModuleFeaturedNov extends Controller</span>
Всего в файле три замены: 1 — название контроллера, 2,3 — текст.
На этом работы с разделом catalog — закончены, переходим к разделу admin.
Создаём копии в папке Admin
Начнём с View. Создаём копию файла /site/admin/view/template/extension/module/featured.tpl, называем её featured_nov.tpl. Можно не заменять, но на всякий случай заменяем все слова featured на featured_nov в содержимом созданной нами копии. Всего в этом файле будет 7 замен. Сохраняем.
Открываем языковые файлы /site/admin/language/ru-ru/extension/module/featured.php, копируем в featured_nov.php, редактируем — вместо $_[‘heading_title’] = ‘Рекомендуемые’ пишем $_[‘heading_title’] = ‘Рекомендуемые (копия)’, сохраняем.
Переходим к контроллеру. Открываем /site/admin/controller/extension/module/featured.php, дублируем в featured_nov.php и начинаем редактировать:
<span >class ControllerExtensionModuleFeatured extends Controller</span>
заменяем на:
<span >class ControllerExtensionModuleFeaturedNov extends Controller</span>
- заменяем featured на featured_nov — будет 8 замен
- сохраняем изменения
Тестируем и используем дубликат модуля «Рекомендуемые товары»
Итак, все действия по созданию дубликата модуля «Рекомендуемые товары» выполнены, переходим к тестированию и использованию нашего творения. Первым делом — очищаем кэш системы и кэш дополнений. Переходим в раздел «Дополнения» — «Дополнения» — «модули». Здесь мы видим созданную копию:
Устанавливаем модуль, делаем необходимые настройки, включаем и выводим где нужно. Всё! Тем самым мы легко и просто создали ещё один модуль с произвольным набором товаров в Опенкарт!