В новой версии движка phpBB 3.1 создание страницы в стиле конференции в сущности сводится к созданию расширения.
Поехали!
Первым шагом следует создать структуру папок для вашего расширения. Для этого в папке ext создадим новую папку и назовем ее, например sheer. Далее в этой папке создадим папку, например, mytest - здесь и будут находиться все файлы, необходимые для работы нашей страницы-расширения.
NB! в названии папок не допускаются тире и знаки подчёркивания!
В папке mytest в обязательном порядке должен находиться файл Файл composer.json. В нашем случае его содержимое будет таким:
Код: Выделить всё
{
    "name": "sheer/mytest",
    "type": "phpbb-extension",
    "description": "Description for my test",
    "homepage": "http://phpbbguru.net",
    "version": "0.0.1",
    "time": "2014-01-11",
    "license": "GPL-2.0",
    "authors": [
        {
            "name": "Sheer",
            "homepage": "http://phpbbguru.net",
            "role": "Developer"
        }
    ],
    "require": {
        "php": ">=5.3.3"
    },
    "extra": {
        "display-name": "My Test extension",
        "soft-require": {
            "phpbb/phpbb": "3.1.*@dev"
        }
    }
}NB! В имени вендора (разработчика - sheer) и в имени проекта (mytest) должно быть не менее 2-х символов.
Далее в папке mytest создадим следующие папки:
config\
controller\
event\
language\ru\
styles\prosilver\template\event\
migrations\
На первом этапе не все потребуются, но мы создадим их загодя.
Далее в папке config создадим файл services.yml следующего содержания:
Код: Выделить всё
services:
    sheer.mytest.listener:
        class: sheer\mytest\event\listener
        tags:
            - { name: event.listener }В папке event создадим файл подписчик на события или слушатель. Наличие подписчика обязательно. Назовем его listener.php
Код: Выделить всё
<?php
/**
*
* @package mytest
* @copyright (c) 2014 Sheer
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace sheer\mytest\event;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
/**
* Event listener
*/
class listener implements EventSubscriberInterface
{
/**
* Assign functions defined in this class to event listeners in the core
*
* @return array
* @static
* @access public
*/
    static public function getSubscribedEvents()
    {
        return array();
    }
}Поздравляю, наше первое расширение создано, можно проверить, перейдя в Администраторский раздел "Персонализация-->Управление расширениями".
Создаем контроллер
Ну сделано-то сделано, вот только ничего оно не делает. Посему настало время сотворить нечто такое, чтобы на нашей странице чего-нибудь отображалось, ну хотя-бы сначала заголовок.
Итак, приступим. Сначала создадим html-шаблон страницы, назовем его mytest_body.html и запишем его в папку ext/sheer/mytest/styles/prosilver/template
Код: Выделить всё
<!-- INCLUDE overall_header.html -->
<h2>{L_TEST_PAGE_TITLE}</h2>
<!-- INCLUDE overall_footer.html -->NB! На время создания и отладки расширения включите перекомпиляцию шаблонов в Администраторском разделе: ОБЩИЕ-->Конфигурация сервера-->Нагрузка на сервер
Теперь следует объявить "языковую переменную"Перекомпилировать старые шаблоны: Да/Нет
Проверка обновлённых компонентов стилей и повторная их компиляция в случае необходимости.
TEST_PAGE_TITLE. Для этого создадим файл с произвольным именем mytest_lng.php в папке ext/sheer/mytest/language/ru (не забываем про кодировку UTF-8 без BOM)
Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - My Test
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
if (!defined('IN_PHPBB'))
{
    exit;
}
if (empty($lang) || !is_array($lang))
{
    $lang = array();
}
$lang = array_merge($lang, array(
    'TEST_PAGE_TITLE'    => 'Мой тест',
));Код: Выделить всё
        return array();Код: Выделить всё
        return array(
            'core.user_setup'                        => 'load_language_on_setup',
        );Код: Выделить всё
    public function load_language_on_setup($event)
    {
        $lang_set_ext = $event['lang_set_ext'];
        $lang_set_ext[] = array(
            'ext_name' => 'sheer/mytest',
            'lang_set' => 'mytest_lng',
        );
        $event['lang_set_ext'] = $lang_set_ext;
    }Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - My test
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace sheer\mytest\controller;
use Symfony\Component\HttpFoundation\Response;
class mytest
{
    protected $config;
    protected $db;
    protected $auth;
    protected $template;
    protected $user;
    protected $helper;
    protected $phpbb_root_path;
    protected $php_ext;
    public function __construct(\phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\pagination $pagination, \phpbb\db\driver\driver_interface $db, \phpbb\auth\auth $auth, \phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper, $phpbb_root_path, $php_ext, $table_prefix)
    {
        $this->config = $config;
        $this->request = $request;
        $this->pagination = $pagination;
        $this->db = $db;
        $this->auth = $auth;
        $this->template = $template;
        $this->user = $user;
        $this->helper = $helper;
        $this->phpbb_root_path = $phpbb_root_path;
        $this->php_ext = $php_ext;
        $this->table_prefix = $table_prefix;
    }
    public function main()
    {
// Output the page
        $this->template->assign_vars(array(
            'TEST_PAGE_TITLE'    => $this->user->lang('TEST_PAGE_TITLE'),
        ));
        page_header($this->user->lang('TEST_PAGE_TITLE'));
        $this->template->set_filenames(array(
            'body' => 'mytest_body.html'));
        page_footer();
        return new Response($this->template->return_display('body'), 200);
    }
}Код: Выделить всё
sheer_mytest_controller:
    path: /mytest
    defaults: { _controller: sheer.mytest.controller:main }Код: Выделить всё
