Продолжение серии о создании меню в OpenCart

Продолжение серии о создании меню в OpenCart

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

Основные виды меню в OpenCart

Прежде чем погрузиться в детали создания и настройки меню, стоит рассмотреть основные виды меню, которые можно встретить в OpenCart:

  • Главное меню
  • Меню категорий
  • Верхнее меню
  • Нижнее меню (футер)
  • Боковое меню
  • Мега-меню

Каждый из этих видов меню имеет свои особенности и предназначение. Рассмотрим их подробнее.

Главное меню: структура и настройка

Главное меню является основным навигационным элементом сайта. Оно обычно располагается в верхней части страницы и содержит ссылки на основные разделы магазина.

Для создания главного меню в OpenCart необходимо выполнить следующие шаги:

  1. Войти в панель администратора
  2. Перейти в раздел «Дизайн» > «Макеты»
  3. Выбрать макет «Главная страница»
  4. Добавить модуль «Меню» в нужную позицию
  5. Настроить параметры меню

При настройке главного меню важно учитывать следующие аспекты:

  • Оптимальное количество пунктов (не более 7-8)
  • Логичная структура и группировка пунктов
  • Использование понятных и краткий названий
  • Правильное расположение на странице

Меню категорий: особенности и оптимизация

Меню категорий играет ключевую роль в навигации по товарам интернет-магазина. Оно обычно располагается в боковой колонке или в виде выпадающего списка в главном меню.

Для оптимизации меню категорий рекомендуется:

  • Создать четкую иерархию категорий
  • Использовать информативные названия
  • Ограничить глубину вложенности (не более 3-4 уровней)
  • Добавить иконки или миниатюры для визуального восприятия
  • Настроить сортировку категорий по популярности или алфавиту

Верхнее меню: функциональность и дизайн

Верхнее меню часто используется для размещения дополнительных ссылок или функций, таких как поиск, корзина, личный кабинет. При работе с верхним меню следует обратить внимание на:

  • Компактность и лаконичность
  • Интеграцию с основным дизайном сайта
  • Удобство использования на мобильных устройствах
  • Возможность добавления иконок для улучшения восприятия

Нижнее меню (футер): информационные разделы

Нижнее меню, или футер, обычно содержит ссылки на информационные страницы, контакты и юридическую информацию. При создании нижнего меню важно:

  • Группировать ссылки по тематическим блокам
  • Включить ссылки на страницы «О нас», «Контакты», «Доставка и оплата»
  • Добавить ссылки на социальные сети
  • Разместить информацию о правах и политике конфиденциальности

Боковое меню: дополнительная навигация

Боковое меню может использоваться для различных целей, таких как фильтрация товаров, отображение акций или популярных категорий. При работе с боковым меню стоит учитывать:

  • Соответствие содержания текущему разделу сайта
  • Возможность сворачивания/разворачивания для экономии места
  • Использование визуальных элементов для привлечения внимания
  • Интеграцию с системой фильтров и сортировки

Мега-меню: расширенные возможности навигации

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

  • Логичную группировку пунктов
  • Использование колонок для удобства навигации
  • Добавление изображений и описаний для категорий
  • Оптимизацию для мобильных устройств

Продвинутые техники работы с меню в OpenCart

После рассмотрения основных видов меню, перейдем к более продвинутым техникам работы с навигацией в OpenCart.

Кастомизация стилей меню

Для создания уникального дизайна меню можно использовать CSS-стили. Вот несколько примеров кастомизации:

  • Изменение цветовой схемы
  • Настройка шрифтов и размеров текста
  • Добавление эффектов при наведении
  • Создание уникальных иконок для пунктов меню

Пример CSS-кода для стилизации главного меню:

 #main-menu { background-color: #f8f8f8; border-radius: 5px; } #main-menu li { padding: 10px 15px; } #main-menu li a { color: #333; font-weight: bold; transition: color 0.3s; } #main-menu li a:hover { color: #007bff; } 

Динамическое меню на основе категорий

Для автоматического обновления меню категорий можно использовать PHP-код в файле контроллера. Это позволит создать динамическое меню, которое будет отражать актуальную структуру категорий магазина.

