Перейти к содержанию

Лидеры

  1. mpn2005

    mpn2005

    Разработчик


    • Баллы

      5

    • Постов

      531


  2. ncv

    ncv

    Разработчик


    • Баллы

      3

    • Постов

      107


  3. halfhope

    halfhope

    Разработчик


    • Баллы

      2

    • Постов

      46


  4. Nameless

    Nameless

    Пользователь


    • Баллы

      2

    • Постов

      19


Популярный контент

Показан контент с высокой репутацией за 28.04.2023 в Записи блога

  1. Веб сервер nginx позволяет работать в разных режимах, как с использованием интерпретатора php, так и без. Для работы OpenCart лучше выбирать оптимальный режим работы php-fpm. Многих данный режим пугает тем, что в данном случае файл htaccess напрочь игнорируется и все необходимые настройки нужно вносить в конфиг nginx. Но в этом нет ничего сверх сложного. Конфигурационный файл - это обычный текстовый файл на сервере, который подчиняется определённым правилам. И по данному поводу можно найти много готовых описаний и инструкций. Данная статья не претендует на уникальность, а просто представляет краткую выжимку по настройкам, учитывая особенности работы с движком OpenCart и сборками на его основе. Для удобства будут приводится примеры настройки с использованием панели ISPmanager. Основные настройки будут касаться секции location, и зависимость описания от используемой панели будет минимальной. Для начала переведём nginx в режим работы php-fpm. Для этого в панели сделаем следующие настройки разделе WWW-домены для нужного сайта: 1. Выбираем в списке нужный сайт, если их несколько, и жмём кнопку "Изменить". 2. Находим настройки PHP и настраиваем следующим образом: Обратите внимание, что версия php у вас может отличаться. При необходимости, можно эту версию изменить на нужную, но этот вопрос выходит за рамки данной статьи. После сохранения настроек будет работать почти всё, что и раньше. Если в настройках OpenCart отключены ЧПУ ссылки, то всё будет работать, как и работало до переключения режима работы. Теперь можно приступать к непосредственной настройке самого конфигурационного файла nginx для текущего сайта. Для этого в списке www доменов находим нужный нам и нажимаем справа на иконку с тремя точками. В выпадающем меню выбираем пункт "Конфиг": Вот примерный конфигурационный файл, который будет создан у вас по умолчанию: В конфигурации у вас будет две секции server, если у вас включено защищённое соединение SSL (и оно должно быть обязательно включено). Если у вас включен принудительный редирект с http на https, то можно редактировать только секцию server для https. Определить её легко: в самом начале есть параметр с указанием сертификата ssl_certificate. Также в этой секции указан параметр listen с указанием порта 443: listen 8.8.8.8:443 ssl Но лучше делать настройки сразу в двух секциях server, чтобы не допустить механической ошибки. На данный момент нас интересует вот эта часть конфигурационного файла: location / { location ~ [^/]\.ph(p\d*|tml)$ { try_files /does_not_exists @php; } location ~* ^.+\.(jpg|jpeg|gif|png|svg|js|css|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ { expires 365d; } } Все дальнейшие изменения мы будем вносить внутри этой секции "location /". В первую очередь нам не хватает вот такой директивы: if (!-e $request_filename){ rewrite ^/(.+)$ /index.php?_route_=$1 last; } Данное условие очень простое: если сервер не может найти файл по указанному в запросе пути, то запрос будет переписан на вызов index.php, а в параметр _route_ будет передан запрашиваемый путь. Именно это и позволит корректно отрабатывать всем ЧПУ ссылкам движка. Это правило является аналогом записи в файле htaccess: RewriteRule ^([^?]*) index.php?_route_=$1 [L,QSA] На этом можно было бы и закончить, но стоит внести ещё некоторые изменения для улучшения безопасности. Рассмотрим более внимательно вот эту секцию: location ~ [^/]\.ph(p\d*|tml)$ { Тут отбираются все все подходящие динамические файлы с типами .php (в том числе с числами в окончании) и .phtml Но у движка OpenCart в штатном режиме есть всего две точки входа для вызова php файлов через web окружение - это index.php и admin/index.php Есть ещё install/index.php, но она используется только при установке движка. Учитывая данные обстоятельства, логично запретить прямое выполнение всех остальных php скриптов через web окружение, кроме указанных администратором. Сделать это можно следующим образом: location ~ ^/(index|admin/index|install/index)\.php { try_files /does_not_exists @php; } В скобках через разделитель "|" указываем все php скрипты, которые можно выполнять. После завершения установки можно будет сократить это список до такого: (index|admin/index) ВНИМАНИЕ!!! Очень важный момент! После того, как убрали вызов интерпретатора php для всех файлов, кроме указанных, при попытке запроса любого другого php файла он будет отдан как обычный текстовый файл. И при запросе https://test.ru/config.php любой желающий сможет получить содержимое вашего конфигурационного файла, где содержится доступ к БД. Поэтому нам обязательно нужно запретить доступ для всех остальных файлов с расширением php. Ну и заодно к другим типам файлов, которые не стоит отдавать по запросу извне. Сделать это можно простым правилом: location ~* \.(php|log|tpl|txt|twig|xml|ini)$ { deny all; } В скобках через разделитель "|" указываем все расширения файлов, которые мы хотим запретить. Но у нас есть несколько важных файлов, которые пока попали под запрет, например: robots.txt и sitemap.xml. Этот вопрос мы решим чуть позже. А сейчас ещё немного запретов. Запретим открывать файлы, которые начинаются с точки, а также все файлы в папке system: location ~ /\. { deny all; } location ~ ^/system/ { deny all; } Этих запретов вполне достаточно, чтобы сделать невозможным выполнение каких-либо несанкционированных скриптов. А также просмотр логов, текстовых и xml файлов. Теперь нам необходимо открыть доступ к файлу robots.txt, для этого нам нужно такое правило: location = /robots.txt { allow all; } Также пропишем разрешение на открытие sitemap.xml и rewrite правило: location = /sitemap.xml { allow all; rewrite ^/(.*)$ /index.php?route=extension/feed/google_sitemap last; } Если вы используете сторонний модуль сайтмапа, то нужно указать соответствующий route для данного модуля. Если у вас несколько файлов sitemap или вы используете фиды для выгрузки данных, то просто пропишите для них права по аналогии. В итоге мы должны получить вот такую секцию location: Этих настроек достаточно для корректной работы движка OpenCart. И при этом данная конфигурация является безопасной с точки зрения выполнения несанкционированных скриптов php через web окружение. После всех настроек обязательно проверьте правильность работы, сделав запросы по указанному чек-листу (test.ru замените на адрес вашего сайта): https://test.ru/config.php https://test.ru/admin/config.php https://test.ru/admin/1.php https://test.ru/admin/1.txt https://test.ru/admin/1.log https://test.ru/admin/1.xml https://test.ru/system/modification.xml Для всех этих ссылок вы должны получить ошибку "403 Forbidden", вне зависимости от того, есть файл по указанному пути на сервере, или нет. Также проверяем белый список: https://test.ru/robots.txt https://test.ru/sitemap.xml Эти файлы не должны вызывать ошибок и вы должны корректно получать их содержимое. Дополнительно стоит проверить все ваши дополнительные сайтмапы или фиды, если вы их добавляли. Ещё раз повторюсь, что данная настройка является базовой, с небольшими правилами для улучшения безопасности. Но даже уже при такой настройке вы в среднем получите выигрыш 100-200ms для параметра TTFB, по сравнению с остальными режимами работы.
    2 балла
  2. Года полтора назад озадачился поиском удобной, легкой и бесплатной панели для управлением своего сервера дабы не лазеть лишний раз в консоль плюс клиенты тоже могли бы иметь доступ к базовым настройкам если понадобится. Пересмотрев всякие BrainyCP, aaPanel, VestaCP и тп на мой взгляд они были либо перегруженные, либо их недолюбили и они находятся в непонятном состоянии, что проще вообще без панели работать. Но в один момент нашел панель HestiaCP которая является ответвлением от VestaCP. Демо понравилось, приятный и минималистичный интерфейс, неплохое количество участников на гитхабе и дружелюбный форум. Использую больше года и пока не разочаровался. Из удобств: Доступ по SFTP/FTP, создание мультиаккаунтов 2 Фактораня авторизация Мулти php Годные шаблоны настроек Nginx под разные cms Доступ по SSH Простое развертывание баз данных (PostgreSQL, MySQL 8, MariaDB 10.11) + PhpMyAdmin Резервное копирование как локальное так и удаленное Настройка лимитов для пользователей Выпуск сертификата Let’s Encrypt одной кнопкой или вставкой купленного Работа с DNS записями Возможность организовать полностью свой почтовый сервер Удобный файловый менеджер Из минусов, нет такого количества модулей как в aaPanel или ISPmanager и тот же ioncube придется поставить руками, но и этот процесс упростили за последнее время До начала установки вам понадобиться GIT, тк в моем примере я использую консоль Git BASH, впрочем можно использовать веб версию консоли у хостера. В качестве хостера я выбрал 2 наиболее оптимальных вариантов: Таймвеб если ваш проект в РФ и вам нужны все закрывающие доки и вы не хотите заморачиваться с оплатой зарубежных вариантов, мучиться с почтой. Хецнер если нет проблем с оплатой за пределами РФ и ваш проект ближе по локациям к их серверам. Но у хецнера и других не дорогих зарубежных хостингов будет заблокирован 25/465 порт для отправки почты новорегов, а где-то совсем и вам придется использовать 585 порт через SMTP reley который к счастью поддерживает наша панель. По хецнеру в доке написано, что можно попросить через месяц разблокировать, по факту мне разблокировали месяца через 3-4 (разблокировать раньше не помогали даже скрины с DNS записями о том, что моя почта ходит через SMTP mail.ru) у таймвеба такой проблемы нет, просто пишите в саппорт и вам разблокируют. Регистрируемся на timeweb.cloud (+300 рублей по ссылке), переходим в облачные сервера, выбираем ОС Ubuntu последней версии, максимально близкий ваш регион. Для большинства среднестатистических магазинов подойдет такая конфигурация: Но не меньше, если это только не тестовый сервер. Если будет мало в любой момент можно сделать апскейл на большей тариф, но назад перейти уже так не получиться. Допы на ваше усмотрение, в принципе бэкапы делает панель их можно хранить локально и скачивать периодически или сливать на удаленный FTP Дальше для добавления SSH ключа нужно его сгенерировать, можно добавить и позже, но удобнее сразу: Запускаем Bash и вводим команду: ssh-keygen -t rsa -b 4096 -C "ваша_почта" -f ~/.ssh/имя-проекта_rsa В папке C:\Users\текущий-пользователь\.ssh У вас появится 2 файла имя-проекта_rsa (закрытый ключ) и имя-проекта_rsa.pub (открытый ключ).Открываем последний любым текстовым редактором и копируем содержимое сюда: Все после чего вам приходит уведомление на почту с адресом сервера и стандартным именем суперпользователя для входа в систему под которым будем делать первоначальные настройки: Теперь переходим в настройки и копируем пароль для root: Такой же аналог на Хецнер (+20 евро по ссылки после регистрации): Добавить/удалить ключ можно будет и тут: Получилась такая красота: Тут пароль для root пользователя приходит сразу на почту: Если что, его всегда можно скинуть тут: Погнали настраивать, открываем наш bash: Вводим команду: ssh root@ip-адрес-нашего-сервера и пароль Все мы внутри, видно, что ресурсов задействовано совсем не много Создаем нового пользователя, командой: adduser new_user Добавляем пароль, а остальные данные по желанию Добавляем пользователя в группу администраторов: usermod -aG sudo new_user Запускаем поиск обновлений и одновременную их установку командой: apt update && apt upgrade Ставим sudo который позволит работать с правами администратора: apt install sudo Перезагружаем сервер: shutdown -r now Далее будем заходить только под логином созданного пользователя, те в bash для доступа к серверу нужно будет написать: ssh new_user@ip-адрес-вашего-сервера Ставим утилиту htop командой: sudo apt install htop Теперь запустив команду: sudo htop и можно посмотреть запущенные процессы, занятые ресурсы в удобном виде: Ставим файловый менеджер Midnight Commander: sudo apt install mc Запустим mc и получим удобную визуальную навигацию, чтобы получить доступ к редактированию системных папок и файлов нужно запускать утилиту с правами администратора: sudo mc После запуска переходим в папку /etc/ssh/ ищем файл sshd_config, нажимаем F4 и при первом запуске mc спросит какой редактор выбрать по умолчанию: Выбирайте либо nano (1) либо встроенный mcedit (3), про vim лучше сначала почитать или посмотреть пару видосов) Ищем в файле строчку: PermitRootLogin yes и меняем значение на no: дальше ищем строчку: PasswordAuthentication yes и делаем тоже самое: Жмем F2 для сохранения если использовали mcedit или CTRL+O с перезаписью если вы использовали nano и CTR+X для выхода из редактора Перезагружаем сервис SSH: sudo service ssh restart sudo systemctl restart ssh Для более комфортной работы можно прописать алиасы для SSH ключей и не держать ip адрес сервера в голове, создадим в папке с ssh ключами файл config, откроем его и пропишем: Host nash_sasait (удобное имя) HostName 0.0.0.0 (ip адрес вашего сервера) IdentityFile ~/.ssh/имя-проекта_rsa (имя закрытого SSH ключа) User new_user (имя пользователя) Port 22 теперь открыв bash вам достаточно ввести команду: ssh nash_sasait Таких настроек можно делать сколько угодно Если сервер брали на хецнере, возможно захочется установить другое удобное локальное время, делается командой: sudo dpkg-reconfigure tzdata Для установки приятного глазу имя хоста, а не вот типо этого: воспользуемся командой: sudo hostnamectl set-hostname ваше-красивое-имя Посмотрим статус: sudo hostnamectl status (должно быть видно, что имя изменилось, после перезагрузки увидите изменения и в командной строке) Переходим по ссылке и начинаем ставить панель. В принципе сейчас настройки по умолчанию можно оставлять, заполнив только: почту пароль админа домен (в качестве домена я использую поддомен вида cp.основной домен, но вы можете использовать любой другой технический домен) порт который можете менять можете не менять как по мне кому припрет все равно просканирует и найдет Важно, если вы взяли сервер с 2 гб оперативы и не собираетесь использовать почтовый сервер, вы можете их отключить: clamav (антивирус который будет жрать больше 1,2 гб оперативы) spamassassin (антиспам) dovecot (IMAP и POP3-сервер) exim (почтовый агент) Можно все это отключить и позже) Копируем и поочередно вставляем команды в консоль с правами админа: Если все сделано верно, начнется установка: После установки ваша панель будет доступна по адресу: ip-вашего-сервера:8083 (или тот порт который вы указали при установке): Заходим внутрь панели и переходим на вкладку Web, жмем редактировать домен: Включаем 301 редирект и указываем в качестве адреса ваш ip-адрес-сервера:8083 Теперь не нужно держать в голове ip адрес, достаточно ввести имя поддомена и вы попадете в панель. но для этого еще нужно прописать А/АААA записи для поддомена В настройках вашей панели где находятся домены, впишите в A запись ip адрес v4, а в AAAA ip v6 (для основного домена у вас будут те же адреса, также не забудьте их прописать) Скопировать для таймвеба можно тут: У хецнера тут: Для добавления нового сайта вам необходимо создать нового пользователя, имя которого не должно быть равно имени пользователя сервера созданного ранее после создания можно либо выйти из панели и залогиниться под новым пользователем либо можно перемещаться между логинами тут: что удобно на период настроек Далее добавляем основной домен сайта: И переходим в настройку домена: Включаем поддержку SSL, если будем использовать бесплатный Let's Encrypt, то включаем первый чекбокс, если у нас платный сертификат или заглючил Let's Encrypt и забанил нас на время, то можно вставить другой сертификат в эти поля (как вариант бесплатный временный сертификат можно сгенерировать тут): Выбираем шаблон Nginx - opencart Версию php в зависимости от версии вашего движка, у меня старая поэтому 5.6 Ниже создаем нужное количество FTP аккаунтов, если расположении пути нужно поменять отличное от дефолтного, отжимаем чекбокс выше и выбираем удобное: Все, теперь можно подключиться по FTP и залить файлы движка: Настроим количество резервных копий, для этого перейдем в панель Пакеты под администратором: Индикатор максимальных доступных резервных копий: пакет system установлен для пользователя администратор по умолчанию, удалить и редактировать нельзя. Можно сделать копию и отредактировать ее и выбрать для администратора, но сейчас нам достаточно отредактировать пакет default который включен по умолчанию для всех остальных пользователей: Мне достаточно 2 локальных копий, также можно сделать настройки по умолчанию шаблона Nginx/php/ssh и прочие Доступные резервные копии можно скачать или развернуть перейдя на соответствующую вкладку под нужным пользователем: Важно, архивы по умолчанию будут запакованы методом zstd, для распаковки нужно отдельный плагин для 7zip или такой архиватор скачать, но можно и включить метод сжатия gzip, для настройки нужно перейти в настройки панели под админом: Если вы заметите, что резервные копии перестали создаваться, то скорее всего у вас недостаточно свободного места на диске, тогда либо уменьшите количество резервных копий либо докупить свободное место, либо сливайте на внешней FTP. Например есть такой дешман вариант холодного хранилища от яндекса: Теперь перейдем опять в консоль и установим Ioncube без которого не будут работать платные модули: wget https://raw.githubusercontent.com/jaapmarcus/ioncube-hestia-installer/main/install_ioncube.sh chmod +x install_ioncube.sh ./install_ioncube.sh После посмотрим установленную версию php и загрузку ионкуба командой: php -v Важный момент версия ионкуба должна соответствовать используемой версии php Теперь создадим базу данных из под пользователя: Название базы данных, имя пользователя и пароль не забудьте сохранить, эти данные нужны будут при инсталяции движка. При установки cms из списка доступных приложений панели база данных будет создана автоматически (opencart там доступен только последней версии из официального репозитория, клубной сборки там конечно же не будет) Для запуска phpMyAdmin нужно отредактировать файл: sudo nano /etc/nginx/conf.d/ip-вашего-сервера.conf Заменив: location /phpmyadmin/ { alias /var/www/document_errors/; return 404; } location /phppgadmin/ { alias /var/www/document_errors/; return 404; } На: include /etc/nginx/conf.d/phpmyadmin.inc*; include /etc/nginx/conf.d/phppgadmin.inc*; У себя я просто закомментировал эти строки: Системная версия php должны быть выше версии 7.2.5 иначе получите такую ошибку: Системную версию php можно просмотреть, изменить и включить дополнительные версии в настройках панели тут: Если ниже и вам нужен доступ к базе данных то все манипуляции с базой данных можно сделать через внешнее подключение используя например такую утилиту, но придется еще поднастроить доступы, открываем в панели настройки файрвола: Жмем добавить правило: Добавляем доступ к порту 3306 (порт нашей базы данных), если в адресе оставить все нули, то доступ будет с любого ip адреса, безопаснее сделать доступ только с вашего выделенного ip Далее запускаем Bash и редактируем, файл: sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf Ищем строку bind-address и указываем либо: bind-address = 0.0.0.0 для доступа с любого ip либо ваш статический ip адрес После создания базы данных можно открыть HeidiSQL и настроить новое подключение указав имя сервера, имя пользователя базы данных и пароль: Ну вот как бы и все, после того как залили файлы движка можно приступить к установке, также можно выполнить установку cms не только opencart из панели, но там доступна только последняя версия из официального репозитория, которая пока сырая, но тот же wordpress поставить не зазорно из панели, делается это через вкладку приложения в настройках вашего домена: Про дополнительную настройку лимитов php и почты наверное напишу отдельно, также саму панель теперь можно развернуть из маркетплейса таймвеба, но я не пробовал:
    2 балла
  3. очень давно делали этот модуль и не доделали... Все выбранные атрибуты создаются по большой кнопке можно указать вид фильтровки - Слайдер или Чекбокс можно назначить Категории Проверено на сайте с 100к номенклатуры и 500+ Характеристиками https://h5010.h5.ose.su/admin/index.php?route=extension/module/attr_to_filter filter filter на фронте всё стандартно, кроме ползунка цены. Если есть желающие - выдам наработки, тому кто захочет дорабатывать Фильтры.
    2 балла
  4. Упрощение управления вашим бизнесом с помощью Диспетчера YML/XML для поставщиков промышленного и складского оборудования В мире электронной коммерции ключевым моментом для успеха любого поставщика является эффективное управление информацией о продуктах. Это особенно важно для поставщиков промышленного и складского оборудования, чьи клиенты часто полагаются на точные и подробные данные о продукции перед принятием решения о покупке. В такой ситуации Диспетчер YML/XML становится незаменимым инструментом, который обеспечивает автоматизацию и стандартизацию процесса управления данными о продуктах. Что такое Диспетчер YML/XML? Диспетчер YML/XML - это модуль, разработанный специально для интернет-магазинов на платформах Opencart и ocStore. Он предоставляет возможность импортировать товары в ваш магазин, используя специальные ссылки на файлы в форматах YML/XML, предоставленные поставщиками товаров. Этот модуль обеспечивает удобство и гибкость, позволяя настраивать импорт товаров от разных поставщиков индивидуально под каждого из них. Преимущества Диспетчера YML/XM: Универсальность: Модуль поддерживает работу с различными поставщиками и форматами файлов (YML/XML), что позволяет вам легко интегрировать продукты от неограниченного количества поставщиков в ваш магазин. Гибкость настроек: Диспетчер YML/XML предоставляет возможность индивидуальной настройки импорта для каждого поставщика. Вы можете определять, какие поля данных импортировать, какие игнорировать, устанавливать цены, описания, характеристики товаров и многое другое. Обновление данных в режиме реального времени: Диспетчер YML/XML обеспечивает возможность регулярного обновления данных о товарах от поставщиков в режиме реального времени, что позволяет вашему магазину всегда оставаться актуальным. Пример использования Диспетчера YML/XML в интернет-магазине: Представим фирму "ПромТехно", которая специализируется на поставках промышленного оборудования для складов. Используя Диспетчер YML/XML, "ПромТехно" может легко управлять всем своим каталогом продукции, включая информацию о характеристиках продуктов, ценах, наличии на складе и фотографиях. Посмотреть пример использования Диспетчера YML/XML в деятельности поставщика промышленного и складского оборудования - https://h5012.h5.ose.su/index.php?route=product/category&path=1679 Далее эта информация автоматически обновляется на их сайте, а также на различных маркетплейсах, таких как Яндекс.Маркет, что позволяет им держать свой ассортимент актуальным и доступным для потенциальных клиентов. . Преимущества использования Диспетчера YML/XML для поставщиков промышленного и складского оборудования: Автоматизация процесса обновления информации: Диспетчер YML/XML позволяет поставщикам автоматизировать процесс обновления информации о продуктах на всех онлайн-платформах, что сокращает время, затрачиваемое на ручное обновление и предотвращает ошибки. Стандартизация данных: Благодаря стандартизации данных в форматах YML/XML, поставщики могут обеспечить единообразие информации о своем ассортименте на различных платформах, что упрощает процесс сравнения и выбора продуктов для клиентов. Улучшенная видимость продуктов: Использование Диспетчера YML/XML позволяет продуктам поставщика быть лучше обнаруженными на различных онлайн-платформах благодаря улучшенной оптимизации для поисковых систем и фильтрам. Эффективное управление ценами и наличием: Диспетчер YML/XML обеспечивает возможность быстро реагировать на изменения цен и наличия продукции, что позволяет поставщикам оперативно обновлять информацию на всех платформах и минимизировать риск потери продаж из-за устаревших данных. Для поставщиков промышленного и складского оборудования эффективное управление данными о продуктах является ключевым фактором успеха в онлайн-торговле. Диспетчер YML/XML для Opencart и ocStore представляет собой мощный инструмент, который обеспечивает удобство, гибкость и эффективность в интеграции товаров от разных поставщиков в ваш интернет-магазин.
    1 балл
  5. Модификатор добавляет поддержку префиксов «catalog» и «product» в ссылках для страниц категорий и товаров. Работает на OpenCart/OcStore 2.x/3.x, поддерживаются SEO_URL/SEO_PRO. SQL запрос для добавления префиксов находится в XML файле. Распространяется as is. product_and_category_prefix_v1.1_oc_v2.x.ocmod.zipproduct_and_category_prefix_v1.1_oc_v3.x.ocmod.zip Изменения в версиях: 1.1 Убрал префикс category для товаров с категориями 1.0 initial
    1 балл
  6. Для различных типов товаров часто возникает необходимость вывести товары в рекомендуемые автоматически, по определённому критерию. Нередко товары группируются по коллекциям, но штатными средствами OpenCart нет возможности их корректно объединить и добавить автоматически друг к другу как рекомендуемые товары. Эта небольшая доработка позволяет без дополнительных модулей реализовать вывод товаров коллекции в рекомендуемые автоматически, и избавляет вас от необходимости добавлять каждый товар друг к другу вручную. Данная доработка не затрагивает шаблоны, поэтому подходит для любой версии движка и сборки. Для примера рассматривается вариант объединения в коллекции по совпадению поля EAN. По принципу - если поле EAN не пустое, то выводим такие товары в рекомендуемые. В файле catalog/controller/product/product.php Находим строку: $results = $this->model_catalog_product->getProductRelated($this->request->get['product_id']); И заменяем её на это: $results = $this->model_catalog_product->getProductRelatedCollection($product_info); В файле catalog/model/catalog/product.php Перед строкой: public function getProductRelated($product_id) { Добавляем: public function getProductRelatedCollection($product) { // Поле товара, по которому идёт выборка коллекции $collection_field = 'ean'; $product_data = array(); if (!empty($product[$collection_field])) { $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE product_id != '" . (int)$product['product_id'] . "' AND status = '1' AND `" . $this->db->escape($collection_field) . "` LIKE '" . $this->db->escape($product[$collection_field]) . "' ORDER BY sort_order"); foreach ($query->rows as $result) { $product_data[$result['product_id']] = $this->getProduct($result['product_id']); } } return $product_data; } Если нужно выбирать товары только того же производителя, то функция должна выглядеть так: public function getProductRelatedCollection($product) { // Поле товара, по которому идёт выборка коллекции $collection_field = 'ean'; $product_data = array(); if (!empty($product[$collection_field])) { $query = $this->db->query("SELECT product_id FROM " . DB_PREFIX . "product WHERE product_id != '" . (int)$product['product_id'] . "' AND status = '1' AND manufacturer_id = '" . (int)$product['manufacturer_id'] . "' AND `" . $this->db->escape($collection_field) . "` LIKE '" . $this->db->escape($product[$collection_field]) . "' ORDER BY sort_order"); foreach ($query->rows as $result) { $product_data[$result['product_id']] = $this->getProduct($result['product_id']); } } return $product_data; } Если у вас много товаров, то стоит зайти в phpMyAdmin и добавить индекс для поля EAN. Это ускорит выборку товаров для коллекции. Добавить индекс можно таким запросом: ALTER TABLE `oc_product` ADD INDEX `ean` (`ean`) Обратите внимание на префикс 'oc_', он у вас может отличаться или отсутствовать.
    1 балл
  7. Введение В данной статье содержится пошаговая инструкция для чистой установки OpenCart 3 club edition. Будет использоваться vps/vds хостинг с панелью ISPmanager. Это одна из самых распространённых панелей управления для веб‑серверов. Добавляем новый сайт в панели ISPmanager Заполняем следующие поля: 1) Доменное имя 2) Режим работы PHP и версию PHP (В данном случае сразу выбран предпочтительный режим Nginx + PHP-FPM) 3) Выбираем "Создать новую базу" 4) Указываем имя новой БД и пользователя 5) Генерируем пароль Сразу сохраните себе данные подключения к БД: Имя базы, логин пользователя и пароль. Эти данные нам понадобятся при установке. После этого нажимаем кнопку "Создать". Следующим шагом будет предложено выпустить бесплатный Let’s Encrypt SSL-сертификат. На данном шаге можно ничего не менять и нажать "Выпустить". При необходимости, можно будет изменить SSL-сертификат сайта позже. Теперь ваш сайт уже будет доступен, хоть он ещё и пустой. Копируем дистрибутив OpenCart 3 club edition на сервер Скопировать файлы дистрибутива на сервер можно через любой ftp клиент. Но для этого нужно настроить в панели ftp доступ. Чтобы не усложнять и не увеличивать объём материала, в данной статье мы рассмотрим вариант загрузки файлов на сервер средствами панели ISPmanager. В первую очередь, чтобы избежать частой ошибки с правами доступа к файлам, нам лучше войти под пользователем www-root перед заливкой файлов. Для этого идём в раздел "Пользователи". Выбираем пользователя "www-root" и нажимаем кнопку "Войти под пользователем". В правом верхнем углу мы будем видеть текущего пользователя "www-root". При необходимости, мы можем кликнуть на имени пользователя и выбрать "Вернуться в root". Для заливки дистрибутива OpenCart на сервер нам нужно перейти в раздел "Менеджер файлов". В менеджере файлов переходим в папку "www" двойным кликом мышки по выделенной области. Там мы увидим уже созданную папку с названием домена вашего сайта. В примере это "mysite.ru". Заходим в эту папку и приступаем к заливке дистрибутива OpenCart 3 club edition на сервер. Для этого нажимаем кнопку "Загрузить" Дальше нажимаем "Выберите файл" и указываем путь к архиву дистрибутива. Актуальную версию сборки OpenCart 3 club edition можно скачать [тут]. После выбора пути к архиву нажимаем кнопку "Загрузить". После завершения загрузки получаем следующую картину: Теперь нам необходимо распаковать архив в текущую папку. Для этого выделяем загруженный архив. Далее кликаем на меню "Архив" и нажимаем "Извлечь". На следующем шаге нам ничего не нужно менять. Просто нажимаем кнопку "Распаковать". После распаковки мы получим следующую картину: В данной ситуации есть очень неудобный момент, что все нужные нам файлы дистрибутива лежат в папке upload, а все лежащие в корневой папке файлы нам не нужны. Если вы опытный пользователь ПК, то вы можете перепаковать архив у себя на компьютере и залить на хостинг архив только с содержимым папки upload. Но, для примера, рассмотрим вариант, как решить данный вопрос без перепаковки архива на локальном компьютере. Это также поможет вам немного улучшить навыки работы в панели управления ISPmanager. Для начала нам необходимо удалить всё ненужное в корневой папке, кроме папки upload. Для этого выделяем всё ненужное, потом нажимаем на меню "Редактировать", и "Удалить". Потом подтверждаем удаление во всплывающем диалоге. Дальше заходим в папку upload (два раза кликнув мышкой на названии папки). Выбираем всё содержимое папки и нажимаем кнопку "Копировать". Теперь очень внимательно выполняем последовательность действий: выбрать корневую папку с сайтом (она будет подсвечена) поставить галочку "Перенести файлы" поставить галочку "Перейти в выбранный каталог" нажать кнопку "Копировать" Осталось сделать небольшие шаги, и можно будет приступать непосредственно к установке OpenCart 3 club edition. Нам нужно удалить теперь уже пустой каталог upload. Выделяем его и удаляем способом, описанным выше. Далее нам необходимо переименовать два конфигурационых файла. Меняем название файла "config-dist.php" на "config.php". И повторяем то же самое с файлом "config-dist.php" в папке "admin". Для этого можно при наведении словить иконку карандаша и кликнуть для изменения имени. Можно изменить имя и другим способом, чтобы не ловить небольшую иконку мышкой. Выделяем файл "config-dist.php", кликаем на меню "Редактировать" и выбираем "Атрибуты". В поле "Имя" меняем имя файла на "config.php" и жмём кнопку "Сохранить". В итоге мы получаем такой список файлов: Далее заходим в папку "admin" и повторяем смену названия для файла "config-dist.php" в этой папке. После этого содержимое папки "admin" должно выглядеть так: Финиш Всё. На этом все наши действия в панели управления выполнены. Для начала установки переходим на наш сайт "http://mysite.ru/" и выполняем установку OpenCart 3 club edition. В следующей статье будет рассмотрен процесс непосредственно установки самой CMS. Очень полезная рекомендация: Не оставляйте на ftp ненужные файлы, бекапы, архивы с дистрибутивами и прочее. Держите файлы вашего сайта в чистоте и порядке, чтобы избежать ненужных проблем в будущем.
    1 балл
  8. Всем привет, дорогие друзья! Статья предназначена для разработчиков дополнений. Пишу без воды, сухо и по делу. Немного истории, нюансов, список аргументов для обработчиков событий, также приведу пример простой и понятной реализации большого кол-ва событий в ваших дополнениях для OpenCart 2.3, 3.x, 4.x (скачать примеры модулей можно будет в конце статьи). Как все начиналось Для изменения кодовой базы движка нам всегда нужно было либо вмешиваться в код, либо использовать vqmod. Использование vqmod порождало проблемы при работе нескольких модификаторов с одним участком кода, а также другие, касающиеся поддержки дополнений. Использование хуков помогло бы решить часть из них. Вспоминаю первую, известную мне реализацию «Override Engine» (2012 г), а также тему «hook pre render Идея и примерная реализация«. Начиная с версии 2.0 (2014 г) в движке появился первый встроенный механизм событий (хуков), а концепция vqmod была реализована в самом движке и получила название ocmod. С версии 2.2 (2016 г) в событиях изменились пути триггеров, они стали аналогичны роутам. В версии 3.x (2017 г) механизм событий и ocmod обошлись без существенных изменений. А с версии 4.x поддержки ocmod больше не будет. «Embrace, extend and extinguish«. Однако, у нас всегда будет vqmod. Зачем нужны события? События позволяют запускать пользовательские функции до/после вызова какой-либо функции в парадигме MVCL+Config+Library для изменения входных/выходных данных. По задумке мэйнтэйнера движка они должны заменить vqmod/ocmod. P.S. Я уже переписал некоторые старые модули с использованием событий. Например, раньше модуль «Персонализованные шаблоны» с помощью ocmod внедрялся в код основных разделов каталога и подменял их шаблоны, а теперь его брат «Custom templates Pro» подменять любой шаблон в движке. Так что события очень хорошо решают некоторые типы задач. Нюансы при использовании событий События могут быть добавлены только из контроллеров админки. Удобнее всего делать это при установке модуля, в функции install. Пути всех триггеров начинаются с названия нужного раздела, admin, catalog или library. Разделы admin и catalog содержат controller, view, language и config. В путях триггеров можно использовать знак «*», чтобы назначать триггеры по маске. Например, catalog/view/*/template/common/header/after. Для изменения данных в обработчиках событий config и language используйте $this->config->set(), $this->language->set(), соответственно. Данные полученные из обработчиков событий можно сохранять внутри класса и использовать их в других обработчиках, которые запускаются позднее. Для редактирования событий из админки используйте «Event Manager» или adminer ([сtrl+click], для быстрого редактирования записи). Нюансы для разных версий движка Код события для версии 2.3 должен иметь длину не более 32 символов. Для версий 3.x и 4.x не более 64. В версии 2.3 событиями (регистрация, удаление и т.д.) занимается модель extension/event, у 3.x и 4.x setting/event. В версии 2.3 в разделе catalog пути триггеров представлений (view) before/after будут отличаться. Например, catalog/view/common/header/before, catalog/view/default/template/common/header/after. Это связано использованием шаблонов оформления в разделе catalog. С версии 3.x добавлен порядок сортировки событий. С версии 4.x у каждого события должен быть description. Триггеры для библиотек (library) доступны только с версии 4.x. Передаваемые аргументы В обработчики событий аргументы передаются по ссылке. Т.е. можно менять значения аргументов не заботясь о передаче результата куда-либо еще. 2.3 controller model view language config before $route, $data $route, $args $route, $data, $output $route $route after $route, $data, $output $route, $args, $output $route, $data, $output $route, $output $route 3.x controller model view language config before $route, $args $route, $args $route, $data, $code $route, $key $route after $route, $data, $output $route, $args, $output $route, $data, $output $route, $key, $output $route 4.x controller model view language config library before $route, $args $route, $args $route, $data, $code $route, $prefix, $code $route $route, $args after $route, $data, $output $route, $args, $output $route, $data, $output $route, $prefix, $code, $data $route, $data $route, $args Возвращаемые значения Помимо изменения данных через аргументы, обработчики событий также могут возвращать значения, используя return. Например, если обработчик события controller/common/home/before вернет через return сгенерированный html код, то весь вывод контроллера common/header будет заменен им, а сам контроллер common/header не будет выполнен, но запустится событие after. Т.е. можно подменять данные выполнения функций без их выполнения. 2.3 controller model view before mixed mixed string after mixed mixed string 3.x controller model view before mixed mixed string after mixed mixed string 4.x controller model view before mixed after mixed Простая и понятная реализация <?php class ControllerExtensionModuleSample extends Controller { public function install() { $this->checkEvent(); } public function uninstall() { $this->removeEvent(); } public function index() { # code } private $_events = [ [ 'code' => 'sample_394beb748918d3ce260756703', 'trigger' => 'admin/controller/design/layout/before', 'action' => '/eventControllerDesignLayoutBefore' ], [ 'code' => 'sample_7a2b613ccb07a2c0e9c8cb844', 'trigger' => 'admin/view/design/layout_list/after', 'action' => '/eventViewDesignLayoutListAfter' ], [ 'code' => 'sample_968b25d7939ec60e0008d670c', 'trigger' => 'admin/model/design/layout/getLayouts/after', 'action' => '/eventModelDesignLayoutGetLayoutsAfter' ], [ 'code' => 'sample_172e1deab50793d6c4bec3b42', 'trigger' => 'catalog/model/design/layout/getLayoutModules/after', 'action' => '/filter' ] ]; public function eventControllerDesignLayoutBefore(&$route, &$args) { # code } public function eventViewDesignLayoutListAfter(&$route, &$data, &$output) { # code } public function eventModelDesignLayoutgetLayoutsAfter(&$route, &$args, &$output) { # code } private function checkEvent() { $this->load->model('extension/event'); foreach($this->_events as $event) { if(!$result = $this->model_extension_event->getEvent($event['code'], $event['trigger'], 'extension/module/sample' . $event['action'])) { $this->model_extension_event->addEvent($event['code'], $event['trigger'], 'extension/module/sample' . $event['action']); } } } private function removeEvent() { $this->load->model('extension/event'); foreach($this->_events as $event) { $this->model_extension_event->deleteEvent($event['code']); } } } Примеры 2.3 sample_2.3.ocmod.zip 3.x sample_3.x.ocmod.zip 4.x sample.ocmod.zip
    1 балл
  9. При покупке товаров в интернет-магазинах, большинство клиентов изучают товар более подробно, просматривая характеристики и описание, пролистывая при этом карточку товара. И когда после изучения всех необходимых подробностей клиент готов купить товар, кнопка покупки уже находится далеко за пределами экрана, что заставляет совершать покупателя дополнительные действия по поиску данной кнопки, чтобы иметь возможность добавить товар в корзину. Эту задачу своим клиентам вы можете упростить, сделав на странице товара небольшую прилипающую панель с названием товара, ценой и кнопкой добавления в корзину, которая будет появляться при исчезновении стационарной кнопки покупки за пределами экрана. Данное нововведение вполне может повлиять на конверсию для вашего интернет-магазина на OpenCart, конечно же, в сторону её увеличения. Посмотреть готовый пример такой реализации можно по ссылке. Как только кнопка покупки уходит за верхнюю границу экрана, внизу показывается прилипающая панель с необходимыми данными. В данной статье будут описаны основные шаги по созданию такого функционала своими руками. Ссылку на готовый пример в виде модуля для OpenCart3 вы сможете найти в конце статьи. При желании, адаптировать модификатор для других версий OpenCart не составит особого труда. Приступим к созданию. Для начала в файле шаблона catalog/view/theme/default/template/product/product.twig добавим сразу после строки: {{ header }} HTML блок со всеми необходимыми нам данными: <div class="psp-wrap" id="product-sticky-panel"> <div class="container"> <div class="psp-content"> ... </div> </div> </div> Код сокращён для наглядности. Полный исходный код можно посмотреть по ссылке в конце статьи. Теперь нам нужно добавить необходимые стили. Для начала сделаем нашу панель прилипающей. Для этого будем использовать position: sticky (заодно пропишем нужные правила для позиционирования нашей панели) .psp-wrap { position: sticky; top: 0; left: 0; right: 0; z-index: 999; } С такими стилями наша панель будет отображаться всегда, а при скроле будет прилипать к верху экрана. Такая реализация не совсем подходит для поставленной цели. Поэтому скроем нашу панель по умолчанию: .psp-wrap:not(.active) { display: none; } !ВНИМАНИЕ! В исходном коде модуля-примера все стили помещаются в <head> страницы. Если стили будут переноситься в css файл, то стиль скрытия надо обязательно оставить в секции <head>, иначе наша панель будет видна, пока не подгрузится файл стилей, а это увеличит совокупное смещение макета (CLS), что соответственно снизит оценку PageSpeed. Теперь наша панель скрыта. Дело остаётся за небольшим скриптом, который добавит нужный класс active для нашей панели в от момент, когда кнопка покупки спрячется за верхней границей экрана. Задача довольно простая, поэтому её лучше решить без использования jQuery. Для данной задачи нам также не нужно активное отслеживание событий onscroll, поэтому здесь как нельзя лучше подойдёт Intersection Observer API. Подробный разбор скрипта в этой статье не приводится, т.к. в интернете хватает документации и примеров по использованию данного API. Действия по отслеживанию будут выполняться вот таким скриптом: document.addEventListener('DOMContentLoaded', () => { let target = document.querySelector('#button-cart'); let psp = document.querySelector('#product-sticky-panel'); target && psp && new IntersectionObserver(([e]) => psp.classList.toggle('active', e.boundingClientRect.y < 0), { threshold:1.0 }).observe(target); }); Полный код этой несложной модификации можно скачать вот тут:
    1 балл
×
×
  • Создать...