services:Код: Выделить всё
    sheer.mytest.controller:
        class: sheer\mytest\controller\mytest
        arguments:
            - '@config'
            - '@request'
            - '@pagination'
            - '@dbal.conn'
            - '@auth'
            - '@template'
            - '@user'
            - '@controller.helper'
            - '%core.root_path%'
            - '%core.php_ext%'
            - '%core.table_prefix%'sheer\mytest\controller\mytest размещаются строго в том же порядке, в каком они перечислены в списке аргументов функции __construct.Затем физически чистим кеш и наберем в браузере http://localhost/phpBB31/app.php/mytest (или http://localhost/phpBB31/mytest, если активирован mod_rewrite веб-сервера Apache или другой серверный модуль перенаправления ссылок вместе с настройкой конференции "Настройки сервера - Включить URL Rewriting") (предполагается что конференция установлена на локальной машине в папке home/localhost/www/phpBB31) и... Ура! Заработало!
Рабор полетов
Теперь разберем наш контроллер mytest.php.
Список аргументов в функции __construct нашего класса mytest:
Код: Выделить всё
public function __construct(\phpbb\config\config $config, \phpbb\request\request_interface $request, \phpbb\pagination $pagination, \phpbb\db\driver\driver_interface $db, \phpbb\auth\auth $auth, \phpbb\template\template $template, \phpbb\user $user, \phpbb\controller\helper $helper, $phpbb_root_path, $php_ext, $table_prefix)Код: Выделить всё
        $this->config = $config;
        $this->request = $request;
        $this->pagination = $pagination;
        $this->db = $db;
        $this->auth = $auth;
        $this->template = $template;
        $this->user = $user;
        $this->helper = $helper;
        $this->phpbb_root_path = $phpbb_root_path;
        $this->php_ext = $php_ext;
        $this->table_prefix = $table_prefix;Код: Выделить всё
    protected $config;
    protected $db;
    protected $auth;
    protected $template;
    protected $user;
    protected $helper;
    protected $phpbb_root_path;
    protected $php_ext;Код: Выделить всё
        class: sheer\mytest\controller\mytest
        arguments:
            - '@config'
            - '@request'
            - '@pagination'
            - '@dbal.conn'
            - '@auth'
            - '@template'
            - '@user'
            - '@controller.helper'
            - '%core.root_path%'
            - '%core.php_ext%'
            - '%core.table_prefix%'@template нам пока не нужны, но востребуются в дальнейшем, поэтому включим их загодя.Как добавить ссылку в меню (навигацию) в шапке?
