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

Расширения - это просто!

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

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

Re: Расширения - это просто!

Сообщение im0 »

Кто-нить может подсказать почему не выполняется миграция при включении расширения через phpbbcli?

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

php bin/phpbbcli.php -v --safe-mode extension:enable tatiana5/highlightfirstpost 
проверяем

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

php bin/phpbbcli.php -v --safe-mode config:get highlightfirstpost_version
[ERROR] Параметр конфигурации highlightfirstpost_version не существует
Но если включать через админку то всё ок

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

php bin/phpbbcli.php -v --safe-mode config:get highlightfirstpost_version
0.0.1
PS. Пока набирал сюда пример — разобрался: мешает --safe-mode (в безопасном режиме (без расширений),
хотя само расширение при этом включается.
Andex
phpBB 1.4.2
Сообщения: 59
Стаж: 16 лет 9 месяцев
Благодарил (а): 5 раз
Поблагодарили: 6 раз

Re: Расширения - это просто!

Сообщение Andex »

Обратил внимание, что в 3.2 и 3.3 для доступа к языковым переменным начали использовать конструкцию

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

$language->lang('LANG_KEY');
(\phpbb\language\language)

раньше в 3.1 обычно было что-то вроде

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

$user->lang['LANG_KEY']
(из \phpbb\user)

Работают, как я вижу, обе конструкции.
В чем суть нововведения? Сэкономить ресурсов, там где не надо получать данные пользователя, а просто необходим доступ к языковым переменным?
Имеет ли смысл переписывать данный код в своих расширениях?
Или может есть какие-то нюансы, о которых я не догадываюсь?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 15899
Стаж: 16 лет 8 месяцев
Откуда: Красноярск
Благодарил (а): 465 раз
Поблагодарили: 1555 раз

Re: Расширения - это просто!

Сообщение rxu »

Andex писал(а): 16.08.2020 21:33 Имеет ли смысл переписывать данный код в своих расширениях?
Имеет с прицелом на 4.0. Там массив $user->lang[] должен быть ликвидирован.
Изображение
Andex
phpBB 1.4.2
Сообщения: 59
Стаж: 16 лет 9 месяцев
Благодарил (а): 5 раз
Поблагодарили: 6 раз

Re: Расширения - это просто!

Сообщение Andex »

Кстати говоря, нашел ошибку в доках

https://area51.phpbb.com/docs/dev/3.3.x ... -extension
To load a file from an extension you need to use phpbb\language\language::add_lang() which takes the vendor + extension name as first argument and the array of language files as a second argument.

На самом деле последовательность аргументов наоборот описанное же выше было применимо к user->add_kang_ext()

И ниже они в кач-ве примера приводят правильный код

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

$language->add_lang('demo', 'acme/demo');
// or
$language->add_lang(['demo', 'demo2'], 'acme/demo');
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 15899
Стаж: 16 лет 8 месяцев
Откуда: Красноярск
Благодарил (а): 465 раз
Поблагодарили: 1555 раз

Re: Расширения - это просто!

Сообщение rxu »

Изображение
Bydlocoder
phpBB 1.4.0
Сообщения: 35
Стаж: 3 года
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Расширения - это просто!

Сообщение Bydlocoder »

В расширениях возможно указывать конструкции типа require_once? Использовать можно
Если да, то путь должен быть каким? Полным, относительным? С полным путем работает, с относительным нет.

Подскажите переменную ядра для полного пути расширения.
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3035
Стаж: 13 лет 10 месяцев
Благодарил (а): 16 раз
Поблагодарили: 373 раза

Re: Расширения - это просто!

Сообщение Nekstati »

Bydlocoder, $this->phpbb_root_path . 'ext/bydlocoder/mining_farm', очевидно.

Но если делать "по правилам", то надо не инклюд, а передавать всё в конструктор как зависимость.

Или, если подключаемый файл не требует никакой инициализаци/инстанцирования, например это "классический" инклюд, который содержит несколько вспомогательных функций, то можно и без зависимостей:

Основной файл (контроллер или что там):

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

use bydlocoder\mining_farm\functions;

class controller
{
	public function hard_work()
	{
		functions::gimme_your_money();
	}
}
Подключаемый файл:

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

namespace bydlocoder\mining_farm;

class functions
{
	static public function gimme_your_money()
	{
	}
}
Bydlocoder
phpBB 1.4.0
Сообщения: 35
Стаж: 3 года
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Расширения - это просто!

Сообщение Bydlocoder »

Nekstati писал(а): 28.10.2022 17:51 Но если делать "по правилам", то надо не инклюд, а передавать всё в конструктор как зависимость.
Мне надо воспользоваться сторонней библиотекой, которая распространяется в виде .phar архива.
Вдогонку второй вопрос, ip постера сообщения откуда можно получить?

core.viewtopic_post_rowset_data - тут нет
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3035
Стаж: 13 лет 10 месяцев
Благодарил (а): 16 раз
Поблагодарили: 373 раза

Re: Расширения - это просто!

Сообщение Nekstati »

Bydlocoder, есть: $event['row']['poster_ip']
Bydlocoder
phpBB 1.4.0
Сообщения: 35
Стаж: 3 года
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Расширения - это просто!

Сообщение Bydlocoder »

Nekstati писал(а): 28.10.2022 18:00 Bydlocoder, есть: $event['row']['poster_ip']
Не,

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

{
			$rowset = $event['rowset_data'];
		$row = $event['row'];

		$rowset['poster_ip'] = $row['poster_ip'];

		$event['rowset_data'] = $rowset;
		
        echo '<pre>';
        var_dump($row['poster_ip']);
        echo '</pre>';
	}
и в итоге Null
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3035
Стаж: 13 лет 10 месяцев
Благодарил (а): 16 раз
Поблагодарили: 373 раза

Re: Расширения - это просто!

Сообщение Nekstati »

Bydlocoder, есть, $row содержит всё, что взято из БД, из таблиц posts и users
https://github.com/phpbb/phpbb/blob/4d5 ... .php#L1331
https://github.com/phpbb/phpbb/blob/4d5 ... .php#L1276
Может, прописываете это в обработчике не того события, о котором речь (core.viewtopic_post_rowset_data)
Bydlocoder
phpBB 1.4.0
Сообщения: 35
Стаж: 3 года
Благодарил (а): 2 раза
Поблагодарили: 4 раза

Re: Расширения - это просто!

Сообщение Bydlocoder »

Nekstati, Ага, есть, это все кеш глючил
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 15899
Стаж: 16 лет 8 месяцев
Откуда: Красноярск
Благодарил (а): 465 раз
Поблагодарили: 1555 раз

Re: Расширения - это просто!

Сообщение rxu »

Такая новость.

При обращении к файлу шаблона из кода расширения, например:

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

$this->controller_helper->render('foo_bar.html', $this->language->lang('FOO_BAR'));

phpBB осуществляет поиск файла шаблона только в двух местах и именно в следующей последовательности:
  1. <папка phpBB>/styles/<имя_стиля>/template/
  2. <папка phpBB>/ext/<все_активные_расширения>/styles/<имя_стиля>/template/
Таким образом, тратятся значительные ресурсы на поиск нужного файла шаблона, особенно если установлено много стилей и/или расширений (поиск осуществляется во всех папках основных стилей, затем во всех папках стилей всех включённых расширений).

Чтобы сразу загрузить нужный шаблон только из конкретного расширения, необходимо использовать префикс:

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

$this->controller_helper->render('@vendor_extension/foo_bar.html', $this->language->lang('FOO_BAR'));

И наоборот ("фича"): если нужно использовать какой-то файл шаблона, расположенный в главных папках шаблонов стилей (prosilver и др.), префикс не используется (т.е. оставляем так, как это было в начале):

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

$this->controller_helper->render('foo_bar.html', $this->language->lang('FOO_BAR'));
Изображение
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 15899
Стаж: 16 лет 8 месяцев
Откуда: Красноярск
Благодарил (а): 465 раз
Поблагодарили: 1555 раз

Re: Расширения - это просто!

Сообщение rxu »

Если расширение использует сторонние css/js библиотеки, загруженные через Composer в папку <папка phpBB>/ext/<имяавтора>/<имярасширения>/vendor, то подключить оттуда в файлы шаблона стили и скрипты не получится начиная с версии Twig 2.15.3 или 3.4.3 (phpBB 3.3.9).

Для того, чтобы стало возможным подключение из этой папки стилей и скриптов стандартными методами типа <!-- INCLUDECSS @имяавтора_имярасширения/vendor/<имя_библиотеки>/stylesheet.css --> или <!-- INCLUDEJS @имяавтора_имярасширения/vendor/<имя_библиотеки>/script.js -->, необходимо добавить папку <папка phpBB>/ext/<имяавтора>/<имярасширения>/vendor в список безопасных путей и путей, по которым "движок" шаблона ищет соответствующие файлы.

Это можно сделать в классе слушателя событий:
  1. Добавляем в сервис слушателя зависимость от сервиса '@template.twig.environment'.
  2. Добавляем соответствующий код в конструктор слушателя, например (внимание на \phpbb\template\twig\environment $twig_environment):

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

    
    	/**
    	* Twig Environment
    	*
    	* @var \Twig\Environment
    	*/
    	protected $twig;
    
    class listener implements EventSubscriberInterface
    {
    	public function __construct(
    		\phpbb\config\config $config,
    		\phpbb\template\template $template,
    		\phpbb\user $user,
    		$phpbb_root_path,
    		$php_ext,
    		\phpbb\auth\auth $auth,
    		\phpbb\request\request_interface $request,
    		\phpbb\template\twig\environment $twig_environment
    	)
    	{
    		$this->template = $template;
    		$this->user = $user;
    		$this->config = $config;
    		$this->phpbb_root_path = $phpbb_root_path;
    		$this->php_ext = $php_ext;
    		$this->auth = $auth;
    		$this->request = $request;
    		$this->twig = $twig_environment;
    	}
    
  3. Добавляем слушатель события 'core.page_footer_after' (тогда точно работает в контроллерах, иначе не гарантировано и надо проверять дополнительно):

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

    	static public function getSubscribedEvents()
    	{
    		return [
    			'core.page_footer_after'	=> 'set_paths',
    		];
    	}
    
    	public function set_paths($event)
    	{
    		$ext_vendor_path = './ext/extauthor/extname/vendor/';
    		$ext_namespace = 'extauthor_extname';
    
    		$this->twig->getLoader()->addSafeDirectory($ext_vendor_path);
    		$this->twig->getLoader()->addPath($ext_vendor_path, $ext_namespace);
    	}

    extauthor/extname даны для понимания смысла и должны быть актуальными для данного расширения. При этом значением $ext_namespace (здесь для понимания смысла 'extauthor_extname') в обязательном порядке являются разделенные нижним подчеркиванием актуальные имя автора и имя расширения. Название самой функции слушателя события (set_paths($event)) может быть произвольным.
Изображение

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