Уважаемые пользователи!
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 | Как задавать вопросы | Как устанавливать расширения

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16452
Стаж: 18 лет 1 месяц
Откуда: Красноярск
Благодарил (а): 531 раз
Поблагодарили: 1772 раза

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

Сообщение rxu »

А какой массив вообще возвращается? Для error_msg присвоено false?
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 4 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

rxu писал(а):А какой массив вообще возвращается?

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

                        return array(
                                'status'                => LOGIN_SUCCESS_CREATE_PROFILE,
                                'error_msg'             => false,
                                'user_row'              => $this->newUserRow($sign_row['public_key_id']),
                        );                        
Новый пользователь формируется вот так (взял из https://github.com/ck-ws/phpbb-ext-auth-shibboleth):

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

private function newUserRow($public_key_id)
        {
                // first retrieve default group id
                $sql = sprintf('SELECT group_id FROM %1$s WHERE group_name = \'%2$s\' AND group_type = \'%3$s\'', GROUPS_TABLE, $this->db->sql_escape('REGISTERED'), GROUP_SPECIAL);
                $result = $this->db->sql_query($sql);
                $row = $this->db->sql_fetchrow($result);
                $this->db->sql_freeresult($result);
                if(!$row)
                {
                        trigger_error('NO_GROUP');
                }
                // generate user account data
                return array(
                        'username'              => $this->randomUsername(),
                        'user_password'         => $public_key_id,
                        'user_email'            => '',
                        'group_id'              => (int)$row['group_id'],
                        'user_type'             => USER_NORMAL,
                        'user_ip'               => $this->user->ip,
                        'user_new'              => ($this->config['new_member_post_limit']) ? 1 : 0,
                );
        }
Имя пользователя генерируется в виде "User6qJGlo".
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16452
Стаж: 18 лет 1 месяц
Откуда: Красноярск
Благодарил (а): 531 раз
Поблагодарили: 1772 раза

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

Сообщение rxu »

UncleAndy
Не уверен на 100%, но в login_box() статус LOGIN_SUCCESS_CREATE_PROFILE никак не обрабатывается. Если одновременно происходит успешный логин, система об этом не знает, т.к. статуса LOGIN_SUCCESS не возвращено. Может быть, надо либо возвращать LOGIN_SUCCESS, либо сделать дополнительную обработку нового статуса в событии core.login_box_failed, например.

Добавлено спустя 54 секунды:
UncleAndy писал(а):
xisp писал(а):Но для вашего метода уместнее сделать другой вариант, с разрешением однократной смены ника.
Согласен. Но как это организовать технически? Если это возможно, было-бы неплохо включать эту опцию прямо из расширения.
Добавить собственное право доступа на этот случай.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 4 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

А не может быть тут дело в том, что у меня не реализован метод autologin()? За что именно он отвечает?

Хотя, вряд-ли. Я так понимаю, autologin() отвечает за автоматический логин с использованием внешних данных (кук и т.д.).
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16452
Стаж: 18 лет 1 месяц
Откуда: Красноярск
Благодарил (а): 531 раз
Поблагодарили: 1772 раза

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

Сообщение rxu »

Очевидно, создает нового пользователя при его отсутствии.
Изображение
Anvar
Former team member
Сообщения: 1965
Стаж: 14 лет 2 месяца
Благодарил (а): 57 раз
Поблагодарили: 625 раз

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

Сообщение Anvar »

UncleAndy писал(а):Возможно-ли сделать так, что-бы и пользователь автоматически создавался и что-бы он сразу-же логинился?
Пользователь создан, берём его user_id и вызываем функцию:

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

			if ($user_id)
			{
				/** User authorize */
				$session = $this->user->session_create($user_id, false, true, true);
			}
Дальше достаточно его на главную отправить redirect("{$this->phpbb_root_path}index.$this->php_ext"); и он будет авторизован.
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 4 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

Всем спасибо за советы. Разобрался в чем была проблема при автосоздании пользователя.

Проблема была в том, что я в собственной форме логина использовал поле username для показа одноразового кода, используемого при логине. И он передавался в метод login. Но проблема в том, что в обвязке (в коде phpbb) он проверяет факт создания пользователя выборкой именно по этому имени пользователя (т.е. по коду), а не по тому, которое я передаю в user_row.

Изменил метод передачи кода в поле пароля и все стало более-менее нормально работать. Тут, конечно, возникает проблема в том, что возможен конфликт имен пользователей, т.к. новое имя пользователя генерируется в момент генерации формы логина (я его поместил в скрытое поле username), а пользователь добавляется через некоторое время. Но надеюсь, что при дублировании имени, phpbb просто не создаст нового пользователя и выдаст такой-же отлуп. Тогда пользователю достаточно будет повторить операцию.

Тогда остался единственный вопрос - каким образом теперь разрешить пользователю однократно сменить свое имя. Я видел совет на счет "Добавить собственное право доступа на этот случай", но в данный момент я вообще представления не имею как это сделать. В данный момент я включил в "Функции конференции" - "Разрешить смену имени пользователя:", но не могу понять как его изменить. В "Личный раздел" - "Профиль" - "Регистрационные данные" имя пользователя так и недоступно для редактирования.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16452
Стаж: 18 лет 1 месяц
Откуда: Красноярск
Благодарил (а): 531 раз
Поблагодарили: 1772 раза

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

Сообщение rxu »

UncleAndy писал(а):видел совет на счет "Добавить собственное право доступа на этот случай", но в данный момент я вообще представления не имею как это сделать
Permission

Ну и тут есть примеры https://github.com/rxu/thanks_for_posts ... migrations
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 4 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

Думаю, для изменения имени пользователя придется все-таки код расширения дописывать. Тем более, что, т.к. я не использую пароли, штатными средствами все-равно его изменить не получится.
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 12 лет
Благодарил (а): 101 раз
Поблагодарили: 91 раз
Забанен: Бессрочно

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

Сообщение xisp »

Да, к с тати, каким образом право поможет? Я думал просто новый столбец в БД, типа "сменил_пароль", с очевидными значениями "0" и "1", и сверять с ним.
phpBBex
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 10 месяцев
Откуда: Израиль
Благодарил (а): 73 раза
Поблагодарили: 248 раз

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

Сообщение Алг »

rxu писал(а):А кастомная страница находится вне директории phpBB, или где?
кастомная страница - контроллер, расположена в ext/alg/myExt/controller, а её шаблон в ext/alg/myExt/styles/all/template
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 9 лет 4 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

Еще пара вопросов возникла:

1. Возможно-ли через расширение жестко задать значения определенных параметров конфига? Например, мне надо что-бы если используется мой auth провайдер, была заблокирована регистрация.

2. Возможно-ли в ивенте шаблона проверить текущий auth провайдер? Если да, то как это сделать?
Аватара пользователя
Алг
Former team member
Сообщения: 933
Стаж: 11 лет 10 месяцев
Откуда: Израиль
Благодарил (а): 73 раза
Поблагодарили: 248 раз

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

Сообщение Алг »

Алг писал(а):Пишу так
КОД: ВЫДЕЛИТЬ ВСЁ
<!-- INCLUDE {T_TEMPLATE_PATH}/posting_buttons.html -->
поэкспериментировала. Вы будете смеяться, но писать надо так

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

<!-- INCLUDE posting_buttons.html -->
и шаблон стиля прекрасно виден из папки шаблона расширения. Но именно с этим шаблоном есть небольшая добавочка. Его надо расположить внутри тега форм с определённым именем. Вот так

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

<form name = 'postform' action=""><!-- INCLUDE posting_buttons.html --></form>
, иначе посыпятся ошибки джаваскрипта
Там упёртость и инертность, могут, кстати, в морду дать.
А ты проявляй интеллигентность, постарайся убеждать...

Т. Шаов
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16452
Стаж: 18 лет 1 месяц
Откуда: Красноярск
Благодарил (а): 531 раз
Поблагодарили: 1772 раза

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

Сообщение rxu »

UncleAndy писал(а):Возможно-ли через расширение жестко задать значения определенных параметров конфига?
В миграции, пример https://github.com/rxu/advanced_warning ... #L113-L114
UncleAndy писал(а):Возможно-ли в ивенте шаблона проверить текущий auth провайдер?
В шаблоне - нет, это снова параметр конфигурации $config['auth_method'], можно проверить в любом событии ядра.

Добавлено спустя 1 час 16 минут 23 секунды:
UncleAndy писал(а):rxu, спасибо! Как раз так и сделал.

Теперь у меня не получается заменить страницу логина. Мне ее нужно заменить полностью, т.к. полей логин и пароль в ней не будет. В процедуру логина вместо логина будет передаваться сгенерированная мною строка (перед этим показываемая пользователю вместе со сформированной мною-же картинкой) и пустой пароль. Мне показалось что все это должно формироваться в методе get_login_data, который у меня делает возврат вот в таком виде:

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

                return array(
                        'TEMPLATE_FILE' => '@gplvote/auth_provider_gplvote.html',
                        'VARS'  => array(),
                );
Но на странице логина все так-же отображается обычная страница. Только внизу исчез блок о регистрации. Я так подозревая что для полной замены страницы логина (еще и с предварительными операциями по подготовке данных для нее) надо действовать по другому. Но как именно?
А если указать 'TEMPLATE_FILE' => 'auth_provider_gplvote.html', не мудрствуя лукаво?

Добавлено спустя 4 минуты 43 секунды:
М-да, судя по коду шаблона login_body.html, всё работает как задумано, т.е. кастомный шаблон добавляется внутрь стандартного https://github.com/phpbb/phpbb/blob/3.1 ... ml#L43-L45
Изображение
2PiK
phpBB 1.4.2
Сообщения: 69
Стаж: 15 лет 10 месяцев
Благодарил (а): 10 раз
Поблагодарили: 2 раза

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

Сообщение 2PiK »

в /includes/message_parser.php есть событие modify_bbcode_init для добавления/модификации бб-кодов, нужно добавить бб-код, но в качестве замены используется не код, а функция из расширения, так естественно не работает:

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

			'mybbcode'				=> array('bbcode_id' => id,	'regexp' => array('#\[mybbcode\](.*?)\[/mybbcode\]#uise' => "\$this->bbcode_mybbcode('\$1')")),

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

Fatal error: Call to undefined method parse_message::bbcode_mybbcode()
как использовать функцию из расширения?

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