В самом деле, в навигацию нужно же добавить ссылку на нашу страницу. Для изменения шапки существует несколько событий, например:
- core.page_header
- core.page_header_after
- navbar_header_quick_links_after
- navbar_header_quick_links_before
- navbar_header_username_append
- navbar_header_username_prepend
- overall_header_navigation_prepend
Добавим в listener.php после
Код: Выделить всё
            'core.user_setup'                        => 'load_language_on_setup',Код: Выделить всё
            'core.page_header'                        => 'add_page_header_link',Код: Выделить всё
	protected $template;
	protected $phpbb_root_path;
    /**
    * Constructor
    */
    public function __construct(\phpbb\template\template $template, $phpbb_root_path)
    {
        $this->template = $template;
        $this->phpbb_root_path = $phpbb_root_path;
    }Код: Выделить всё
    public function add_page_header_link($event)
    {
        $this->template->assign_vars(array(
            'U_MY_TEST' => append_sid("{$this->phpbb_root_path}mytest"),
        ));
    }Код: Выделить всё
<li>
	<a href="{U_MY_TEST}" title="{L_TEST_PAGE_TITLE}" role="menuitem">
		<i class="icon fa-question-circle fa-fw" aria-hidden="true"></i><span>{L_TEST_PAGE_TITLE}</span>
	</a>
</li>После
Код: Выделить всё
        class: sheer\mytest\event\listenerКод: Выделить всё
        arguments:
            - '@template'
            - '%core.root_path%'Продолжаем разговор
Теперь надо придумать, что будет на нашей странице. Ну давайте список каких-то имен с телефонами из базы данных.
Ну вот так, например
Для этого нужно создать в базе данных конференции какую-то таблицу с ячейками id -- name -- phone с первичным ключем id,
причем таблица должна создаваться при установке нашего расширения автоматически. Для этого в папке ext/sheer/mytest/migrations создадим файл, например version_0_0_1.php
Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - My test
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace sheer\mytest\migrations;
class version_0_0_1 extends \phpbb\db\migration\migration
{
    public function effectively_installed()
    {
        return;
    }
    static public function depends_on()
    {
        return array('\phpbb\db\migration\data\v310\dev');
    }
    public function update_schema()
    {
        return array(
            'add_tables'        => array(
                $this->table_prefix . 'my_test'    => array(
                    'COLUMNS'        => array(
                        'id'            => array('UINT', null, 'auto_increment'),
                        'name'            => array('VCHAR:255', ''),
                        'phone'            => array('VCHAR:255', ''),
                    ),
                    'PRIMARY_KEY'    => 'id',
                ),
            ),
        );
    }
    public function revert_schema()
    {
        return array(
            'drop_tables'        => array(
                $this->table_prefix . 'my_test',
            ),
        );
    }
    public function update_data()
    {
        return array(
            // Current version
            array('config.add', array('mytest_version', '0.0.1')),
        );
    }
}Данные в таблице придется добавить вручную или при помощи SQL-запроса, например
Код: Выделить всё
INSERT INTO phpbb_my_test (name, phone) VALUES
('Вася', '375172232983'), ('Петя', '29717777'), ('Саша', '672242985'), ('Маша', '29710000'), ('Яша', '334442321'), ('Катя', '34876543');Открываем ext/sheer/mytest/styles/prosilver/template/mytest_body.html и после
Код: Выделить всё
<h2>{L_TEST_PAGE_TITLE}</h2>Код: Выделить всё
<div class="forumbg forumbg-table">
	<div class="inner">
		<table class="table1 show-header responsive">
		<thead>
		<tr>
			<th class="name">{L_NAME}</th>
			<th class="name">{L_PHONE}</th>
		</thead>
		<tbody>
<!-- BEGIN row -->
			<tr class="<!-- IF row.S_ROW_COUNT is even -->bg1<!-- ELSE -->bg2<!-- ENDIF -->">
				<td>{row.NAME}</td>
				<td>{row.PHONE}</td>
			</tr>
<!-- END row -->
		</tbody>
		</table>
	</div>
</div>L_NAME и L_PHONE - открываем ext/sheer/mytest/language/ru/mytest_lng.php и после
Код: Выделить всё
    'TEST_PAGE_TITLE'    => 'Мой тест',Код: Выделить всё
    'NAME'                => 'Имя',
    'PHONE'                => 'Телефон',Код: Выделить всё
        $this->table_prefix = $table_prefix;Код: Выделить всё
        define(__NAMESPACE__ . '\MY_TEST_TABLE', $this->table_prefix . 'my_test');Код: Выделить всё
        $sql = 'SELECT *
            FROM ' . MY_TEST_TABLE;
        $result = $this->db->sql_query($sql);
        while ($row = $this->db->sql_fetchrow($result))
        {
            $this->template->assign_block_vars('row', array(
                'ID'             => $row['id'],
                'NAME'            => $row['name'],
                'PHONE'            => $row['phone'],
            ));
        }Постраничный вывод
Теперь можно заняться совершенствованием расширения. Сначала добавим разбиение на страницы. Тут нужны правки только в коде шаблона, языкового файла и самого контроллера.
Итак, открываем mytest_body.html и добавляем
Код: Выделить всё
<div class="pagination">
	{TOTAL_ITEMS}
	<!-- IF .pagination -->
		<!-- INCLUDE pagination.html -->
	<!-- ELSE -->
		 • {PAGE_NUMBER}
	<!-- ENDIF -->
</div>
<br clear="all" />Код: Выделить всё
<h2>{L_TEST_PAGE_TITLE}</h2>Код: Выделить всё
<!-- INCLUDE overall_footer.html -->Код: Выделить всё
        $sql = 'SELECT *
            FROM ' . MY_TEST_TABLE;
        $result = $this->db->sql_query($sql);Код: Выделить всё
        $start = $this->request->variable('start', 0);
        $total_count    = 0;
        $per_page        = 5;
        $sql = 'SELECT COUNT(id) as total
            FROM ' . MY_TEST_TABLE . '';
        $result = $this->db->sql_query($sql);
        $row = $this->db->sql_fetchrow($result);
        $total_count = $row['total'];
        $this->db->sql_freeresult($result);
        $pagination_url = append_sid("{$this->phpbb_root_path}mytest");
        $this->pagination->generate_template_pagination($pagination_url, 'pagination', 'start', $total_count, $per_page, $start);
        $sql = 'SELECT *
            FROM ' . MY_TEST_TABLE;
        $result = $this->db->sql_query_limit($sql, $per_page, $start);Код: Выделить всё
            'TEST_PAGE_TITLE'    => $this->user->lang('TEST_PAGE_TITLE'),Код: Выделить всё
            'TOTAL_ITEMS'        => $this->user->lang('TOTAL_ITEMS', (int) $total_count),
            'PAGE_NUMBER'        => $this->pagination->on_page($total_count, $per_page, $start),Код: Выделить всё
    'PHONE'                => 'Телефон',Код: Выделить всё
    'TOTAL_ITEMS'        => 'Всего: <strong>%d</strong>',Теперь добавим сортировку по обоим колонкам таблицы, то есть по имени и по номеру телефона.
Открываем mytest_body.html и меняем
Код: Выделить всё
			<th class="name">{L_NAME}</th>
			<th class="name">{L_PHONE}</th>Код: Выделить всё
			<th class="name"><a href="{U_SORT_NAME}">{L_NAME}</a></th>
			<th class="name"><a href="{U_SORT_PHONE}">{L_PHONE}</a></th>Код: Выделить всё
<!-- INCLUDE overall_footer.html -->Код: Выделить всё
<form method="post" action="{S_MODE_ACTION}">
	<fieldset class="display-options">
		<label>{L_SORT_BY} <select name="sk" id="sk">{S_SELECT_SORT_KEY}</select></label>
		<label><select name="sd" id="sd">{S_SELECT_SORT_DIR}</select></label>
		<input name="sort" value="{L_GO}" class="button2" type="submit">
	</fieldset>
