Страница 1 из 1

Как конвертировать мод в расширение

Добавлено: 19.10.2013 20:15
Pazh
Вольный перевод статьи https://github.com/nickvergessen/howto- ... phpbb31ext

Как конвертировать моды phpBB 3.0 в расширения phpBB 3.1
Это руководство даст общее представление для авторов модов о необходимых шагах для конвертации модов phpBB 3.0 в расширения phpBB 3.1 на примере мода NV Newspage

Структура расширений
Самым очевидным изменением должно быть место хранения модов/расширений в 3.1.
В phpBB 3.0 все файлы помещались в корневой папке конференции. В версии 3.1 создан специальный каталог для расширений ext/

Каталог
Каждое расширение имеет свой собственный каталог. Однако вы можете (и должны) использовать дополнительный каталог поставщика (с вашим именем автора или названием группы авторов). В случае мода NW newspage файлы будут в каталоге
phpBB/ext/nickvergessen/newspage/
Нет необходимости размещать файлы за пределами этого каталога. Независимо от того, какие это файлы - это могут быть шаблоны, локализация или файлов администраторского раздела. Все они должны быть размещены в папке вашего расширения.
1.png
Значение остальных каталогов, приведенных на рисунке будет описано ниже.

Фронтэнд, перенаправление и службы
В то время как в версии 3.0 вы только создавали новый файл в корневой директории phpbb, то теперь вы можете использовать новую систему контроллеров 3.1. Ваши ссылки изменят вид например с phpbb/newspage.php на phpbb/app.php?controller=newspage в обычном виде, но если добавить небольшое правило в .htaccess то ссылка может быть преобразована в phpbb/newspage

Чтобы связать конкретные правила перенаправления на ваше расширение, вам нужно определить перенаправление в ваших расширениях.
config/routing.yml
Для простого запуска newspages достаточно 2-х правил. Первое правило для основной страницы newspage.php, второе – для нумерации страниц, например newspage.php?start=5. Первое правило устанавливает по умолчанию страницу 1, тогда как второе правило требует, чтобы второй аргумент в ссылке был целым числом.

Код: Выделить всё

newspage_base_controller:
    pattern: /newspage/
    defaults: { _controller: nickvergessen.newspage.controller:base, page: 1 }

newspage_page_controller:
    pattern: /newspage/{page}/
    defaults: { _controller: nickvergessen.newspage.controller:base }
    requirements:
        page:  \d+
Строка, которую мы определили для _controller определяет службу (nickvergessen.newspage.controller) и метод (base) класса, который в этом случае вызывается. Службы определяются в вашем расширении в файле config/services.yml. Службы являются экземплярами классов. Службы вызываются, так что существует только один экземпляр класса, который используется все время. Вы также можете определить аргументы для конструктора вашего класса. Пример определения службы контроллера newspage:

Код: Выделить всё

services:
    nickvergessen.newspage.controller:
        class: phpbb_ext_nickvergessen_newspage_controller_main
        arguments:
            - @auth
            - @cache
            - @config
            - @dbal.conn
            - @request
            - @template
            - @user
            - @controller.helper
            - %core.root_path%
            - %core.php_ext%
Любые службы, которые были ранее объявлены в вашем файле или в файле движка phpBB (phpbb/config/services.yml) могут использоваться в качестве аргумента так же как и некоторые предодопределенные строки (как core.root_path в примере)
ПРИМЕЧАНИЕ: классы из phpbb/ext/ автоматически загружаются по их именам, при этом знак подчеркивание (_) может обозначать подкаталоги. В этом случае класс phpbb_ext_nickvergessen_newspage_controller_main будет находиться в файле phpbb/ext/nickvergessen/newspage /controller/main.php
За более подробной информацией о Перенаправлениях и Службах можете обратиться к документации по Symfony 2.1.

В этом примере мой controller/main.php должен выглядеть следующим образом:

Код: Выделить всё

<?php

/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

