Создание своей темы OpenCart 4.x на основе стандартной :: Cетевой уголок Majestio

Создание своей темы OpenCart 4.x на основе стандартной


Данная статья не является частью официальной документации по О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" на нужные вам.

Рейтинг: 0/5 - 0 голосов