Пример кода для получения списка категорий:

 public function getCategories($parent_id = 0) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)"); return $query->rows; } 

Создание многоуровневого меню

Для создания многоуровневого меню можно использовать рекурсивные функции. Это позволит отобразить сложную структуру категорий в удобном для пользователя виде.

Пример рекурсивной функции для построения многоуровневого меню:

 function buildMenu($categories, $parent_id = 0) { $result = ""; foreach ($categories as $category) { if ($category['parent_id'] == $parent_id) { $result .= '<li>'; $result .= '<a href="' . $category['href'] . '">' . $category['name'] . '</a>'; $children = buildMenu($categories, $category['category_id']); if ($children) { $result .= '<ul>' . $children . '</ul>'; } $result .= '</li>'; } } return $result; } 

Интеграция поиска в меню

Добавление функции поиска в меню может улучшить пользовательский опыт. Для этого можно использовать AJAX-запросы для обновления результатов поиска в реальном времени.

Читайте также  Скрытые преимущества оптического масштабирования в вариативных шрифтах

Пример JavaScript-кода для реализации живого поиска:

 $(document).ready(function() { $('#search-input').on('input', function() { var query = $(this).val(); if (query.length > 2) { $.ajax({ url: 'index.php?route=product/search/autocomplete', type: 'post', data: { filter_name: query }, dataType: 'json', success: function(json) { // Отображение результатов поиска } }); } }); }); 

Оптимизация меню для мобильных устройств

Адаптация меню для мобильных устройств является критически важной задачей. Для этого можно использовать медиа-запросы в CSS и JavaScript для создания адаптивного меню.

Пример CSS-кода для адаптивного меню:

 @media (max-width: 768px) { #main-menu { display: none; } .mobile-menu-toggle { display: block; } #main-menu.active { display: block; position: absolute; top: 100%; left: 0; width: 100%; background-color: #fff; box-shadow: 0 2px 5px rgba(0,0,0,0.1); } #main-menu li { display: block; width: 100%; } } 

Создание мега-меню с помощью модулей

Для создания сложных мега-меню можно использовать специальные модули для OpenCart. Они предоставляют удобный интерфейс для настройки и расширенные возможности кастомизации.

Популярные модули для создания мега-меню в OpenCart:

  • MegaMenu Pro
  • Mega Menu Ultimate
  • SO MegaMenu
  • Plaza MegaMenu

Оптимизация производительности меню

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

Пример использования кэширования для меню категорий:

 public function getCategories($parent_id = 0) { $cache_key = 'category.menu.' . $parent_id . '.' . $this->config->get('config_language_id'); $categories = $this->cache->get($cache_key); if (!$categories) { // Запрос к базе данных для получения категорий // ... $this->cache->set($cache_key, $categories, 3600); // Кэширование на 1 час } return $categories; } 

Тестирование и отладка меню в OpenCart

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

Проверка корректности ссылок

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

Тестирование на различных устройствах и браузерах

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

Оценка скорости загрузки

Меню не должно существенно влиять на скорость загрузки страниц сайта. Для оценки производительности можно использовать инструменты Google PageSpeed Insights или GTmetrix.

Проверка доступности

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

Расширенные возможности меню в OpenCart

Рассмотрим некоторые дополнительные функции и возможности, которые можно реализовать в меню OpenCart для улучшения пользовательского опыта и функциональности интернет-магазина.

Интеграция меню с системой акций и скидок

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

Пример кода для отображения акционных товаров в меню:

 public function getSpecialCategories() { $query = $this->db->query("SELECT DISTINCT c.category_id, cd.name FROM " . DB_PREFIX . "product_special ps LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (ps.product_id = p2c.product_id) LEFT JOIN " . DB_PREFIX . "category c ON (p2c.category_id = c.category_id) LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE ps.date_start < NOW() AND (ps.date_end > NOW() OR ps.date_end = '0000-00-00') AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "'"); return $query->rows; } 

Персонализация меню для зарегистрированных пользователей

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

Пример кода для добавления персонализированных пунктов меню:

 public function getCustomerMenu() { $menu_items = array(); if ($this->customer->isLogged()) { $menu_items[] = array( 'name' => 'Мои заказы', 'href' => $this->url->link('account/order', '', true) ); $menu_items[] = array( 'name' => 'Избранное', 'href' => $this->url->link('account/wishlist', '', true) ); $menu_items[] = array( 'name' => 'Рекомендации', 'href' => $this->url->link('product/recommendation', '', true) ); } return $menu_items; } 

Интеграция меню с системой фильтрации товаров

Объединение меню категорий с системой фильтрации товаров может значительно упростить навигацию по каталогу. Для этого можно добавить выпадающие списки с фильтрами непосредственно в пункты меню категорий.

Пример реализации фильтров в меню категорий:

 $(document).ready(function() { $('.category-menu-item').hover(function() { var category_id = $(this).data('category-id'); $.ajax({ url: 'index.php?route=product/category/getFilters', type: 'post', data: { category_id: category_id }, dataType: 'json', success: function(json) { // Отображение фильтров в выпадающем меню } }); }); }); 

Создание многоязычного меню

Для интернет-магазинов с поддержкой нескольких языков важно реализовать многоязычное меню. OpenCart предоставляет встроенные инструменты для работы с переводами, которые можно использовать при создании меню.

Пример кода для получения переведенных названий категорий:

 public function getTranslatedCategories($language_id) { $query = $this->db->query("SELECT c.category_id, cd.name FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) WHERE cd.language_id = '" . (int)$language_id . "' ORDER BY c.sort_order, LCASE(cd.name)"); return $query->rows; } 

Интеграция меню с системой поиска и автодополнения

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

Читайте также  Яндекс вводит ежемесячные бонусы для разработчиков навыков Алисы

Пример реализации автодополнения в меню поиска:

 $(document).ready(function() { $('#search-input').autocomplete({ source: function(request, response) { $.ajax({ url: 'index.php?route=product/search/autocomplete', dataType: 'json', data: { filter_name: request.term }, success: function(json) { response($.map(json, function(item) { return { label: item.name, value: item.product_id } })); } }); }, select: function(event, ui) { $('#search-input').val(ui.item.label); return false; } }); }); 

Создание динамического меню на основе пользовательских действий

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

Пример кода для отслеживания просмотренных категорий:

 public function addViewedCategory($category_id) { if (!isset($this->session->data['viewed_categories'])) { $this->session->data['viewed_categories'] = array(); } if (!in_array($category_id, $this->session->data['viewed_categories'])) { $this->session->data['viewed_categories'][] = $category_id; // Ограничиваем количество сохраненных категорий if (count($this->session->data['viewed_categories']) > 5) { array_shift($this->session->data['viewed_categories']); } } } 

Оптимизация меню для SEO

Правильно структурированное меню может положительно влиять на SEO-показатели сайта. Использование семантической разметки и оптимизация текстов пунктов меню помогут улучшить позиции сайта в поисковых системах.

Пример семантической разметки для меню категорий:

 <nav itemscope itemtype="http://schema.org/SiteNavigationElement"> <ul> {% for category in categories %} <li itemprop="name"> <a href="{{ category.href }}" itemprop="url">{{ category.name }}</a> </li> {% endfor %} </ul> </nav> 

Анализ эффективности меню

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

Отслеживание кликов по пунктам меню

Использование инструментов аналитики, таких как Google Analytics, позволяет отслеживать, какие пункты меню наиболее популярны среди пользователей. Эта информация может быть использована для оптимизации структуры меню и расположения наиболее важных элементов.

Пример кода для отслеживания кликов по меню с помощью Google Analytics:

 $('.menu-item').on('click', function() { var menuItem = $(this).text(); gtag('event', 'menu_click', { 'event_category': 'Navigation', 'event_label': menuItem }); }); 

A/B тестирование различных вариантов меню

Проведение A/B тестирования позволяет сравнить эффективность различных вариантов меню и выбрать наиболее оптимальный. Можно тестировать различные структуры, дизайн и расположение элементов меню.

Пример настройки A/B теста с использованием Google Optimize:

 <script src="https://www.googleoptimize.com/optimize.js?id=OPT-XXXXXXXX"></script> <script> function runExperiment() { var variant = Math.random() < 0.5 ? 'control' : 'variant'; if (variant === 'variant') { // Применяем изменения для варианта B $('#main-menu').addClass('variant-b'); } // Отправляем информацию о варианте в Google Analytics gtag('event', 'optimize.callback', { name: 'menu_test', callback: function(value) { if (value === 'variant') { $('#main-menu').addClass('variant-b'); } } }); } runExperiment(); </script> 

Анализ поведения пользователей

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

Популярные инструменты для анализа поведения пользователей:

  • Hotjar
  • Crazy Egg
  • FullStory
  • Mouseflow

Интеграция меню с другими модулями OpenCart

Для создания более функционального и удобного интернет-магазина важно обеспечить интеграцию меню с другими модулями OpenCart.

Интеграция с модулем сравнения товаров

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

Пример кода для отображения количества товаров в списке сравнения:

 public function getCompareCount() { return isset($this->session->data['compare']) ? count($this->session->data['compare']) : 0; } // В шаблоне меню <li class="compare-menu-item"> <a href="{{ compare }}">Сравнение (<span id="compare-total">{{ compare_count }}</span>)</a> </li> 

Интеграция с модулем корзины

Отображение мини-корзины в меню позволяет пользователям быстро просматривать содержимое корзины и переходить к оформлению заказа. Это может повысить конверсию и улучшить удобство использования сайта.

Пример реализации мини-корзины в меню:

 <li class="cart-menu-item"> <a href="{{ cart }}"> <i class="fa fa-shopping-cart"></i> <span id="cart-total">{{ text_items }}</span> </a> <div class="mini-cart-content"> {% if products or vouchers %} <ul> {% for product in products %} <li> <a href="{{ product.href }}">{{ product.name }}</a> <span class="quantity">x {{ product.quantity }}</span> <span class="price">{{ product.total }}</span> </li> {% endfor %} </ul> <div class="cart-total"> <strong>{{ text_total }}:</strong> {{ total }} </div> <div class="cart-buttons"> <a href="{{ cart }}" class="btn btn-default">{{ text_cart }}</a> <a href="{{ checkout }}" class="btn-primary">{{ text_checkout }}
{% else %}

{{ text_empty }}

{% endif %}

Интеграция с модулем учетных записей пользователей

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

Пример кода для отображения меню учетной записи:

 <li class="account-menu-item dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> <i class="fa fa-user"></i> {{ text_account }} </a> <ul class="dropdown-menu"> {% if logged %} <li><a href="{{ account }}">{{ text_account }}</a></li> <li><a href="{{ order }}">{{ text_order }}</a></li> <li><a href="{{ transaction }}">{{ text_transaction }}</a></li> <li><a href="{{ download }}">{{ text_download }}</a></li> <li><a href="{{ logout }}">{{ text_logout }}</a></li> {% else %} <li><a href="{{ register }}">{{ text_register }}</a></li> <li><a href="{{ login }}">{{ text_login }}</a></li> {% endif %} </ul> </li> 

Интеграция с модулем фильтрации товаров

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

Читайте также  Руководство по использованию cookies в PHP

Пример реализации фильтров в меню категорий:

 <li class="category-menu-item" data-category-id="{{ category.category_id }}"> <a href="{{ category.href }}">{{ category.name }}</a> <div class="category-filters"> <h4>Фильтры</h4> {% for filter_group in category.filters %} <div class="filter-group"> <h5>{{ filter_group.name }}</h5> {% for filter in filter_group.filter %} <label> <input type="checkbox" name="filter[]" value="{{ filter.filter_id }}"> {{ filter.name }} </label> {% endfor %} </div> {% endfor %} <button class="apply-filters">Применить</button> </div> </li> 

Оптимизация производительности меню

Оптимизация производительности меню важна для обеспечения быстрой загрузки страниц и плавной работы сайта.

Кэширование данных меню

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

Пример использования кэширования для меню категорий:

 public function getCategories($parent_id = 0) { $cache_key = 'category.menu.' . $parent_id . '.' . $this->config->get('config_language_id') . '.' . $this->config->get('config_store_id'); $categories = $this->cache->get($cache_key); if (!$categories) { $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "category_to_store c2s ON (c.category_id = c2s.category_id) WHERE c.parent_id = '" . (int)$parent_id . "' AND cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND c2s.store_id = '" . (int)$this->config->get('config_store_id') . "' AND c.status = '1' ORDER BY c.sort_order, LCASE(cd.name)"); $categories = $query->rows; $this->cache->set($cache_key, $categories, 3600 * 24); // Кэширование на 24 часа } return $categories; } 

Оптимизация запросов к базе данных

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

Пример оптимизированного запроса для получения категорий с подсчетом товаров:

 SELECT c.category_id, cd.name, COUNT(p2c.product_id) as product_count FROM " . DB_PREFIX . "category c LEFT JOIN " . DB_PREFIX . "category_description cd ON (c.category_id = cd.category_id) LEFT JOIN " . DB_PREFIX . "product_to_category p2c ON (c.category_id = p2c.category_id) LEFT JOIN " . DB_PREFIX . "product p ON (p2c.product_id = p.product_id) WHERE cd.language_id = '" . (int)$this->config->get('config_language_id') . "' AND p.status = '1' GROUP BY c.category_id ORDER BY c.sort_order, LCASE(cd.name) 

Ленивая загрузка подменю

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

Пример реализации ленивой загрузки подменю:

 $(document).ready(function() { $('.menu-item-with-children').on('mouseenter', function() { var $submenu = $(this).find('.submenu'); if (!$submenu.data('loaded')) { var categoryId = $(this).data('category-id'); $.ajax({ url: 'index.php?route=common/menu/getSubmenu', type: 'post', data: { category_id: categoryId }, dataType: 'json', success: function(json) { if (json.success) { $submenu.html(json.html); $submenu.data('loaded', true); } } }); } }); }); 

Безопасность меню в OpenCart

Обеспечение безопасности меню является важной частью общей безопасности интернет-магазина на OpenCart.

Защита от XSS-атак

Для предотвращения XSS-атак необходимо экранировать все пользовательские данные, которые отображаются в меню.

Пример использования функции htmlspecialchars для экранирования данных:

 <a href="{{ category.href }}">{{ category.name|escape }}</a> 

Проверка прав доступа

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

Пример проверки прав доступа:

 {% if user.hasPermission('access', 'admin/category') %} <li><a href="{{ category_admin }}">{{ text_category_admin }}</a></li> {% endif %} 

Защита от SQL-инъекций

Использование подготовленных запросов или экранирование пользовательского ввода поможет защитить меню от SQL-инъекций.

Пример использования подготовленного запроса:

 $query = $this->db->query("SELECT * FROM " . DB_PREFIX . "category WHERE category_id = ?", array($category_id)); 

Заключение

Создание эффективного и функционального меню в OpenCart требует внимания к деталям, понимания потребностей пользователей и технических аспектов работы платформы. Правильно настроенное меню не только улучшает навигацию по сайту, но и способствует увеличению конверсии и улучшению пользовательского опыта.

Основные аспекты, которые следует учитывать при работе с меню в OpenCart:

  • Структура и организация пунктов меню
  • Интеграция с другими модулями и функциями магазина
  • Оптимизация производительности
  • Адаптация для мобильных устройств
  • Персонализация и динамическое обновление
  • Безопасность и защита от атак
  • Анализ эффективности и A/B тестирование

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

Аспект работы с меню Ключевые моменты
Структура меню
  • Логичная иерархия
  • Оптимальное количество пунктов
  • Понятные названия
Интеграция
  • Связь с модулем корзины
  • Интеграция с системой фильтрации
  • Персонализация для пользователей
Производительность
  • Кэширование данных
  • Оптимизация запросов
  • Ленивая загрузка
Мобильная адаптация
  • Отзывчивый дизайн
  • Упрощенная структура для малых экранов
  • Оптимизация для тач-интерфейсов
Безопасность
  • Защита от XSS-атак
  • Проверка прав доступа
  • Предотвращение SQL-инъекций

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

Советы по созданию сайтов