Как сделать меню слева opencart

Обновлено: 08.07.2024

Frontend / Backend developer

Модули в Opencart: разбираемся в основах

В этой статье разберёмся с основами системы модулей в популярном e-commerce движке Opencart и напишем простой модуль.

Данная статья не рассматривает OCmod/VQmod, здесь мы поговорим об основах и напишем несложный модуль.

Движок Opencart — это довольно успешный opensource проект на ниве e-commerce решений. Думаю, успех его достигнут, не в последнюю очередь, благодаря экстремально простой архитектуре, заложенной в движок ещё в первых версиях.

По сути, мы имеем MVC+L архитектуру — это уже, практически стандартный, в индустрии Model-View-Controller и Language (не знаю почему, но систему перевода выделяют в отдельную букву).

Движок предоставляет два отдельных интерфейса — admin и catalog, соответственно бэкенд/фронтенд сайта (по старым до_javascript_frontend_development понятиям), т.е. это два отдельных приложения в одном, и большую часть всех манипуляций вы, как разработчик, будет проводить именно там.

Каталог system в корневой директории содержит все вспомогательные элементы Opencart, его базовый код, а также набор библиотек (system/library), куда вы можете добавлять необходимые для работы библиотеки.

Обратите внимание

На данный момент, в дикой природе существуют и функционируют три основные версии Opencart — 1.5.6, 2.3, 3.0.2.0.

Между этими версиями существуют некоторые различия, о которых мы поговорим в следующей статье, но сейчас будем рассматривать всё со стороны наиболее популярной версии 2.3.

Реестр Opencart (Registry)

Реестр в Opencart, это основа основ всего в этом движке, он представляет собой реализацию Dependency Injection паттерна и агрегирует в себе всё, что вы используете стандартными способами. Мы детально рассмотрим внутреннюю кухню Opencart в одной из следующих статей, а пока просто примем тот факт, что вокруг registry построено всё в Opencart — от загрузчика до контроллеров.

Проксирование (Proxy)

Прокси устроен достаточно просто — все методы проксируемого объекта копируются в объект прокси. В классе реализованы магические методы __set, __get, __call, определяющие поведение объекта (отличий от стандартного поведения фактически никакого), сама концепция прокси, вероятно, внедрена исключительно для поддержки моделями event handler системы (в Opencart 1.5 этой концепции не было, как и Proxy).

Opencart использует проксирование ТОЛЬКО для моделей.

Танцы с Proxy

Загрузчик Opencart передаёт в Proxy ТОЛЬКО методы!

Это может сыграть с вами злую шутку, если вы хотите использовать предопределённые переменные класса или объекта, через self/$this.

Поскольку проксированный объект использует __get/__set завязанные на Registry, вы не сможете получить доступ к своим изначальным переменным в классе нигде, за исключением конструктора!

Загрузчик классов

Opencart использует собственный загрузчик классов — хоть это и возможно, но не рекомендуется прямое подключение PHP файлов (include/require), что налагает свои требования по именованию классов.

Этот загрузчик устроен довольно просто — он предоставляет несколько методов для реализации разного поведения, при загрузке разных типов классов, например метод controller попытается выполнить метод контроллера по переданному роуту, словно его запрашивает пользователь:

А вот при загрузке модели — она просто будет проксирована и добавлена в Registry:

view — попытается отрендерить представление, language загружает языковой пакет, library — загружает и инициализирует библиотеку подобно модели, но без префиксов (system/library/*), helper подключит скрипт с вспомогательными функциями (system/helper)

Директории модуля

Директории модуля полностью повторяют директории сайта — Opencart просто поместит ваши файлы внутрь себя. Это означает что вы можете устанавливать ocmod.zip файлы через установщик, или просто копировать файлы модулей в соответствующие директории сайта.

Пример модуля

Давайте напишем простенький модуль под названием "example".

Наш модуль не будет делать ничего особенного, всего лишь выводить текст "Hello from example module" в том месте, куда вы его вставите в настройках шаблонов (дизайн → макеты).

Для этого нам необходимо подготовить следующую иерархию каталогов:

В этом примере мы опустим использование моделей и вернёмся к ним в следующей статье, когда попытаемся сделать что-то поинтереснее.

Bash tip:

В bash, для быстрой генерации этих каталогов вы можете воспользоваться такой командой:

Эта команда сгенерирует набор директорий указанный слева.

В моём блоге вы можете найти bash функцию для удобной генерации структуры директорий для модуля Opencart.

Обратите внимание!

Если вы собираетесь распространять модуль в виде ocmod.zip файла — корневым каталогом в архиве должен быть upload!

Административная часть или бэкенд модуля

Переводы

Переводы Opencart хранятся в каталоге languages, они довольно примитивны и представляют собой PHP файлы содержащие массив $_. В этом массиве прописываются ключи-значения, и, собственно, всё!

В каждой языковой директории имеется файл с названием кода языка (например, languages/ru-ru/ru-ru.php), в котором содержатся общесистемные переводы, а также региональные настройки.

Обратите внимание!

Языковой загрузчик Opencart работает по принципу замещения подгруженных ранее переводов, поэтому вам нет необходимости подключать или перезаписывать системные переводы.

Каждый модуль Opencart должен обладать одноимённым файлом переводов, в котором необходимо наличие секции heading_title, значение этой секции используется для вывода названия модуля в списке модулей:

Обратите внимание!

В случае отсутствия этой секции, вы рискуете получить дублирующиеся имена модулей в списке, а в случае отсутствия языкового файла модуля — ошибку PHP!

Контроллер

Настало время разработки контроллера для админки. Для этого создадим файл example.php в директории admin/controller/extension/module:

Обратите внимание на префикс ControllerExtensionModule в названии нашего класса — Controller даёт загрузчику понять что он имеет дело с контроллером, ExtensionModule — что класс лежит в директории extension/module.

Все ваши контроллеры и модели обязаны придерживаться этого правила наименования, иначе загрузчик попросту не сможет подключить ваши классы!

Теперь давайте создадим свой action с названием index. Этот метод можно считать входной функцией модуля (как функция main в C):

Как видите, Opencart помимо готовых переводов, предоставляет также и несколько общих контроллеров, которые используются для добавления интерфейсных частей вроде шапки и подвала.

Эти контроллеры отличаются тем, что не выводят результат рендеринга в Response, а просто возвращают подготовленный view (return $this->load->view. ). Чуть позже мы будем использовать эту концепцию при разработке фронтенд контроллера.

Представление или шаблон

Opencart не использовал внешних шаблонизаторов вплоть до третьей версии (там прикрутили twig), и по сути шаблоны, это такая мешанина html + php.

У такой связки есть только один минус — она позволяет говнокодить и использовать php в шаблоне не по назначению.

Давайте создадим шаблон для нашего модуля — view/template/extension/module/example.tpl:

Отлично!

Административная часть модуля готова, давайте протестируем её. Для этого можно пойти двумя путями.

  1. Традиционный способ, унаследованный из первых версий движка: просто копируем содержимое папки upload в корень установленного Opencart
  2. Более удобный для дистрибуции: упаковываем папку upload в ZIP архив с названием .ocmod.zip и устанавливаем модуль штатным установщиком Opencart.

Во время разработки более удобен способ с простым копированием файлов, однако, распространять свой модуль лучше всего в виде *.ocmod.zip файла.

Bash tip:

Для удобного и быстрого копирования всех файлов нашего модуля в движок, можно воспользоваться командой rsync:

А для быстрого создания нужного нам архива можно воспользоваться консольной версией zip:

После того как модуль будет внедрён одним из способов в систему, нужно его установить (находим его в разделе "дополнения/дополнения" и кликаем по зелёной кнопке установки). Кроме того, поскольку наш модуль подразумевает возможность вставки через интерфейс настройки шаблонов, нужно его активировать (переходим в редактирование модуля и выбираем статус "включено"):

На заметку

Управление статусом нужно только тем модулям, которые можно встраивать через макеты. В обратном случае вовсе необязательно вообще реализовывать поддержку статуса.

Как только мы включили модуль, он становится доступен для выбора в настройках макетов. Теперь мы с лёгкостью можем добавить его на сайт:

Однако, сейчас вы не увидите никаких изменений на странице, поскольку мы не написали ни строки управляющего кода для фронтенд части (catalog).

Концептуальной разницы между admin/catalog частями модуля почти нет, стоит только упомянуть, что в панели администрирования нет такого понятия как "тема" — там все представления располагаются сразу в папке template.

Фронтендная часть модуля подразумевает такую структуру файлов представления: view/theme/default/template/extension/module.

Обратите внимание!

Всегда создавайте стандартные шаблоны модуля в теме default. Эта тема всегда присутствует в Opencart, поэтому у вас не возникнет проблем с дистрибуцией шаблонов. Кроме того, далее мы увидим как можно дать пользователям модуля возможность кастомизировать их на уровне темы.

Пользовательская часть (или фронтенд)

Контроллер

Помните, я упоминал контроллеры, которые возвращают отрендеренные шаблоны, а не устанавливают их в объект Response?

Для фронтенда мы воспользуемся именно таким способом вывода содержимого − catalog/controller/extension/module/example.php:

При выводе модуля, прикреплённого в макете, Opencart вызывает индексный экшн (метод index). В нём мы проверяем — существует-ли кастомное представление в текущей теме сайта ($this->config->get('config_template')), и если существует, то оно и будет загружено, если нет, то будет использовано представление из темы default.

Таким образом мы позволяем пользователям нашего модуля гибко изменять шаблоны модуля согласно своим требованиям.

А вот и наше стандартное представление − catalog/view/theme/default/template/extension/module/example.tpl:

Когда вы запакуете и установите обновлённую версию нашего модуля, то получите что−то в таком духе:

Подведём итог

Мы разработали абсолютно бесполезный, но собственный модуль для Opencart 2. Рассмотрели базовые принципы разработки и некоторые подводные камни.

В следующей статье я планирую рассказать о системе OCmod/VQmod, показать что это, зачем и как использовать.

Помните — Opencart это свободное программное обеспечение, поэтому вы можете самостоятельно изучать и модифицировать его в своих целях.

Из этого туториала Вы узнаете, как работать с верхним меню в шаблонах OpenCart.

Давайте удалим элемент меню Список желаний (Wish List). Откройте файл \catalog\view\theme\themeXXX\template\common\ header .tpl в вашем редакторе. Найдите код со структурой, похожей на такую:

Перейдите на вкладку Расширения -> Модификации (Extensions -> Modifications). Найдите модификацию TemplateMonster header и выберите её. Удалите модификацию.

Перейдите в Установщик расширений (Extension Installer). Загрузите модификацию с обновлённым хедером.

Обновите модификации (Refresh modifications) в разделе Расширения -> Модификации (Extensions -> Modification).

В нашем случае текст Корзина ( Shopping cart ) можно изменить напрямую в языковом файле. Откройте файл \catalog\language\en-gb\common\ header .php (путь к файлу зависит от языка) в вашем редакторе. Измените текст. Сохраните изменения и загрузите изменённый файл.

Перейдите на вкладку Расширения -> Модификации (Extensions -> Modifications) и обновите модификации. Обновите страницу.

Мы изменили название Корзина ( Shopping Cart ).

Вы можете также ознакомиться с детальным видео-туториалом ниже:

Эта запись была размещена в OpenCart туториалы и помечена как menus, Opencart2, top menu. Добавьте в закладки постоянную ссылку.

Похожие записи

This tutorial will show you how to create a new product in OpenCart 2.x.

Из этого туториала Вы узнаете, как добавить социальные иконки в хедер/футер сайта.

Из этого туториала Вы узнаете, как создать и работать с Подарочными сертификатами в OpenCart 2.x.

Submit a ticket


opencart

Всем привет, и снова сегодняшняя моя статья будет про CMS Opencart 3

я решил дополнить предыдущую статью в которой я рассказывал как отредактировать ссылки в блоке личный кабинет а, сегодня будет тоже про стандартный блок ссылок Информация в Opencart3

Загвоздка заключается только в том, что данный блок ссылок формируется автоматические кроме ссылок Связаться с нами и Карта сайта, все остальные ссылки подтягиваются из блока статьи:

Как отредактировать блок меню Информация?

для примера мы создали статью, и даже не ставили галку что бы она отображалась в футере, но на сайте наша тестовая статья в блоке Информация уже весит )

Как отредактировать блок меню Информация?

Я пошел искать код который отвечает за вывод этой информации в этом нам поможет наш любый тотал коммандер:

в итоге, блок Информация управляется в opencart3 через файл information.php который находится по след пути:

/ catalog / controller / extension / module/information.php

в котором вот такой код:

foreach ($this->model_catalog_information->getInformations() as $result) $data[‘informations’][] = array(
‘title’ => $result[‘title’],
‘href’ => $this->url->link(‘information/information’, ‘information_id=’ . $result[‘information_id’])
);
>

$data[‘contact’] = $this->url->link(‘information/contact’);
$data[‘sitemap’] = $this->url->link(‘information/sitemap’);

return $this->load->view(‘extension/module/information’, $data);
>
>

сразу видим в конце файла ссылки на контакты и карту сайта, мы нашли его!

Теперь надо разобраться и понять как он выводит статьи, из кода видно что он просто по дефолту сразу все пихает без какого ли бо фильтра.

В итоге решил сделать так, поставить фильтр на след условие, если у статьи будет стоять сортировка со значением -1 (можно поставить любую цифру, просто -1 сразу бросается в глаза и с ней не запутаешься) то такие статьи не будут выводится.

Для этого делаем небольшую модификацию файла

foreach ($this->model_catalog_information->getInformations() as $result) $data[‘informations’][] = array(
‘title’ => $result[‘title’],
‘href’ => $this->url->link(‘information/information’, ‘information_id=’ . $result[‘information_id’])
);
>

заменяем на этот код

foreach ($this->model_catalog_information->getInformations() as $result) if ($result[‘sort_order’] != ‘-1’) $data[‘informations’][] = array(
‘title’ => $result[‘title’],
‘href’ => $this->url->link(‘information/information’, ‘information_id=’ . $result[‘information_id’])
);
>

на выходе получаем следующие

Как отредактировать блок меню Информация?

и на сайте вуаля нет ни намека на то что есть эта статья

Как отредактировать блок меню Информация?

Вот таким нетривиальным способом мы решили данную проблему! Надеюсь кому то была полезна мой статья. Если будут вопросы задавайте постараюсь помочь!

Нужны новые клиенты? Тогда Вам рекомендуем посмотреть этот раздел нашего сайта
_____


Если появилась необходимость сделать собственные ссылки в дефолтной теме опенкарта 3.0 то можно это реализовать через админку сайта, в разделе дизайн/редактор шаблона/menu.twig. Единственный момент для работы с редактором это необходимость после сохранения файла заходить, например, в другой раздел админки чтобы изменения принялись движком и отразились на сайте.

Проблема в работе модуля заказ и регистрация. Opencart.

Само изменение меню можно провести следующим образом:

1. В админке опекарта заходите в каталог/категории и создаете новую категорию незабыв поставить галочку главное меню. В нашем случае это будет категория “Удача”

3. Для этогу заходим в редактор шаблонов и находим файл (в common) menu.twig.

4. Находим строку

и изменяете на допустим

Чтобы последующие разделы меню также имели переход по заданной вами ссылки вы можете под строкой описанной в п. 4. вставить любые необходимые вам строки с ссылками на нужные вам места сайта.

P.S. Часто бывает что файлы не сохраняются на фтп либо помещаются вне папки сайта, что приводит к невозможности редактирования как отдельных файлов сайта, так и сайта целиком. Для исправления ситуации необходимо в админке опенкарта 3.0 зайти в панель состояния – найти значок настройки (правый верхний угол) – выключить кэширование темы. Это позволит менять структурные файлы сайта напрямую через фтп.

Если вашему сайту необходима помощь специалиста по настройке модулей движка вашего сайта или вопросы по созданию новых модулей вы можете обратиться к нам. У нас большой опыт в работе с сайтами.


То где удилище, файл прикрепил в рар формате, иначе ошибку вызывает
У Вас недостаточно прав для скачивания файлов.


Вернул вам файл. В нем смотрите как я вставил ссылки. Незабывайте сохранять в UTF-8 (без BOM)
У Вас недостаточно прав для скачивания файлов.

admin (15.06.2012, 09:19) писал: Вернул вам файл. В нем смотрите как я вставил ссылки. Незабывайте сохранять в UTF-8 (без BOM)
У Вас недостаточно прав для скачивания файлов.

Добрый день!
А можете подсказать, как вообще в OpenCart отключить главное меню категорий?
Т.к. модулем меню категорий планируется выводить в боковой панеле, а в главном меню весь перечень Категорий не умещается.
Для создания магазина использую вашу последнюю сборку с сайта.


Jenya495 (05.07.2012, 15:06) писал: Добрый день!
А можете подсказать, как вообще в OpenCart отключить главное меню категорий?
Т.к. модулем меню категорий планируется выводить в боковой панеле, а в главном меню весь перечень Категорий не умещается.
Для создания магазина использую вашу последнюю сборку с сайта.


Удалить верхнее меню можно, но не красиво будет. Если же у вас много категорий и чтобы они все умещались, для этого необязательно удалять меню, вам нужно определить какие категории наиболее важны и оставьте их в верхнем меню, а для остальных уберите галочку "Показывать в главном меню" при редактировании категорий в админке.

admin (05.07.2012, 18:48) писал:

Jenya495 (05.07.2012, 15:06) писал: Добрый день!
А можете подсказать, как вообще в OpenCart отключить главное меню категорий?
Т.к. модулем меню категорий планируется выводить в боковой панеле, а в главном меню весь перечень Категорий не умещается.
Для создания магазина использую вашу последнюю сборку с сайта.


Удалить верхнее меню можно, но не красиво будет. Если же у вас много категорий и чтобы они все умещались, для этого необязательно удалять меню, вам нужно определить какие категории наиболее важны и оставьте их в верхнем меню, а для остальных уберите галочку "Показывать в главном меню" при редактировании категорий в админке.

А можно установить какой то модуль, что бы выводил вместо данного меню другое? Или как вместо данного меню создать свое?

Читайте также: