Уважаемые пользователи!
C 7 ноября 2020 года phpBB Group прекратила выпуск обновлений и завершила дальнейшее развитие phpBB версии 3.2.
С 1 августа 2024 года phpBB Group прекращает поддержку phpBB 3.2 на официальном сайте.
Сайт официальной русской поддержки phpBB Guru продолжит поддержку phpBB 3.2 до 31 декабря 2024 года.
С учетом этого, настоятельно рекомендуется обновить конференции до версии 3.3.

Создание страниц в стиле конференции

Форум для авторов расширений для phpBB. Здесь можно попросить помощи в разработке у коллег.
Правила форума
Местная Конституция | Шаблон запроса | Документация (phpBB3) | Мини [FAQ] по phpBB3.1.x/3.3.x | FAQ | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Создание страниц в стиле конференции

Сообщение Sheer »

Приношу благодарность своей собачке Мутьке за то, что она не приставала ко мне во время написания этой статьи.

В новой версии движка 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-х символов.
ext_step_1.jpg
Далее в папке mytest создадим следующие папки:
config\
controller\
event\
language\ru\
styles\prosilver\template\event\
migrations\

tree.jpg
tree.jpg (12.23 КБ) 22200 просмотров
На первом этапе не все потребуются, но мы создадим их загодя.
Далее в папке config создадим файл services.yml следующего содержания:

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

services:
    Sheer.mytest.listener:
        class: Sheer\mytest\event\listener
        tags:
            - { name: event.listener }
NB! синтаксис языка YAML позволяет использовать в качестве отступов исключительно пробелы. Знаки табуляции не допускаются.
В папке 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();
    }
}
NB! Общее правило: имя класса внутри файла должно совпадать с именем файла.

Поздравляю, наше первое расширение создано, можно проверить, перейдя в Администраторский раздел "Персонализация-->Управление расширениями".

Создаем контроллер
Ну сделано-то сделано, вот только ничего оно не делает. Посему настало время сотворить нечто такое, чтобы на нашей странице чего-нибудь отображалось, ну хотя-бы сначала заголовок.
Итак, приступим. Сначала создадим html-шаблон страницы, назовем его mytest_body.html и запишем его в папку ext/Sheer/mytest/styles/prosilver/template

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

<!-- INCLUDE overall_header.html -->
<h2>{L_TEST_PAGE_TITLE}</h2>
<!-- INCLUDE overall_footer.html -->
Как видим, никаких принципиальных изменений по сравнению с версией 3.0 не появилось.
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'    => 'Мой тест',
));
Теперь его нужно подключить к нашему расширению: открываем listener.php и меняем в функции getSubscribedEvents()

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

        return array();
на

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

        return array(
            'core.user_setup'                        => 'load_language_on_setup',
        );
и добавляем внутри класса listener (после функции getSubscribedEvents()) функцию load_language_on_setup($event)

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

    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;
    }
Теперь настало время создать собственно нашу страничку. Для этого в папке ext/Sheer/mytest/controller создадим файл и назовем его например mytest.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\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);
    }
}
Затем в папке ext/Sheer/config создадим файл routing.yml (другие имена не допускаются!)

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

Sheer_mytest_controller:
    pattern: /mytest
    defaults: { _controller: Sheer.mytest.controller:main }
После чего открываем services.yml и после

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

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) и... Ура! Заработало!
test_page_1.jpg
Рабор полетов
Теперь разберем наш контроллер 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)
представляет собой ничто иное как список стандартных глобальных классов, массивов и переменных phpBB 3.1, поэтому, для того, чтобы они были доступны в функциях внутри класса, их следует передать в конструктор __construct и объявить их там:

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

        $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;
Помимо того, этот список следует также разместить в файле services.yml в списке аргументов соответствующего класса строго в том же порядке, в каком они перечислены в списке аргументов функции __construct:

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

        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
А сам html-код блока навигации записан в файле navbar_header.html для которого существуют события:
  • navbar_header_quick_links_after
  • navbar_header_quick_links_before
  • navbar_header_username_append
  • navbar_header_username_prepend
  • overall_header_navigation_prepend
Вот и воспользуемся событием overall_header_navigation_prepend для добавления нашей ссылки перед ссылкой на FAQ.
Добавим в listener.php после

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

            'core.user_setup'                        => 'load_language_on_setup',
строку

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

            'core.page_header'                        => 'add_page_header_link',
и добавим функцию __construct после функции getSubscribedEvents()

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

    /**
    * Constructor
    */
    public function __construct(\phpbb\template\template $template, $phpbb_root_path)
    {
        $this->template = $template;
        $this->phpbb_root_path = $phpbb_root_path;
    }
и затем добавим функцию add_page_header_link($event)

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

    public function add_page_header_link($event)
    {
        $this->template->assign_vars(array(
            'U_MY_TEST' => append_sid("{$this->phpbb_root_path}mytest"),
        ));
    }
и в папке ext/Sheer/mytest/styles/prosilver/template/event создадим файл overall_header_navigation_prepend.html

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

<li class="small-icon icon-faq no-bulletin"><a href="{U_MY_TEST}">{L_TEST_PAGE_TITLE}</a></li>
В файле services.yml для класса listener не забудем список аргументов
После

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

        class: Sheer\mytest\event\listener
добавим

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

        arguments:
            - @template
            - %core.root_path%
Не забудем физически очистить кеш. Вуаля!
test_ppage2.jpg
Продолжаем разговор
Теперь надо придумать, что будет на нашей странице. Ну давайте список каких-то имен с телефонами из базы данных.
Ну вот так, например
test_page_2.jpg
Для этого нужно создать в базе данных конференции какую-то таблицу с ячейками 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')),
        );
    }
}
Перейдем в Администраторский раздел -->Персонализация-->Управление расширениями и отключим наше расширение, затем снова включим. В результате в базе данных будет создана таблица phpbb_my_test (если при установке конференции вы указали префикс таблиц phpbb_)
phpMyAdmin.jpg
Данные в таблице придется добавить вручную или при помощи SQL-запроса, например

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

INSERT INTO phpbb_my_test (name, phone) VALUES
('Вася', '375172232983'), ('Петя', '29717777'), ('Саша', '672242985'), ('Маша', '29710000'), ('Яша', '334442321'), ('Катя', '34876543');
my_test_table.jpg
Теперь, когда у нас есть эти данные, можем приступить к усовершенствованию нашей страницы.
Открываем 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'                => 'Телефон',
Открываем ext/Sheer/mytest/controller/mytest.php и в function __construct добавляем после

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

        $this->table_prefix = $table_prefix;
строку

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

        define(__NAMESPACE__ . '\MY_TEST_TABLE', $this->table_prefix . 'my_test');
в начало функции main()

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

        $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'],
            ));
        }
Смотрим, что там у нас вышло
test_page_3.jpg
Постраничный вывод
Теперь можно заняться совершенствованием расширения. Сначала добавим разбиение на страницы. Тут нужны правки только в коде шаблона, языкового файла и самого контроллера.
Итак, открываем mytest_body.html и добавляем

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

<div class="pagination">
	{TOTAL_ITEMS}
	<!-- IF .pagination -->
		<!-- INCLUDE pagination.html -->
	<!-- ELSE -->
		 &bull; {PAGE_NUMBER}
	<!-- ENDIF -->
</div>
<br clear="all" />
после

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

<h2>{L_TEST_PAGE_TITLE}</h2>
и перед

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

<!-- INCLUDE overall_footer.html -->
Открываем mytest.php и вместо

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

        $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),
Открываем mytest_lng.php и после

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

    'PHONE'                => 'Телефон',
добавляем

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

    'TOTAL_ITEMS'        => 'Всего: <strong>%d</strong>',
test_page_4.jpg
Сортировка
Теперь добавим сортировку по обоим колонкам таблицы, то есть по имени и по номеру телефона.
Открываем 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" />
Открываем ext/Sheer/mytest/language/ru/mytest_lng.php и после

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

    'TOTAL_ITEMS'        => 'Всего: <strong>%d</strong>',
добавляем

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

    'SORT_BY_NAME'        => 'по имени',
    'SORT_BY_PHONE'        => 'по номеру телефона',
Открываем контроллер mytest.php и после

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

        $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,
И вот, что вышло в результате
test_page_5.jpg
Далее можно добавить модуль настройки расширения в Администраторском разделе, возможность добавления, удаления и редактирования данных и соответствующие права доступа, а также новое поле в таблицу базы данных в новой версии расширения. Но этим мы займемся позже, а пока вот наш результат:

phpbb-ext-mytest-master_v1.rar
(5.8 КБ) 536 скачиваний
Добавление модуля в ACP, права доступа, изменение структуры таблиц БД
Теперь давайте добавим модуль в Администраторский раздел-->Управление расширениями, где можно было бы изменять какие-то настройки нашего расширения. Например, сделаем возможность изменять количество строк в таблице в списке имен. В текущей версии это число является неизменным и равно 5. Также добавим в нашу таблицу phpbb_my_test новое поле, например какие-то комментарии, пусть это поле будет называться comments. Сделаем это в новой версии расширения.
Сначала отключим расширение в Администраторском разделе. Затем изменим информацию о расширении, для чего откроем composer.json и заменим

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

    "version": "0.0.1",
    "time": "2014-02-06",
на

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

    "version": "0.0.2",
    "time": "2014-02-11",
Следующим шагом создадим добавление поля в таблицу. В папке migrations создадим новый файл version_0_0_2.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_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')),
        );
    }
}
Теперь создадим модуль настройки расширения.
acp_module.jpg
Допустим число строк на странице будет храниться у нас в таблице 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/ создадим папки
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}" />&nbsp;
			<input class="button2" type="reset" id="reset" name="reset" value="{L_RESET}" />
		</p>
		{S_FORM_TOKEN}
	</fieldset>
</form>
<!-- INCLUDE overall_footer.html -->
В папке ext/Sheer/mytest/language/ru создадим "языковой" файл info_acp_mytest.php, где объявим объекты 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'        => 'Количество строк на странице',
));
Затем создадим собственно сам модуль. Для этого необходимо создать в папке ext/Sheer/mytest/acp два файла: main_info.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_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 и _module для того, чтобы этими модулями можно было управлять из Администраторского раздела, в ином случае они там не будут доступны, хотя и будут работать.
Тоже самое относится и к "языковому" файлу 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)),
при этом для пользователей, входящих в группу Зарегистрированные пользователи - REGISTERED и для пользователей с ролью Стандартные возможности - ROLE_USER_STANDARD или Все возможности - ROLE_USER_FULL, право будет установлено в Да, для остальных Нет.
my_test_perission.jpg
В папке 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'        => 'Может просматривать тестовую страницу',
));
Префикс permissions_ необходим для того, чтобы объект 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'],
В шаблоне mytest_body.html после

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

			<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>
В языковом файле mytest_lng.php добавляем

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

    'COMMENT'            => 'Комментарий',
В контроллер mytest.php перед

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

        $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']);
        }
Вот собственно пока и все.
phpbb-ext-mytest-master_v2.rar
(9.18 КБ) 405 скачиваний
To be continued...

Приношу благодарность членам команды rxu и Татьяна5 за замечания, комментарии и дополнения.
Вложения
test_page_1.jpg
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
angst66
phpBB 3.0.0 RC1
Сообщения: 1469
Стаж: 12 лет 2 месяца
Благодарил (а): 86 раз
Поблагодарили: 149 раз

Re: Создание страниц в стиле конференции

Сообщение angst66 »

Просмотр этой странице будет отображен в " Кто сейчас на конференции"?
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение Sheer »

Нет.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Anvar
Former team member
Сообщения: 1965
Стаж: 14 лет
Благодарил (а): 67 раз
Поблагодарили: 799 раз
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение Anvar »

listener пустой, можно будет дополнить для отображения в viewonline.
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение Sheer »

Простор для творчества безграничен: are you welcome, как говорится.
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Thanx
phpBB 2.0.2
Сообщения: 334
Стаж: 18 лет 3 месяца
Благодарил (а): 16 раз
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение Thanx »

are you welcome
Наверное, you are welcome, всё-таки. :)
Аватара пользователя
byvoodoo
phpBB 1.4.0
Сообщения: 32
Стаж: 8 лет 6 месяцев
Благодарил (а): 11 раз
Поблагодарили: 3 раза

Re: Создание страниц в стиле конференции

Сообщение byvoodoo »

Несколько раз все переделывал, проверял, кодировки смотрел, название файлов и прочее, но каждый раз на этапе проверки моей страницы (до подраздела статьи разбор полетов) появляется - No route found for "GET /forum/phpbb3/mytest"
pphpBB 3.16ru стоит с wp 4.3.1
путь z:\home\aquamania.by\www\forum\phpBB3\ext\Sheer\ (денвер)
Чего не так?
Аватара пользователя
KEMnEP
phpBB 2.0.17
Сообщения: 1106
Стаж: 9 лет
Благодарил (а): 42 раза
Поблагодарили: 281 раз

Re: Создание страниц в стиле конференции

Сообщение KEMnEP »

Как вариант на сервере не включен mod_rewrite или в файле httpd.conf нет строчки AllowOverride All
А если Вы скачали phpbb-ext-mytest-master_v2.rar и он у Вас работает, То это явно где то Ваша ошибка, а не конфигурации сервера,
Аватара пользователя
byvoodoo
phpBB 1.4.0
Сообщения: 32
Стаж: 8 лет 6 месяцев
Благодарил (а): 11 раз
Поблагодарили: 3 раза

