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

Расширения 3.1.x на конкретных примерах

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

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
Real_Haron
phpBB 1.2.1
Сообщения: 22
Стаж: 8 лет 2 месяца
Благодарил (а): 2 раза

Расширения 3.1.x на конкретных примерах

Сообщение Real_Haron »

Что-то я пока не въезжаю в эту новую систему расширений. Я конечно понял базовый принцип, но мне это мало помогло. Поэтому прошу местных специалистов помочь с этим на конкретных "боевых" примерах. В качестве боевого полигона выступит phpBB 3.1.7-pl1.

Собственно, пример 1: Поддержка параметров конфигурации в формате JSON, с зависимостью от DEBUG

По-старинке, я это сделал бы вот так:

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

--- /phpbb/config/db.php	(revision 11)
+++ /phpbb/config/db.php	(working copy)
@@ -83,6 +83,15 @@
 
 			$cache->put('config', $cached_config);
 		}
+		
+		foreach ($config as $key => &$value)
+		{
+			if (isset($value[0]) and in_array($value[0], ['[', '{']))
+			{
+				$value = json_decode($value, true)[(defined('DEBUG') && DEBUG) ? 1 : 0];
+				unset($value);
+			}
+		}
 
 		parent::__construct($config);
 	}
Такая фича может понадобиться нам, если мы например на одном хосте держим "отладочную" версию форума (для разработки), а на другом "боевую" (где люди сидят). При этом оба хоста используют одну базу данных. Так вот, как вынести этот пример в расширение, чтоб не трогать /phpbb/config/db.php ?
Anvar
Former team member
Сообщения: 1965
Стаж: 14 лет
Благодарил (а): 57 раз
Поблагодарили: 625 раз

Re: Расширения 3.1.x на конкретных примерах

Сообщение Anvar »

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

Остальная информация по созданию расширений Расширения - это просто!
Не пишите вопросы лично, если можете задать их на форуме!
Спецзаказы не интересуют!
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1744 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение rxu »

А почему код добавляется именно в конструктор?
Изображение
Аватара пользователя
Real_Haron
phpBB 1.2.1
Сообщения: 22
Стаж: 8 лет 2 месяца
Благодарил (а): 2 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение Real_Haron »

Ну... Мне кажется, что логично разместить этот код там, где происходит непосредственное получение данных и их первичная обработка. Раскидывать json_decode() по всему коду неправильно.

А ещё, конечно меня немного поставила в тупик новая архитектура, по сравнению с версиями 3.0.*. Лично моё мнение в том, что уж слишком всё усложнили зачем-то. Вот twig зачем-то впёрли, был нормальный шаблонизатор... Но это лирика. Итак, значит мы нашли отсуствующее событие. И первый пример не катит.

Теперь пример 2: Отключение отображения определённого блока в шаблоне

Вариант по-старинке:

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

--- index_body.html	(revision 11)
+++ index_body.html	(revision 12)
@@ -15,7 +15,7 @@
 
 <!-- EVENT index_body_forumlist_body_after -->
 
-<!-- IF not S_USER_LOGGED_IN and not S_IS_BOT -->
+<!-- IF not S_USER_LOGGED_IN and not S_IS_BOT and not S_LOGIN_FORM_ENABLED -->
 	<form method="post" action="{S_LOGIN_ACTION}" class="headerspace">
 	<h3><a href="{U_LOGIN_LOGOUT}">{L_LOGIN_LOGOUT}</a><!-- IF S_REGISTER_ENABLED -->&nbsp; &bull; &nbsp;<a href="{U_REGISTER}">{L_REGISTER}</a><!-- ENDIF --></h3>
 		<fieldset class="quick-login">
Ваш выход, друзья.
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 830 раз

Re: Расширения 3.1.x на конкретных примерах

Сообщение LavIgor »

Real_Haron писал(а): Ваш выход, друзья.
К чему эта фраза?
Пример номер 2 допустим и сейчас.
Только рекомендуем править свой наследующий стиль.
Аватара пользователя
KimIV
phpBB 2.0.1
Сообщения: 286
Стаж: 8 лет 6 месяцев
Откуда: Кунгур
Благодарил (а): 166 раз
Поблагодарили: 21 раз

Re: Расширения 3.1.x на конкретных примерах

Сообщение KimIV »

LavIgor писал(а): К чему эта фраза?

Это было приглашение к дискуссии... всего-то...

LavIgor писал(а): Только рекомендуем править свой наследующий стиль.
Почему? Не лучше ли наследуемый? Чтобы все изменения автоматом применились во всех наследующих...
Ты должен делать добро из зла, потому что его больше не из чего делать. Уоренн Роберт Пенн.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1744 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение rxu »

Real_Haron писал(а): Отключение отображения определённого блока в шаблоне
В 3.1 это практически невозможно без правки кода.
Real_Haron писал(а): Итак, значит мы нашли отсуствующее событие.
Потому и был задан вопрос о том, зачем именно в конструкторе. Если данный код может отработать в месте, где уже есть событие, без потери функционала, то никакой проблемы с отсутствующим событием нет. Правильный выбор места вызова кода - 90% успеха.
Изображение
Аватара пользователя
Real_Haron
phpBB 1.2.1
Сообщения: 22
Стаж: 8 лет 2 месяца
Благодарил (а): 2 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение Real_Haron »

