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

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

Ваш вопрос может быть удален без объяснения причин, если на него есть ответы по приведённым ссылкам (а вы рискуете получить предупреждение ;) ).
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 10 лет 2 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

В чем существенное преимущество и почему не использовать обычные запросы?
Существенное преимущество в бОльшей простоте и бОльшей безопасности. Насколько я знаю, эта общая проблема драйверов БД в PHP. Вместо того, что-бы использовать биндинг, который есть во всех БД, используется обработка параметров для подстановки их прямо в SQL запрос. Честно говоря, удивлен что в phpbb этот костыль тоже активно используется. :(
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16947
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1700 раз

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

Сообщение rxu »

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

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

Сообщение UncleAndy »

С первым соглашусь, со вторым - не обязательно.
Я лично экспериментировал с SQL Injection и убедился на практике что передача данных через биндинг параметры исключает их возможность. По крайней мере, у меня ни разу не получилось сделать ее через такие параметры. В отличии от подстановки.

Относительно приведенной ссылки - здесь как раз биндинга нет, а есть подстановка. Вернее, это просто не очень удачный способ автоматизации. Однако, надо учитывать что имена параметров почти никогда не передаются снаружи напрямую. Это надо быть сверхнекомпетентным что-бы сделать возможность такой инъекции.

Добавлено спустя 42 минуты 24 секунды:
Вопрос по правильной организации кода.

Мне нужно сделать класс, который будет заниматься определенными операциями (криптография). Где его располагать "по фэншую"? У меня есть два варианта - в хэлперах или в отдельной папке /libs.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16947
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1700 раз

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

Сообщение rxu »

Опять зависит от потребностей.
В принципе, в хелперах обычно располагаем набор универсальных методов, не более. Если будет солидный объект, например, интерфейс, его имплементация, и наследующие классы, то лучше в отдельной папке. libs слишком общее имя, я бы выбрал что-то вроде core/crypt например.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 10 лет 2 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

По большому счету, вроде-бы все получается. Сейчас единственная загвоздка с хранением времени в БД. Сделал вот такую миграцию:

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

                                $this->table_prefix . 'login_signs' => array(
                                        'COLUMNS'               => array(
                                                'id'                    => array('VCHAR:64', ''),
                                                'code'                  => array('VCHAR:32', ''),
                                                'sign'                  => array('TEXT', ''),
                                                'public_key'            => array('TEXT', ''),
                                                'public_key_id'         => array('VCHAR:64', ''),
                                                'created_at'            => array('TIMESTAMP', null),
                                                'signed_at'             => array('TIMESTAMP', null),
                                        ),
                                        'PRIMARY_KEY'   => 'id',
При этом поля created_at и signed_at создались в базе с типом integer. С этим можно что-то сделать (что-бы в базе создавались поля типа TIMESTAMP)?
Аватара пользователя
xisp
phpBB 3.0.0 RC7
Сообщения: 1798
Стаж: 12 лет 11 месяцев
Благодарил (а): 97 раз
Поблагодарили: 91 раз
Забанен: Бессрочно

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

Сообщение xisp »

UncleAndy писал(а):При этом поля created_at и signed_at создались в базе с типом integer
Так и нужно. Посмотрите на стандартные поля со временем- они тоже в integer. Там хранится метка времени в формате UNIX TIME.
phpBBex
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16947
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1700 раз

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

Сообщение rxu »

UncleAndy писал(а):поля created_at и signed_at создались в базе с типом integer
См. \phpbb\db\tools.php - это алиас для полей различной размерности в зависимости от СУБД, но все они имеют целый тип.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 10 лет 2 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

Ясно. Спасибо. Попробую с unixtime. Если я расширение привяжу к определенной БД, это будет не очень хорошо.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16947
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1700 раз

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

Сообщение rxu »

UncleAndy писал(а): Если я расширение привяжу к определенной БД, это будет не очень хорошо.
Как раз наоборот. С типом timestamp в зависимости от используемой СУ БД будет создаваться поле нужного типа.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 10 лет 2 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

С типом timestamp в зависимости от используемой СУ БД будет создаваться поле нужного типа.
Что значит "нужного"? Тут важно единство способов работы с этим полем независимо от базы данных. Integer как раз удовлетворяет этому условию. Т.к. integer он и в Африке integer. :)

Начал работать дальше и появились вопросы по провайдеру авторизации. Я сейчас не предполагаю изменять стандартные пути для формы логина и т.д. Но в случае если авторизация не прошла, откуда мне взять URL формы логина что-бы на нее вернуться? Или тут достаточно отдать в ответ "'status' => LOGIN_ERROR_EXTERNAL_AUTH" и phpbb сам вернеться на страницу логина?
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16947
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1700 раз

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

Сообщение rxu »

UncleAndy писал(а):Что значит "нужного"?
rxu писал(а):\phpbb\db\tools.php
Смотрели? Там всё понятно.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 10 лет 2 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

Обнаружилась странная проблема. В своем auth_provider мне нужно использовать свои таблицы из БД. Но я не нашел где я из него могу получить table_prefix. Так, как у меня получалось в контроллере - через $this->table_prefix не получается. :(

Подскажите, плиз, откуда можно взять table_prefix в auth провайдере?

PS. Сам себе отвечаю. В сервисе можно прописать в качестве одного из параметров auth провайдера %core.table_prefix%
Последний раз редактировалось UncleAndy 21.02.2015 21:10, всего редактировалось 1 раз.
Аватара пользователя
rxu
phpBB Guru
phpBB Guru
Сообщения: 16947
Стаж: 18 лет 11 месяцев
Откуда: Красноярск
Благодарил (а): 549 раз
Поблагодарили: 1700 раз

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

Сообщение rxu »

Посмотрите пример в расширении https://github.com/rxu/thanks_for_posts
В tables.yml объявлена кастомная таблица, файл потом импортирован в основной конфиг. Затем имя передано в списке сервисов нужному классу.
Если нужен именно префикс, он на строку выше.
Изображение
UncleAndy
phpBB 1.4.1
Сообщения: 44
Стаж: 10 лет 2 месяца
Благодарил (а): 7 раз

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

Сообщение UncleAndy »

rxu, спасибо! Как раз так и сделал.

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

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

                return array(
                        'TEMPLATE_FILE' => '@gplvote/auth_provider_gplvote.html',
                        'VARS'  => array(),
                );
Но на странице логина все так-же отображается обычная страница. Только внизу исчез блок о регистрации. Я так подозревая что для полной замены страницы логина (еще и с предварительными операциями по подготовке данных для нее) надо действовать по другому. Но как именно?
Anvar
Former team member
Сообщения: 1965
Стаж: 15 лет 1 месяц
Благодарил (а): 57 раз
Поблагодарили: 622 раза

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

Сообщение Anvar »

Там же есть события core.login_box_redirect и core.login_box_failed, подключить можно свой шаблон в listener.
Пример:

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

				page_header($this->user->lang['LOGIN'], false);
				$this->template->set_filenames(array('body' => '@ext_name/login_body.html'));
				page_footer();
				exit();
Разместить в расширении @ext_name/

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