Re: Создание страниц в стиле конференции

Сообщение byvoodoo »

Все оказалось просто:
заходим в администрировать - настроить - включить My test extension

Спасибо.

Отправлено спустя 1 час 55 минут 8 секунд:
Добавил в меню ссылку на мой сайт, но не могу ее переместить правее "модерировать", чтобы моя ссылка была самой крайней.
добавил в меню.jpg
Аватара пользователя
Татьяна5
Поддержка
Поддержка
Сообщения: 12372
Стаж: 12 лет 7 месяцев
Благодарил (а): 223 раза
Поблагодарили: 3517 раз
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение Татьяна5 »

byvoodoo
Там нет события. Можно только до/после ссылки faq поставить
Аватара пользователя
Sheer
Former team member
Сообщения: 12113
Стаж: 17 лет 1 месяц
Откуда: Калининград не Кенигсберг
Благодарил (а): 54 раза
Поблагодарили: 2752 раза
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение Sheer »

Но можно добавить на свой страх и риск.
Открыть navbar_header.html
Найти

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

		<!-- IF U_MCP --><li class="small-icon icon-mcp" data-last-responsive="true"><a href="{U_MCP}" title="{L_MCP}" role="menuitem">{L_MCP_SHORT}</a></li><!-- ENDIF -->
Добавить после

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

		<!-- EVENT navbar_header_umcp_after -->
Файл overall_header_navigation_prepend.html из папки ext/Sheer/mytest/styles/prosilver/template/event переименовать в navbar_header_umcp_after.html
Изображение
Общие ошибки новичков (07.11.2005) & Как задавать вопросы
Мини FAQ
Если ничто другое не помогает, прочтите, наконец, инструкцию!
"Никакая инструкция не может перечислить всех обязанностей должностного лица, предусмотреть все отдельные случаи и дать вперёд соответствующие указания, а поэтому господа инженеры должны проявить инициативу и, руководствуясь знаниями своей специальности и пользой дела, принять все усилия для оправдания своего назначения".
Циркуляр Морского технического комитета №15 от 29.11.1910 г.
Аватара пользователя
Alecto
phpBB 3.0.12
Сообщения: 2857
Стаж: 14 лет 3 месяца
Откуда: Украина! Харьков
Благодарил (а): 80 раз
Поблагодарили: 292 раза
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение Alecto »

лучше из расширения сделать скриптовый перенос, либо скриптом создать после нужного элемента.
событие взять ближайшее после нужного места.
Аватара пользователя
byvoodoo
phpBB 1.4.0
Сообщения: 32
Стаж: 8 лет 6 месяцев
Благодарил (а): 11 раз
Поблагодарили: 3 раза

Re: Создание страниц в стиле конференции

Сообщение byvoodoo »

Sheer писал(а): navbar_header_umcp_after.html
Спасибо еще раз, получилось! Только смелым покоряются моря ;)
добавил в меню - получилось.jpg
Отправлено спустя 16 минут 28 секунд:
Буду заливать на хост и тестить.
Аватара пользователя
byvoodoo
phpBB 1.4.0
Сообщения: 32
Стаж: 8 лет 6 месяцев
Благодарил (а): 11 раз
Поблагодарили: 3 раза

Re: Создание страниц в стиле конференции

Сообщение byvoodoo »

Добрый вечер.
Модифицировал я это расширение только для добавления ссылок в меню (навигацию) шапки.
Остался не решенным следующий вопрос: как одним этим расширением добавить сразу 2 или 3 или более ссылок? Правил я listener.php с overall_header_navigation_prepend.html (который переименован у меня в navbar_header_umcp_after.html), но ни как не смог добиться результата. Решение нашел в простом: сделал на каждую ссылку свое расширение. По сути вопрос решен, но хотелось бы не плодить расширения.
ссылки-.jpg
Спасибо.
Аватара пользователя
владимир1983
phpBB 3.2.6
Сообщения: 5954
Стаж: 13 лет 11 месяцев
Откуда: Сергиев Посад
Благодарил (а): 374 раза
Поблагодарили: 727 раз
Контактная информация:

Re: Создание страниц в стиле конференции

Сообщение владимир1983 »

За ваши деньги решу ваши проблемы. Стучи в ЛС.
Нет человека - нет проблемы. (c)
Ответить

Вернуться в «Для разработчиков»