Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Кроссверсионные решения для создания/поддержки модулей OpenCart 2.x


Recommended Posts

При поддержке модулей для OpenCart 2.x столкнулся с трудностями поддержки модулей, связанного с постоянным обновлением кода движка. Сразу скажу, что Ваш подход к решению проблемы поддержки и версионирования своих модулей может отличаться от моего. Думаю было бы полезно поделиться с сообществом кроссверсионными решениями для поддержки модулей на ветке 2.x и взамен получить то же самое.

 

1. Загрузка шаблонов и изображения языков в админке [2.0-2.2]. С версии 2.2 при загрузке шаблона убрано указание полного пути к файлу шаблона, вместо этого используется $this->load->view('gallery/gallery'). Пути к изображениям языков тоже подверглись изменению.

Раздел админки

if (version_compare('2.2', VERSION) <= 0) {

    foreach ($data['languages'] as $key => $language) {
        $data['languages'][$key]['imgsrc'] = 'language/' . $language['code'] . '/' . $language['code'] . '.png';
    }

    $this->response->setOutput($this->load->view('gallery/album_form', $data));
}else{
    foreach ($data['languages'] as $key => $language) {
        $data['languages'][$key]['imgsrc'] = 'view/image/flags/' . $language['image'];
    }

    $this->response->setOutput($this->load->view('gallery/album_form.tpl', $data));
}

Вывод изображения языка в админке:

<img src="<?php $language['imgsrc']; ?>" title="<?php $language['name']; ?>"> 

Раздел каталога

if (version_compare('2.2', VERSION) <= 0) {
    $this->response->setOutput($this->load->view('gallery/gallery', $data));
}else{
    if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/gallery/gallery.tpl')) {
        $this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/gallery/gallery.tpl', $data));
    } else {
        $this->response->setOutput($this->load->view('default/template/gallery/gallery.tpl', $data));
    }
} 

У модулей каталога вместо $this->response->setOutput будет return.

 

 

2. Загрузка модели customer_groups в админке [2.0 - 2.2]. C версии 2.0.3.1 модель админки sale/customer_group переехала в customer/customer_group.

if (version_compare('2.0.3.1', VERSION) <= 0) {
    $this->load->model('customer/customer_group');
    $data['customer_groups'] = $this->model_customer_customer_group->getCustomerGroups();
}else{
    $this->load->model('sale/customer_group');
    $data['customer_groups'] = $this->model_sale_customer_group->getCustomerGroups();
}

 

3. serialize vs json_encode в таблице oc_setting при работе не через встроенные модели [2.0 - 2.x]. С версии 2.1.0.0 вместо serialize используется json_encode для столбца value таблицы oc_setting

<?php

function oc_serialize($value){
    if (version_compare('2.1.0.0', VERSION) <= 0) {
        return json_encode($value);
    }else{
        return serialize($value);
    }
}

function oc_unserialize($value){
    if (version_compare('2.1.0.0', VERSION) <= 0) {
        return json_decode($value, true);
    }else{
        return unserialize($value);
    }
}

?>
  • +1 3
Надіслати
Поділитися на інших сайтах

вот с собственными языковыми файлами сделал тупо, но бронебойно

вместо манипуляций с переименованиями дублирую обе папки (типа english и en-gb) :ugeek:

Надіслати
Поділитися на інших сайтах

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

Я для каждой сильно измененной версии движка создаю отдельную версию модуля. В принципе версий движка не много: 1.5 (1.5.5 и 1.5.6 похожи, 1.5.4 и ниже уже сильно устарели, их можно вообще не поддерживать), 2.0-2.1, 2.2 

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

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

Надіслати
Поділитися на інших сайтах

если все эти отдельные версии модуля (к примеру, для 2000-2031, 2101-2102 и 2.2х) доступны в одном архиве - так целиком архив и уйдет..

 

а в целом - кому как удобней

кто на версии разделяет, кто одну универсальную делает

Надіслати
Поділитися на інших сайтах

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

Так что мой подход совпадает с @sv2109. Пакую отдельные версии. Отпочковываю, когда версия меняется настолько, что такие проверки не спасут. А это не редкость сейчас.

Надіслати
Поділитися на інших сайтах


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

Надіслати
Поділитися на інших сайтах

Не в том дело. Речь не о подходах или вкусах. Речь вообще о применимости. Если модуль - это вагон изменений в XML (как микроразметка, например) - толку от этих решений ноль. Их просто некуда применить.

Надіслати
Поділитися на інших сайтах


  • 1 month later...

Загрузка библиотек (library)[2.0-2.3] В версии 2.1.x.x был убран loader библиотек (library), потом его снова добавили, в 2.2. 

if (version_compare('2.1', substr(VERSION, 0, 3)) == 0) {

    $this->humanizer         = new Security\humanizer($registry);
    $this->directory_scanner = new Security\directory_scanner($registry);
    $this->fs_scans          = new Security\fs_scans($registry);

} else {

    $this->load->library('security/humanizer');
    $this->load->library('security/directory_scanner');
    $this->load->library('security/fs_scans');

} 

$registry я передаю потому что у меня в библиотеках используются языковые переменные

function __construct($registry)
{
    $this->language = $registry->get('language');
} 

А при использовании $this->load->library она передается всегда. 

Змінено користувачем halfhope
  • +1 2
Надіслати
Поділитися на інших сайтах

  • 1 year later...

Да какое..

Только привык к хорошему :) тебе сразу по рукам - на тебе user_token
и только в нужное место, больше никуда, а раньше, куда хотел туда и добавлял.

  • +1 1
Надіслати
Поділитися на інших сайтах

Вот будет потеха, когда начнется прописывание ссылок в 3-ке

 

добавляется еще один параметр - language_id

  • +1 1
Надіслати
Поділитися на інших сайтах

Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.