Товарищи указали на возможность некоего наследования. Посмотрим шире: вероятно, можно заместить весь шаблон тем, что предоставляет расширение. В таком случае вопрос: Как это реализовать?
rxu писал(а): Потому и был задан вопрос о том, зачем именно в конструкторе.
Совершенно согласен. Я предполагаю, что можно добавить в core.common (common.php:128). Как это сделать, покажите пожалуйста.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1744 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение rxu »

Real_Haron писал(а): можно добавить в core.common (common.php:128). Как это сделать, покажите пожалуйста
Ну тут чего проще. Если разобрались, как пишутся слушатели событий, тогда сначала объявляете подписчик события внутри static public function getSubscribedEvents(), например

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

'core.common'						=> 'common',
затем в самой функции public function common() прописываете нужный код

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

      foreach ($this->config as $key => &$value)
      {
         if (isset($value[0]) and in_array($value[0], ['[', '{']))
         {
            $value = json_decode($value, true)[(defined('DEBUG') && DEBUG) ? 1 : 0];
            unset($value);
         }
      }
Само собой, имеется ввиду, что в конструкторе слушателя сделана инъекция зависимости \phpbb\config\config $config.
Изображение
Аватара пользователя
Real_Haron
phpBB 1.2.1
Сообщения: 22
Стаж: 8 лет 2 месяца
Благодарил (а): 2 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение Real_Haron »

Да, спасибо, так и сделал... Теперь, как установить изменённый $config глобально?

Теперь по index_body.html
Я попробовал такой костыль:
/ext/.../event/index_body_forumlist_body_after.html

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

<!-- set S_IS_BOT_REAL = S_IS_BOT -->
<!-- set S_IS_BOT = 1 -->
и

/ext/.../event/index_body_stat_blocks_before.html

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

<!-- set S_IS_BOT = S_IS_BOT_REAL -->
Это должно было убить блок с логином. Решение сильно подпорочное, но всё-же решение. Так вот, S_IS_BOT не меняется. То-ли лыжи не едут, то-ли я что-то делаю не так. Существует-ли рабочий способ переназначать переменные в шаблонах?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16367
Стаж: 17 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 521 раз
Поблагодарили: 1744 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение rxu »

Real_Haron писал(а): как установить изменённый $config глобально?

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

$this->config->set('my_setting');
Real_Haron писал(а): set S_IS_BOT = 1
Данная переменная шаблона перезаписывается значением из обработчика сессии при компиляции, я так думаю. Лучше завести собственную дефайном. Должно быть можно для этого использовать синтаксис Twig тоже.
Изображение
Аватара пользователя
Real_Haron
phpBB 1.2.1
Сообщения: 22
Стаж: 8 лет 2 месяца
Благодарил (а): 2 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение Real_Haron »

Так. Получилось скрыть блок без модификации шаблонов, повесив изменение
S_IS_BOT на core.page_header_after и core.page_footer

Двигаемся дальше: Создал я файлы с языковыми параметрами, положил их в /ext/language/.../<ext_name>.php
Безрезультатно. Почему?

P.S. Чем больше узнаю модификацию на событиях в phpBB, тем больше она мне нравится.
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 830 раз

Re: Расширения 3.1.x на конкретных примерах

Сообщение LavIgor »

Real_Haron писал(а): Создал я файлы с языковыми параметрами, положил их в /ext/language/.../<ext_name>.phpБезрезультатно. Почему?
А в слушателе эти файлы подключаются через $user->add_lang_ext() с соответствующими параметрами?
Либо у файлов могут быть специальные префиксы, тогда они будут подключаться автоматически в некоторых случаях.
Аватара пользователя
Real_Haron
phpBB 1.2.1
Сообщения: 22
Стаж: 8 лет 2 месяца
Благодарил (а): 2 раза

Re: Расширения 3.1.x на конкретных примерах

Сообщение Real_Haron »

Да, $user->add_lang_ext('<vendor>/<name>', '<name>') повешен на core.user_setup_after. Но пока что результат нулевой.

Отправлено спустя 5 минут 32 секунды:
upd: Разобрался. Всё работает, допустил ошибку в названии переменной.

Отправлено спустя 58 минут 40 секунд:
Кто-нибудь может добавить pull request на ивент core.login_box_before в functions.php:2816 (phpBB 3.1.7-pl1)
Есть-ли шансы, что оно появится в следующем релизе?
Аватара пользователя
LavIgor
Former team member
Сообщения: 3468
Стаж: 9 лет 11 месяцев
Благодарил (а): 41 раз
Поблагодарили: 830 раз

Re: Расширения 3.1.x на конкретных примерах

Сообщение LavIgor »

Real_Haron писал(а): Кто-нибудь может добавить pull request на ивент
Может.
Расскажите только, для чего нужно и какие переменные нужно передавать.

Отправлено спустя 2 минуты 11 секунд:
Хм, стало интересно, зачем здесь return.

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