class phpbb_ext_nickvergessen_newspage_controller_main
{
    /**
    * Constructor
    * NOTE: The parameters of this method must match in order and type with
    * the dependencies defined in the services.yml file for this service.
    *
    * @param phpbb_auth     $auth       Auth object
    * @param phpbb_cache_service    $cache      Cache object
    * @param phpbb_config   $config     Config object
    * @param phpbb_db_driver    $db     Database object
    * @param phpbb_request  $request    Request object
    * @param phpbb_template $template   Template object
    * @param phpbb_user     $user       User object
    * @param phpbb_controller_helper        $helper     Controller helper object
    * @param string         $root_path  phpBB root path
    * @param string         $php_ext    phpEx
    */
    public function __construct(phpbb_auth $auth, phpbb_cache_service $cache, phpbb_config $config, phpbb_db_driver $db, phpbb_request $request, phpbb_template $template, phpbb_user $user, phpbb_controller_helper $helper, $root_path, $php_ext)
    {
        $this->auth = $auth;
        $this->cache = $cache;
        $this->config = $config;
        $this->db = $db;
        $this->request = $request;
        $this->template = $template;
        $this->user = $user;
        $this->helper = $helper;
        $this->root_path = $root_path;
        $this->php_ext = $php_ext;

        if (!class_exists('bbcode'))
        {
            include($this->root_path . 'includes/bbcode.' . $this->php_ext);
        }
        if (!function_exists('get_user_rank'))
        {
            include($this->root_path . 'includes/functions_display.' . $this->php_ext);
        }
    }

    /**
    * Base controller to be accessed with the URL /newspage/{page}
    * (where {page} is the placeholder for a value)
    *
    * @param int    $page   Page number taken from the URL
    * @return Symfony\Component\HttpFoundation\Response A Symfony Response object
    */
    public function base($page = 1)
    {
        /*
        * Do some magic here,
        * load your data and send it to the template.
        */          

        /*
        * The render method takes up to three other arguments
        * @param    string      Name of the template file to display
        *                       Template files are searched for two places:
        *                       - phpBB/styles/<style_name>/template/
        *                       - phpBB/ext/<all_active_extensions>/styles/<style_name>/template/
        * @param    string      Page title
        * @param    int         Status code of the page (200 - OK [ default ], 403 - Unauthorized, 404 - Page not found, etc.)
        */
        return $this->helper->render('newspage_body.html');
    }
}
Вы также можете иметь несколько различных методов в одном контроллере так же как и иметь несколько контроллеров, для того, чтобы организовать код немного лучше.
Если мы сейчас добавим запись о нашем расширении в таблицу phpbb_ext и пройдем по адресу example.tld/app.php?controller=newspage/, то вы увидите ваш файл шаблона. Поздравляю! Вы только что закончили «Hello World» пример расширения для phpBB 3.1

Модули администраторского раздела
Этот раздел также относится к модераторскому и личному разделу (делать по аналогии).

Как упоминалось ранее эти файлы также должны быть размещены в вашем каталоге расширений. Info-файла, в настоящее время находящийся в каталоге phpbb/includes/acp/info/acp_newspage.php, теперь будет в каталоге ext/nickvergessen/newspage/acp/main_info.php и сам модуль перемещается из phpbb/includes/acp/acp_newspage.php в каталог ext/nickvergessen/newspage/acp/main_module.php. Для того, чтобы иметь возможность автоматически загружать файлы по именам классов мы должны сделать небольшую корректировку самих классов.

Что касается main_info.php нужно привести имя класса из acp_newspage_info к следующему виду phpbb_ext_nickvergessen_newspage_acp_main_info а также изменить значение "filename" в возвращаемом массиве.

Код: Выделить всё

<?php

/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
    exit;
}

class phpbb_ext_nickvergessen_newspage_acp_main_info
{
    function module()
    {
        return array(
            'filename'  => 'phpbb_ext_nickvergessen_newspage_acp_main_module',
            'title'     => 'ACP_NEWSPAGE_TITLE',
            'version'   => '1.0.1',
            'modes'     => array(
                'config_newspage'   => array('title' => 'ACP_NEWSPAGE_CONFIG', 'auth' => 'acl_a_board', 'cat' => array('ACP_NEWSPAGE_TITLE')),
            ),
        );
    }
}
В случае с модулем, я просто указываю имя класса

Код: Выделить всё

<?php

/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
    exit;
}

class phpbb_ext_nickvergessen_newspage_acp_main_module
{
    var $u_action;

    function main($id, $mode)
    {
        // Your magic stuff here
    }
}
И там вы видите. Ваш администраторский модуль расширения теперь может быть добавлен в Администраторском разделе, и вы только что закончили очередной шаг успешного преобразования мода в расширение.

Изменение в БД, UMIL заменен на Миграции
Wiki/Migrations
В общем, миграции это аналог UMIL-файлов в phpBB3.0. Они вносят изменения в базу данных от вашего мода / расширения. Самая большая разница между миграциями и UMIL в том, что в то время как у вас один файл с одним массивом в UMIL для всех ваших изменений, у вас будет по одному файлу на каждую версию миграции. Но давайте взглянем на newspage снова.

Код: Выделить всё

$versions = array(
    '1.0.0' => array(
        'config_add' => array(
            array('news_number', 5),
            array('news_forums', '0'),
            array('news_char_limit', 500),
            array('news_user_info', 1),
            array('news_post_buttons', 1),
        ),
        'module_add' => array(
            array('acp', 'ACP_CAT_DOT_MODS', 'NEWS'),

            array('acp', 'NEWS', array(
                    'module_basename'   => 'newspage',
                    'module_langname'   => 'NEWS_CONFIG',
                    'module_mode'       => 'overview',
                    'module_auth'       => 'acl_a_board',
                ),
            ),
        ),
    ),
    '1.0.1' => array(
        'config_add' => array(
            array('news_pages', 1),
        ),
    ),
    '1.0.2' => array(),
    '1.0.3' => array(
        'config_add' => array(
            array('news_attach_show', 1),
            array('news_cat_show', 1),
            array('news_archive_per_year', 1),
        ),
    ),
);
Изменение структуры БД
Newspage не изменяет структуру БД, поэтому рассмотрим пример из Wiki.
В основном требуется два метода класса в вашем файле миграции:

Код: Выделить всё

public function update_schema()
и

Код: Выделить всё

public function revert_schema()
которые оба возвращают массив с изменениями

Код: Выделить всё

public function update_schema()
{
    return array(
        'add_columns'        => array(
            $this->table_prefix . 'groups'        => array(
                'group_teampage'    => array('UINT', 0, 'after' => 'group_legend'),
            ),
            $this->table_prefix . 'profile_fields'    => array(
                'field_show_on_pm'        => array('BOOL', 0),
            ),
        ),
        'change_columns'    => array(
            $this->table_prefix . 'groups'        => array(
                'group_legend'        => array('UINT', 0),
            ),
        ),
    );
}

public function revert_schema()
{
    return array(
        'drop_columns'        => array(
            $this->table_prefix . 'groups'        => array(
                'group_teampage',
            ),
            $this->table_prefix . 'profile_fields'    => array(
                'field_show_on_pm',
            ),
        ),
        'change_columns'    => array(
            $this->table_prefix . 'groups'        => array(
                'group_legend'        => array('BOOL', 0),
            ),
        ),
    );
}
Метод revert_schema() должен откатить все изменения, сделанные методом update_schema()

Изменение данных
Изменения данных, как добавление модулей, прав и настроек, обеспечиваются функцией update_data ().

Эта функция так же возвращает массив. Например для версии 1.0.0 обновление из newspage выглядит следующим образом:

Код: Выделить всё

public function update_data()
{
    return array(
        array('config.add', array('news_number', 5)),
        array('config.add', array('news_forums', '0')),
        array('config.add', array('news_char_limit', 500)),
        array('config.add', array('news_user_info', 1)),
        array('config.add', array('news_post_buttons', 1)),

        array('module.add', array(
            'acp',
            'ACP_CAT_DOT_MODS',
            'ACP_NEWSPAGE_TITLE'
        )),
        array('module.add', array(
            'acp',
            'ACP_NEWSPAGE_TITLE',
            array(
                'module_basename'   => 'phpbb_ext_nickvergessen_newspage_acp_main_module',
                'modes'             => array('config_newspage'),
            ),
        )),

        array('config.add', array('newspage_mod_version', '1.0.0')),
    );
}
Дополнительную информацию об этом инструменте изменения данных вы можете найти в Wiki Migrations/Tools.

Зависимости и окончание миграции
Ваш файл миграции нуждается еще в двух вещах. Первое, это проверка, которая позволяет phpBB увидеть установлена ли ранее эта миграция, хотя она и не запускалась еще (при обновлении с мода 3.0 в расширение 3.1).

Самый простой способ для проверки может быть версия мода, но когда вы добавляете столбцы в таблицы, вы также можете проверить, существуют ли они:

Код: Выделить всё

public function effectively_installed()
{
    return isset($this->config['newspage_mod_version']) && version_compare($this->config['newspage_mod_version'], '1.0.0', '>=');
}
Т.к. файлы миграции могут иметь любые имена, phpBB может быть не сможет отсортировать файлы миграции правильно. Чтобы избежать этой проблемы, можно определить набор зависимостей, которые должны быть установлены до того как миграция может быть установлена. phpBB постарается установить их, перед установкой миграции. Если они не могут быть найдены или установлены, установка миграции не будет выполнена также. Для миграции 1.0.0 я только потребую 3,1-DEV миграцию:

Код: Выделить всё

static public function depends_on()
{
    return array('phpbb_db_migration_data_310_dev');
}
Все дальнейшие обновления могут теперь требовать эту миграцию и требовать также 3,1-DEV миграцию.

Полный файл может выглядеть следующим образом:

Код: Выделить всё

<?php
/**
*
* @package migration
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-license.php GNU Public License v2
*
*/

class phpbb_ext_nickvergessen_newspage_migrations_1_0_0 extends phpbb_db_migration
{
    public function effectively_installed()
    {
        return isset($this->config['newspage_mod_version']) && version_compare($this->config['newspage_mod_version'], '1.0.0', '>=');
    }

    static public function depends_on()
    {
        return array('phpbb_db_migration_data_310_dev');
    }

    public function update_data()
    {
        return array(
            array('config.add', array('news_number', 5)),
            array('config.add', array('news_forums', '0')),
            array('config.add', array('news_char_limit', 500)),
            array('config.add', array('news_user_info', 1)),
            array('config.add', array('news_post_buttons', 1)),

            array('module.add', array(
                'acp',
                'ACP_CAT_DOT_MODS',
                'ACP_NEWSPAGE_TITLE'
            )),
            array('module.add', array(
                'acp',
                'ACP_NEWSPAGE_TITLE',
                array(
                    'module_basename'   => 'phpbb_ext_nickvergessen_newspage_acp_main_module',
                    'modes'             => array('config_newspage'),
                ),
            )),

            array('config.add', array('newspage_mod_version', '1.0.0')),
        );
    }
}
Добавление файлов локализации расширения
Т.к. файл локализации в вашем расширении не может быть добавлен функцией $user->add_lang(), вы должны использовать метод $user->add_lang_ext(). Этот метод на вход принимает 2 аргумента: первый – полное имя расширения (включая имя поставщика), второй – имя файла или массив имен файлов. Таким образом для локализации newspages нужно вызвать

Код: Выделить всё

$user->add_lang_ext('nickvergessen/newspage', 'newspage');
для загрузки из файла phpbb/ext/nickvergessen/newspage/language/en/newspage.php

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

Для того, чтобы это сделать, я использовал определение переменной шаблона в page_header ()-функции PHPBB, а затем редактировал overall_header.html. Но это 3.1, поэтому мы не хотели больше редактировать файлы и добавили взамен События. С событиями вы можете подключиться в нескольких местах и выполнить свой код, без редактирования файлов.

События phpBB
Таким образом, вместо добавления

Код: Выделить всё

$template->assign_vars(array(
    'U_NEWSPAGE'    => append_sid($phpbb_root_path . 'app.' . $phpEx, 'controller=newspage/'),
));
в page_header(), мы вставим это в диспетчер событий, который затем вызовет, page_header() всегда вызывается.
Так мы добавляем файл event/main_listener.php в наше расширение, который наследует некий класс Symfony:

Код: Выделить всё

<?php

/**
*
* @package NV Newspage Extension
* @copyright (c) 2013 nickvergessen
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/

/**
* @ignore
*/

if (!defined('IN_PHPBB'))
{
    exit;
}

/**
* Event listener
*/
use Symfony\Component\EventDispatcher\EventSubscriberInterface;

class phpbb_ext_nickvergessen_newspage_event_main_listener implements EventSubscriberInterface
{
}
В методе getSubscribedEvents() мы говорим системе уведомления о каких событиях мы хотим получить и какая функция должна быть исполнена. В нашем случае мы хотим подписаться на событие core.page_header (полный список событий вы можете найти по ссылке)

Код: Выделить всё

static public function getSubscribedEvents()
    {
        return array(
            'core.page_header'              => 'add_page_header_link',
        );
    }
Теперь мы добавим функцию, которая будет вызываться:

Код: Выделить всё

public function add_page_header_link($event)
    {
        global $user, $template, $phpbb_root_path, $phpEx;

        // I use a second language file here, so I only load the strings global which are required globally.
        // This includes the name of the link, aswell as the ACP module names.
        $user->add_lang_ext('nickvergessen/newspage', 'newspage_global');

        $template->assign_vars(array(
            'U_NEWSPAGE'    => append_sid($phpbb_root_path . 'app.' . $phpEx, 'controller=newspage/'),
        ));
    }
и мы закончили с редактированием php. Ваши пользователи не будут получать конфликтов при поиске блоков файлов и других вещей, потому что другой мод уже отредактировал код. Снова как с контроллерами, вы можете иметь несколько диспетчеров в каталоге событий, так же как подписаться на несколько событий в одном диспетчере.

События шаблонов
Теперь единственное, что осталось, это, добавление кода в HTML. Для шаблонов нужно по одному файлу на события.
В связи с этим имя файла содержит название события. Для того, чтобы добавить ссылку newspage после ссылки FAQ, мы должны использовать overall_header_navigation_prepend-событие (полный список событий вы можете найти по ссылке )

Таким образом, мы добавим styles/prosilver/template/events/overall_header_navigation_prepend_listener.html в каталог расширений и добавить HTML код в него.

Код: Выделить всё

<li class="icon-newspage"><a href="{U_NEWSPAGE}">{L_NEWSPAGE}</a></li>
И это все. Никакого редактирования файлов шаблона не треуется.

Добавление событий.
Вы также можете добавлять события в ваши php файлы и шаблоны расширения. Если вам не хватает событий из движка, пожалуйста, создайте тему в форуме [3.x] Event Requests - и мы включим его в следующем выпуске. Мы стараемся включать огромный набор событий по умолчанию, но, конечно, мы не можем охватить все места движка где вашим модам потребуется событие.
Основное завершено!
И это все, Модификация 3.0 была успешно преобразована в расширение 3.1.

Совместимость
По некоторым причинам совместимость функций и классов не может быть сохранена, при одновременном ускорении их работы. Список изменений Вы можете увидеть в вики-статье о PhpBB3.1

Нумерация страниц (пагинация)
Когда вы используете ваш старый код 3.0 вы получите ошибку на подобии следующей

Код: Выделить всё

Fatal error: Call to undefined function generate_pagination() in ...\phpBB3\ext\nickvergessen\newspage\controller\main.php on line 534
Проблема в том, что пагинация теперь не возвращается функцией, а вместо этого сразу автоматически вставляется в шаблон. На этом же этапе, имя функции было обновлено с PhpBB-префиксом.

Старый код нумерации страниц был похож на:

Код: Выделить всё

$pagination = generate_pagination(append_sid("{$phpbb_root_path}app.$phpEx", 'controller=newspage/'), $total_paginated, $config['news_number'], $start);

    $this->template->assign_vars(array(
        'PAGINATION'        => $pagination,
        'PAGE_NUMBER'       => on_page($total_paginated, $config['news_number'], $start),
        'TOTAL_NEWS'        => $this->user->lang('VIEW_TOPIC_POSTS', $total_paginated),
    ));
