Данная статья не является частью официальной документации по ОpenCart 4.x. Более похожа на документирование собственных попыток "сабжа". Нынешнее подключение/создание тем оформления в OpenCart 4.x, если честно, мне совсем не нравится. Пользоваться этой статьёй или нет - каждый решает для себя сам. Я пользоваться буду
Буду создавать новую тему под названием "Majestio". Тема создается и тестируется для версии OpenCart 4.0.2.3-rs. Все названия каталогов будут в "windows-нотации", так как разработка ведется под M$ Windows, с использованием OpenServer.
1. После устанавливки OpenCart 4 копируем каталог "extension\opencart"
со всем содержимым под именем "extension\majestio"
2. В каталог "extension\majestio"
копируем Perl-скрипт build.pl и там его запускаем, предварительно подредактировав его под свои нужды (просто изменить все вхождения слова "Majestio" под свое название, регистр имеет значение!). Да, нужен будет Perl 5.
#!/usr/bin/perl
# -------------------------------------------------------------------------------------------
# Скрипт для внесения изменений в файлы стандартной темы OpenCart 4.0.2.3-RS
#
# 2024 (С) Majestio, https://majestio.info
# -------------------------------------------------------------------------------------------
use strict;
use warnings;
no warnings 'experimental::smartmatch';
use utf8;
use v5.24;
use File::Path qw(make_path);
use File::Find;
use File::Copy;
use File::Basename;
use Win32::Console::ANSI;
use lib 'E:/Documents/3.Projects/Perl/libs'; # <--- тут указываем где будет лежать Majestio.pm
use Majestio qw(ReadFile WriteFile ReadDirs);
use open ':std', ':encoding(UTF-8)';
# перезаписываем install.json
my $txt = '{
"name": "Majestio Extensions",
"version": "1.0",
"author": "Majestio Lab",
"link": "https://majestio.info",
"instruction": "",
}';
Majestio::WriteFile('install.json', $txt);
# создаем список файлов для обработки
my @files;
find(
sub {
return if -d; # Пропускаем каталоги
my ($filename, $directories, $suffix) = fileparse($_, qr/\.[^.]*/);
push @files,
{
path => $File::Find::dir,
filename => $filename,
extension => $suffix =~ s/\.//r
};
},
"."
);
foreach my $file (@files) {
my $filename = $file->{path} . "/" . $file->{filename} . "." . $file->{extension};
say $filename;
if ($file->{extension} ~~ ['php', 'twig']) {
my @data = split("\n", Majestio::ReadFile($filename));
foreach my $i (@data) {
if ($file->{extension} eq 'php') {
$i =~ s/namespace Opencart\\Admin\\Controller\\Extension\\Opencart\\/namespace Opencart\\Admin\\Controller\\Extension\\Majestio\\/g;
$i =~ s/namespace Opencart\\Admin\\Model\\Extension\\Opencart/namespace Opencart\\Admin\\Model\\Extension\\Majestio/g;
$i =~ s/'extension\/opencart\/captcha\/basic/'extension\/majestio\/captcha\/majestio/g;
$i =~ s/'extension\/opencart\/theme\/basic/'extension\/majestio\/theme\/majestio/g;
$i =~ s/'extension\/opencart/'extension\/majestio/g;
$i =~ s/'captcha_basic_status'/'captcha_majestio_status'/g;
$i =~ s/'captcha_basic'/'captcha_majestio'/g;
$i =~ s/'theme_basic_status'/'theme_majestio_status'/g;
$i =~ s/'theme_basic'/'theme_majestio'/g;
$i =~ s/Basic Captcha/Majestio Captcha/g;
$i =~ s/Простая защита/Majestio защита/g;
$i =~ s/Стандартная тема/Majestio тема/g;
$i =~ s/Default Store Theme/Majestio Theme/g;
$i =~ s/class Basic extends/class Majestio extends/g;
}
if ($file->{extension} eq 'twig') {
$i =~ s/captcha_basic_status/captcha_majestio_status/g;
$i =~ s/theme_basic_status/theme_majestio_status/g;
$i =~ s/index\.php\?route=extension\/opencart\/captcha\/basic\.captcha/index\.php\?route=extension\/majestio\/captcha\/majestio\.captcha/g;
}
}
Majestio::WriteFile($filename, join("\n", @data));
move($filename, $file->{path} . "/majestio." . $file->{extension}) if ($file->{filename} eq 'basic');
}
if ($file->{extension} eq 'png' && $file->{filename} eq 'basic') {
move($file->{path} . "/" . $file->{filename} . "." . $file->{extension}, $file->{path} . "/majestio." . $file->{extension});
}
}
package Majestio;
use strict;
use warnings;
use utf8;
use Win32::Console::ANSI;
our @EXPORT = qw(ReadFile WriteFile ReadDirs ReadFiles LogPrint);
our $VERSION = '1.00';
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub ReadFile {
my $name = shift;
open(my $fh, '<:encoding(UTF-8)', $name) || die "Error open file '$name' to read: $!";
my $ret = join("", <$fh>);
close($fh);
return $ret;
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub WriteFile {
my ($name, $data) = @_;
open(my $fh, '>:encoding(UTF-8)', $name) || die "Error open file '$name' to write: $!";
print $fh $data;
close($fh);
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub ReadDirs {
my $name = shift;
my @ret = ();
opendir my $dh, $name || die "Error open dir '$name' for reading: $!\n";
while (my $file = readdir($dh)) {
push @ret, $file if (-d "$name/$file" && $file ne "." && $file ne "..");
}
closedir $dh;
return @ret;
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub ReadFiles {
my $name = shift;
my @ret = ();
opendir my $dh, $name || die "Error open dir '$name' for reading: $!\n";
while (my $file = readdir($dh)) {
push @ret, $file if (-f "$name/$file");
}
closedir $dh;
return @ret;
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
sub LogPrint {
my $txt = shift;
print "\e[2K\r$txt";
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1;
3. В конце файла "extension\majestio\admin\controller\theme\majestio.php"
добавляем два метода:
public function install(): void {
if ($this->user->hasPermission('modify', 'extension/theme')) {
// Add startup to catalog
$startup_data = [
'code' => 'majestio',
'description' => 'Majestio theme extension',
'action' => 'catalog/extension/majestio/startup/majestio',
'status' => 1,
'sort_order' => 2
];
// Add startup for admin
$this->load->model('setting/startup');
$this->model_setting_startup->addStartup($startup_data);
}
}
public function uninstall(): void {
if ($this->user->hasPermission('modify', 'extension/theme')) {
$this->load->model('setting/startup');
$this->model_setting_startup->deleteStartupByCode('majestio');
}
}
4. Создаем файл "extension\majestio\catalog\controller\startup\majestio.php"
следующего содержания:
<?php
namespace Opencart\Catalog\Controller\Extension\Majestio\Startup;
class Majestio extends \Opencart\System\Engine\Controller {
public function index(): void {
if ($this->config->get('config_theme') == 'majestio' && $this->config->get('theme_majestio_status')) {
// Add event via code instead of DB
// Could also just set view/common/header/before
$this->event->register('view/*/before', new \Opencart\System\Engine\Action('extension/majestio/startup/majestio.event'));
}
}
public function event(string &$route, array &$args, mixed &$output): void {
$override = [
'common/header',
'common/footer',
];
if (in_array($route, $override)) {
$route = 'extension/majestio/' . $route;
}
}
}
5. Для внесения изменений в шапку и подножие сайта для этой темы копируем и изменяем скопированные файлы (они будут подхватываться, т.к. зареганы на шаге 4):
"catalog\view\template\common\header.twig"
-> "extension\majestio\catalog\view\template\common\header.twig"
"catalog\view\template\common\footer.twig"
-> "extension\majestio\catalog\view\template\common\footer.twig"
6. Собираем пакет расширения - для этого создаем архив из каталога и его подкаталогов, архив называем majestio.ocmod.zip
и помещаем его в каталог "storage\marketplace"
(обычно он выше public_html
).
7. Очищаем кэш - содержимое каталога "storage\cache"
8. Перезагружаем страничку админки "Модули / Расширения -> Установка расширений", устанавливаем модуль расширения "Majestio Extensions"
9. Переходим на страничку админки "Модули / Расширения -> Модули / Расширения", в фильтре выбираем "Темы", добавляем "Majestio тема"
10. Заходим в "Интернет магазин Opencart "Русская сборка"" этого расширения и меняем статус на "Включено"
11. В настройках магазина применяем только что подключённую тему.
Во всех кусках приведенного PHP-кода также следует заменить все вхождения слов "Majestio" на нужные вам.