</form>
<br clear="all" />Код: Выделить всё
    'TOTAL_ITEMS'        => 'Всего: <strong>%d</strong>',Код: Выделить всё
    'SORT_BY_NAME'        => 'по имени',
    'SORT_BY_PHONE'        => 'по номеру телефона',Код: Выделить всё
        $start = $this->request->variable('start', 0);Код: Выделить всё
        $sort_key = $this->request->variable('sk', 'a');
        $sort_dir = $this->request->variable('sd', 'd');
        $submit = (isset($_POST['submit'])) ? true : false;
        $default_key    = 'a';
        $sort_dir_text = array('a' => $this->user->lang['ASCENDING'], 'd' => $this->user->lang['DESCENDING']);
        $sort_key_text = array('a' => $this->user->lang['SORT_BY_NAME'], 'b' => $this->user->lang['SORT_BY_PHONE']);
        $sort_key_sql = array('a' => 'name', 'b' => 'phone');
        $s_sort_key = '';
        foreach ($sort_key_text as $key => $value)
        {
            $selected = ($sort_key == $key) ? ' selected="selected"' : '';
            $s_sort_key .= '<option value="' . $key . '"' . $selected . '>' . $value . '</option>';
        }
        $s_sort_dir = '';
        foreach ($sort_dir_text as $key => $value)
        {
            $selected = ($sort_dir == $key) ? ' selected="selected"' : '';
            $s_sort_dir .= '<option value="' . $key . '"' . $selected . '>' . $value . '</option>';
        }
        $sql_sort = 'ORDER BY ' . $sort_key_sql[$sort_key] . (($sort_dir == 'a') ? ' ASC' : ' DESC');
Код: Выделить всё
        $pagination_url = append_sid("{$this->phpbb_root_path}mytest");Код: Выделить всё
        // Build a relevant pagination_url
        $params = array();
        $check_params = array(
            'sk'            => array('sk', $default_key),
            'sd'            => array('sd', 'a'),
        );
        foreach ($check_params as $key => $call)
        {
            if (!isset($_REQUEST[$key]))
            {
                continue;
            }
            $param = call_user_func_array('request_var', $call);
            $param = urlencode($key) . '=' . ((is_string($param)) ? urlencode($param) : $param);
            $params[] = $param;
            if ($key != 'sk' && $key != 'sd')
            {
                $sort_params[] = $param;
            }
        }
        $pagination_url = append_sid("{$this->phpbb_root_path}mytest", implode('&', $params));
        $sort_url = append_sid("{$this->phpbb_root_path}mytest");Код: Выделить всё
        $sql = 'SELECT *
            FROM ' . MY_TEST_TABLE;Код: Выделить всё
        $sql = 'SELECT *
            FROM ' . MY_TEST_TABLE . '
        '. $sql_sort;Код: Выделить всё
            'TEST_PAGE_TITLE'    => $this->user->lang('TEST_PAGE_TITLE'),Код: Выделить всё
            'S_SELECT_SORT_DIR'    => $s_sort_dir,
            'S_SELECT_SORT_KEY'    => $s_sort_key,
            'U_SORT_NAME'        => $sort_url. '?sk=a&sd=' . (($sort_key == 'a' && $sort_dir == 'a') ? 'd' : 'a'),
            'U_SORT_PHONE'        => $sort_url. '?sk=b&sd=' . (($sort_key == 'b' && $sort_dir == 'a') ? 'd' : 'a'),
            'S_MODE_ACTION'        => $pagination_url,Далее можно добавить модуль настройки расширения в Администраторском разделе, возможность добавления, удаления и редактирования данных и соответствующие права доступа, а также новое поле в таблицу базы данных в новой версии расширения. Но этим мы займемся позже, а пока вот наш результат:
Добавление модуля в ACP, права доступа, изменение структуры таблиц БД
Теперь давайте добавим модуль в Администраторский раздел-->Управление расширениями, где можно было бы изменять какие-то настройки нашего расширения. Например, сделаем возможность изменять количество строк в таблице в списке имен. В текущей версии это число является неизменным и равно 5. Также добавим в нашу таблицу phpbb_my_test новое поле, например какие-то комментарии, пусть это поле будет называться comments. Сделаем это в новой версии расширения.
Сначала отключим расширение в Администраторском разделе. Затем изменим информацию о расширении, для чего откроем composer.json и заменим
Код: Выделить всё
    "version": "0.0.1",
    "time": "2014-02-06",Код: Выделить всё
    "version": "0.0.2",
    "time": "2014-02-11",Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - My test
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace sheer\mytest\migrations;
class version_0_0_2 extends \phpbb\db\migration\migration
{
    public function effectively_installed()
    {
        return isset($this->config['mytest_version']) && version_compare($this->config['mytest_version'], '0.0.2', '>=');
    }
    static public function depends_on()
    {
        return array('\sheer\mytest\migrations\version_0_0_1');
    }
    public function update_schema()
    {
        return array(
            'add_columns'    => array(
                $this->table_prefix . 'my_test'        => array(
                    'comments'                        => array('VCHAR:255', ''),
                ),
            ),
        );
    }
    public function update_data()
    {
        return array(
            array('config.update', array('mytest_version', '0.0.2')),
        );
    }
}Допустим число строк на странице будет храниться у нас в таблице
phpbb_config в новой строке и в поле config_name запишем значение mytest_perpageДля этого в файл version_0_0_2.php после строки
Код: Выделить всё
            array('config.update', array('mytest_version', '0.0.2')),Код: Выделить всё
            array('config.add', array('mytest_perpage', '10')), 
            // Add new module
            array('module.add', array(
                'acp',
                'ACP_CAT_DOT_MODS',
                'ACP_MY_TEST'
            )),
            array('module.add', array(
                'acp',
                'ACP_MY_TEST',
                array(
                    'module_basename'    => '\sheer\mytest\acp\main_module',
                    'modes'                => array('settings'),
                ),
            )),            
ext/sheer/mytest/acp
ext/sheer/mytest/adm/style
В папке ext/sheer/mytest/adm/style создадим html-шаблон acp_mytest_body.html
Код: Выделить всё
<!-- INCLUDE overall_header.html -->
<h1>{L_ACP_MY_TEST}</h1>
<p>{L_ACP_MY_TEST_EXPLAIN}</p>
<form id="acp_mytest" method="post" action="{U_ACTION}">
	<fieldset>
		<dl>
			<dt><label for="per_page">{L_ACP_MY_TEST_PER_PAGE}</label></dt>
			<dd><input name="per_page" type="text" value="{PER_PAGE}"></dd>
		</dl>
		<p class="submit-buttons">
			<input class="button1" type="submit" id="submit" name="submit" value="{L_SUBMIT}" /> 
			<input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
		</p>
		{S_FORM_TOKEN}
	</fieldset>
