Уважаемые пользователи!
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.2] переменная $this->var недоступна другому расширению

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

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Shredder
Former team member
Сообщения: 2217
Стаж: 15 лет 3 месяца
Благодарил (а): 236 раз
Поблагодарили: 561 раз
Контактная информация:

[3.2] переменная $this->var недоступна другому расширению

Сообщение Shredder »

Ситуация в следующем:
внутри расширения B создано событие:

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

$vars = array('rowset', 'topic_list');
extract($this->phpbb_dispatcher->trigger_event('someext.nameext.viewforum_modify_topicrow', compact($vars)));
к нему подключена функция func из расширения A, и внутри этой функции определена переменная:

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

$this->tds = $ar;
Оба события слушаются через A, т.е.:

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

	static public function getSubscribedEvents()
	{
		return array(
			'core.viewforum_modify_topicrow'	=> 'func',
			'someext.nameext.viewforum_modify_topicrow'		=> 'func',
		);
	}
При вызове func внутри родного расширения A через core:

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

			'core.viewforum_modify_topicrow'	=> 'func',
- всё работает как надо, т.е. переменная $this->tds определена, равна заданному значению, и доступна внутри любой функции слушателя A.

НО. при вызове func через событие расширения B:

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

			'someext.nameext.viewforum_modify_topicrow'		=> 'func',
- переменная $this->tds равна NULL внутри любой функции A кроме func (т.е. кроме той, где она задана). свойство public я задавать пробовал - безрезультатно
Аватара пользователя
Nekstati
Поддержка
Поддержка
Сообщения: 3335
Стаж: 15 лет
Благодарил (а): 35 раз
Поблагодарили: 1434 раза

Re: [3.2] переменная $this->var недоступна другому расширению

Сообщение Nekstati »

Shredder, если я верно понимаю ситуацию:
сначала исполняется код одного расширения и пытается использовать значение переменной $tds,
потом исполняется код другого расширения, и только в этот момент переменная $tds получает своё значение.

Можно задавать значение переменной $tds в конструкторе (который вызывается при инициализации расширения и с учётом зависимостей), а не в функции func(), которая вызывается позже.
(В принципе то же самое) можно сделать переменную статической и задавать её значение в getSubscribedEvents().
Можно переименовать расширения так, чтобы они подключались в обратном порядке (A -> B, B -> A).
Можно поиграться со штатными способами задания очерёдности (не уверена, что там предусмотрена такая ситуация).
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16313
Стаж: 17 лет 10 месяцев
Откуда: Красноярск
Благодарил (а): 533 раза
Поблагодарили: 2119 раз
Контактная информация:

Re: [3.2] переменная $this->var недоступна другому расширению

Сообщение rxu »

А чему равно $ar и откуда оно берется?
Изображение
Shredder
Former team member
Сообщения: 2217
Стаж: 15 лет 3 месяца
Благодарил (а): 236 раз
Поблагодарили: 561 раз
Контактная информация:

Re: [3.2] переменная $this->var недоступна другому расширению

Сообщение Shredder »

Разобрался. Там 2 функции через 2 события вызывались, и переменная задавалась (в одной) позже, чем вызывалась (в другой). Нужно было поменять местами события расширения B. Nekstati подсказала верный ход мыслей
Ответить

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