Новый код должен выглядеть так:

Код: Выделить всё

$base_url = append_sid("{$phpbb_root_path}app.$phpEx", 'controller=newspage/');
    phpbb_generate_template_pagination($this->template, $base_url, 'pagination', 'start', $total_paginated, $this->config['news_number'], $start);

    $this->template->assign_vars(array(
        'PAGE_NUMBER'       => phpbb_on_page($this->template, $this->user, $base_url, $total_paginated, $this->config['news_number'], $start),
        'TOTAL_NEWS'        => $this->user->lang('VIEW_TOPIC_POSTS', $total_paginated),
    ));

Re: Как конвертировать мод в расширение

Добавлено: 19.10.2013 20:55
xisp
Вот такой вопрос- а автоустановщик всего этого есть? Ну то есть понятно, что для установки нужно всего лишь распаковать архив с модом расширением в папку, но ведь для этого нужно лезть на фтп сторонними средствами. Неужели в движке нет функции закачки архива с модом и его автораспаковки в нужную папку?
Если нет- надо сделать.

Re: Как конвертировать мод в расширение

Добавлено: 07.01.2014 21:37
x00peR
Pazh, спасибо за статью. Прочитал все, правда мало чего понял в силу отсутствия знаний. Но было интересно.

Добавлено спустя 20 секунд:
Есть ли уже какие то расширения готовые?

Добавлено спустя 2 минуты 56 секунд:
Так, стоп! Не понял. Для установки расширения - залил и включил, дальше все сам сделает. При этом правки файлов не делаются?
Т.е. моды можно ставить различные и конфликтов не будет. Верно?

Re: Как конвертировать мод в расширение

Добавлено: 07.01.2014 22:01
Sherlock
x00peR писал(а):При этом правки файлов не делаются?
Да.
x00peR писал(а):Т.е. моды можно ставить различные и конфликтов не будет. Верно?
Не факт.
x00peR писал(а):Есть ли уже какие то расширения готовые?
Есть — https://www.phpbb.com/community/viewforum.php?f=456 Только они — [DEV]

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 4:34
Пчелкин
Sherlock писал(а):Не факт.
Абсолютно не факт.. Мелкота на Денвере подцепляется, серьезные моды просто кладут форум... Все равно нужны какие-то допилки...но вот какие!!! И как!!! Вопрос...

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 8:21
владимир1983
Что значит "кладут"? С каким расширением проблема?

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 9:14
Пчелкин
А фиг его знает... Пихал по новой системе туда Аркаду...Мож что не врубился, мож еще что - форум просто выдавал кучу ошибок и все...ни форума, ни админки... Подождем более подробных разжевок об установке модов на новую платформу...Мож кто все по полочкам разложит... Станет понятно ... Пока - нет

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 12:30
rxu
Пихать мод от 3.0 в 3.1 - удовольствие ниже среднего. В 3.1 модов нет вообще, есть только расширения. Пока этот мод не сконвертируют в расширение (автор, или кто-то еще) - так и будете ошибки получать.

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 13:25
Пчелкин
rxu писал(а):Пока этот мод не сконвертируют в расширение
Дак вот... пока пылимся на денвере... девственные...

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 13:29
Sherlock
Пчелкин
Попробуй поставить отсюда какое-то расширение — https://www.phpbb.com/community/viewforum.php?f=456

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 13:41
Пчелкин
Эту мелочь я уже пихал...там мне нужных всего две... увы..

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 13:52
Sherlock
Пчелкин
Так подожди немного сделают скоро стабильный релиз phpBB 3.1. А авторы возможно захотят переделать свои моды в расширение.

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

Re: Как конвертировать мод в расширение

Добавлено: 08.01.2014 14:12
Пчелкин
А я думаю что обнову можно будет накатить на существующее... Верю... И пусть все остается как есть... А мож у меня такой стиль навороченный? Тогда как? Стили то бывают разные...Даж покруче чем кое у кого...