</form>
<!-- INCLUDE overall_footer.html -->ACP_MY_TEST, ACP_MY_TEST_EXPLAIN и  ACP_MY_TEST_PER_PAGE.
Код: Выделить всё
<?php
/**
*
* mytest [Russian]
*
* @package My test
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
/**
* @ignore
*/
if (!defined('IN_PHPBB'))
{
    exit;
}
if (empty($lang) || !is_array($lang))
{
    $lang = array();
}
$lang = array_merge($lang, array(
    'ACP_MY_TEST'                => 'Мой тест',
    'ACP_MY_TEST_EXPLAIN'        => 'Здесь можно настроить параметры расширения.',
    'ACP_MY_TEST_PER_PAGE'        => 'Количество строк на странице',
));Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - My test
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace sheer\mytest\acp;
class main_info
{
    function module()
    {
        return array(
            'filename'    => '\sheer\mytest\acp\main_module',
            'title'        => 'ACP_MY_TEST',
            'version'    => '1.0.0',
            'modes'        => array(
                'settings'    => array('title' => 'ACP_MY_TEST', 'auth' => 'ext_sheer/mytest && acl_a_board', 'cat' => array('ACP_MY_TEST')),
            ),
        );
    }
}'auth' => 'ext_sheer/mytest && acl_a_board'. Это нужно для того, чтобы при отключении расширения модуль управления расширением также отключался).и main_module.php
Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - My test
* @copyright (c) 2013 phpBB Group
* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
*
*/
namespace sheer\mytest\acp;
class main_module
{
    var $u_action;
    function main($id, $mode)
    {
        global $db, $user, $auth, $template, $cache, $request;
        global $config, $phpbb_root_path, $phpbb_admin_path, $phpEx;
        $this->tpl_name = 'acp_mytest_body';
        $this->page_title = $user->lang('ACP_MY_TEST');
        add_form_key('sheer/mytest');
        if ($request->is_set_post('submit'))
        {
            if (!check_form_key('sheer/mytest'))
            {
                trigger_error('FORM_INVALID');
            }
            $config->set('mytest_perpage', $request->variable('per_page', 10));
            trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
        }
        $template->assign_vars(array(
            'U_ACTION'        => $this->u_action,
            'PER_PAGE'        => (isset($config['mytest_perpage'])) ? $config['mytest_perpage'] : 10,
        ));
    }
}Тоже самое относится и к "языковому" файлу info_acp_mytest.php. Он должен иметь префикс info_, чтобы языковые объекты, определенные там, были доступны в Администраторском разделе.
Добавим глобальное право доступа - Разрешить просмотр нашей страницы.
В файле version_0_0_2.php после
Код: Выделить всё
            array('config.add', array('mytest_perpage', '10')),Код: Выделить всё
            // Add permissions
            array('permission.add', array('u_viewtestpage', true)),
            // Add permissions sets
            array('permission.permission_set', array('ROLE_USER_FULL', 'u_viewtestpage', 'role', true)),
            array('permission.permission_set', array('ROLE_USER_STANDARD', 'u_viewtestpage', 'role', true)),
            array('permission.permission_set', array('REGISTERED', 'u_viewtestpage', 'group', true)),В папке ext/sheer/mytest/language/ru создадим файл permissions_mytest.php (UTF-8 без BOM !!!)
Код: Выделить всё
<?php
/**
*
* @package phpBB Extension - My test
* @copyright (c) 2013 phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
*/
/**
* DO NOT CHANGE
*/
if (!defined('IN_PHPBB'))
{
    exit;
}
if (empty($lang) || !is_array($lang))
{
    $lang = array();
}
$lang = array_merge($lang, array(
    'ACL_U_VIEWTESTPAGE'        => 'Может просматривать тестовую страницу',
));ACL_U_VIEWTESTPAGE был доступен в Администраторском разделе в управлении правами доступа. в файл mytest_lng.php добавим
Код: Выделить всё
    'LOGIN_EXPLAIN_VIEW_MYTEST_PAGE'    => 'Вы должны быть авторизованы для просмотра этой страницы.',Теперь, чтобы наши настройки отображения и право доступа заработали, необходимо внести изменения в контроллер: открываем mytest.php и удаляем строку
Код: Выделить всё
        $per_page        = 5;$per_page на $this->config['mytest_perpage']Добавляем вывод комментариев: после
Код: Выделить всё
                'PHONE'            => $row['phone'],Код: Выделить всё
                'COMMENT'        => $row['comments'],Код: Выделить всё
			<th class="name"><a href="{U_SORT_PHONE}">{L_PHONE}</a></th>Код: Выделить всё
			<th class="name">{L_COMMENT}</th>Код: Выделить всё
				<td>{row.PHONE}</td>Код: Выделить всё
				<td>{row.COMMENT}</td>Код: Выделить всё
    'COMMENT'            => 'Комментарий',Код: Выделить всё
        $start = $this->request->variable('start', 0);Код: Выделить всё
        if (!$this->auth->acl_gets('u_viewtestpage'))
        {
            if ($this->user->data['user_id'] != ANONYMOUS)
            {
                trigger_error('NOT_AUTHORISED');
            }
            login_box('', $this->user->lang['LOGIN_EXPLAIN_VIEW_MYTEST_PAGE']);
        }To be continued...
Приношу благодарность членам команды rxu и Татьяна5 за замечания, комментарии и дополнения.

 ).
 ).








