Возможность для разработчика переопределить функцию CMain::AuthForm

Рейтинг: 119.2795  
Новая
Предложил Зайцев Артемий 28.11.2011 12:26:25

Возможность для разработчика переопределить функцию CMain::AuthForm

Прошу сделать возможность для разработчика переопределить функцию CMain::AuthForm для публичной части самостоятельно, как, например, можно переопределить bxmail.

Чтобы я мог написать свою функцию самостоятельно, и вызывать те компоненты авторизации/регистрации, которые хочу с какими хочу параметрами и шаблонами для данного сайта.

Описание проблемы из тикета #256136: Улучшить CMain::AuthForm:
В продукте есть проблема, которую мы никак не можем решить самостоятельно уже много лет.

Невозможно на сайте нормально изменить шаблоны компонентов:

system.auth.forgotpasswd
system.auth.changepasswd
system.auth.registration
system.auth.authorize

Дело в том, что на странице /auth/index.php и на странице, к которой доступ пользователю закрыт, вызывается функция CMain::AuthForm без параметров, которая вызывает эти компоненты. А все параметры задаются в настройках главного модуля.

Единственный способ что-то изменить - это копировать шаблоны компонентов в шаблон сайта под именем .default - но это не решение. Потому что придется скопировать во все шаблоны сайта.

Или скопировать в шаблон .default под именем .default - но это невозможно при многосайтовости.

Пользователь в принципе не должен видеть стандартный system.auth.registration при регистрации пользователей: во-первых, условия многих проектов предполагают, что его емэйл - это его логин, поле формы должно быть одно. Во вторых, при регистрации требуется вводить телефон, отчество и другие "очень важные поля".

На обычных страницах мы используем bitrix::main.register. Но если пользователь разавторизовался в закрытом разделе, то он видит стандартные

system.auth.forgotpasswd
system.auth.changepasswd
system.auth.registration
system.auth.authorize

а это косяк. Наш дизайн и идеи проектов не могут использовать стандартные шаблоны компонентов и компонент system.auth.registration вообще.

Рейтинг: 0  
Эльдар Рахимбердин 28.11.2011 14:34:31
Всё это можно сделать стандартно.

http://dev.1c-bitrix.ru/api_help/main/reference/cmain/authform.php

Смотрите колонку "Путь к компоненту"

Соответственно на страницах main/auth/forgot_password.php и т.д. нужно будет разместить свои компоненты

Или скопировать в шаблон .default под именем .default - но это невозможно при многосайтовости.
А в чем проблема при многосайтовости? Делал как раз так на многосайтовых проектах.
Рейтинг: 0  
Зайцев Артемий 28.11.2011 17:45:31
Шаблон компонента .default в шаблоне сайта .default - очень плохой тон.

Это означает, что при добавлении второго и любого следующего сайта, которые ничего общего с первым не имеют у всех будет общая измененная форма авторизации во всех шаблонах.

main/auth/forgot_password.php - вариант. В настройках системы надо отключить галочку "использовать компоненты 2.0". Но это тоже влияет на другой сайт.
Рейтинг: 0  
Долганин Антон 28.11.2011 22:55:14
Пожалуй, отдам голос "за". Потому что это малый геморрой таскать шаблоны. А в разрезе Маркета это еще сложнее делать и заставлять клиентов.

PS: Может имеет смысл туда воткнуть просто событие, а разработчик уже сможет повесить обработку события.
Рейтинг: 0  
Эльдар Рахимбердин 29.11.2011 13:06:13
Это означает, что при добавлении второго и любого следующего сайта, которые ничего общего с первым не имеют у всех будет общая измененная форма авторизации во всех шаблонах.
Ну так для новых сайтов можно положить шаблон компонента в их шаблон сайта и тогда шаблон из .default не будет использоваться.

Кончено, если на ядре 20 сайтов и их делали 40 программистов в разное время, то будет сложновато внедрить этот способ. Но на проектах с нуля этот способ меня ни разу не подвел.
Рейтинг: 0.0707  
Зеленецкий Дмитрий 05.07.2012 16:59:21
Сама возможность переопределить функцию из ядра немного не корректна. А решением вашей проблемы является написание своего компонента.

Я лично сделал один комплексный компонент, который агрегирует такие возможности + туда сделал и чпу, чтобы не было некрасивых имет в адресной строке. Проблема только тягать из проекта в проект, но может в маркетплейс загружу - будет проще.

Можно еще попросить чтобы вообще убрали эту функцию из ядра, а пользовались лишь стандартными компонентами. Тогда будет проще разработчикам стилизировать.
Рейтинг: 0  
Зайцев Артемий 06.07.2012 09:53:23
Я тоже хотел написать свой компонент. Есть прототип, где в зависимости от условий в URL выводятся разные компоненты. Но:

как только пользователь открывает закрытый раздел, или стандартный компонент, там везде вызывается $APPLICATION->AuthForm. С этим я ничего не могу поделать. Ни событие обработать, ни функцию подменить.
Рейтинг: 0  
Dumbravanu Vadim 27.10.2012 15:48:31
В настройках ядра есть параметр "Страница регистрации (для системного компонента авторизации)".
Рейтинг: 0  
Зайцев Артемий 27.10.2012 16:17:04
В настройках ядра есть параметр "Страница регистрации (для системного компонента авторизации)".
Вадим, это только настройка для шаблона компонента авторизации, куда ссылку на регистрацию показывать.

Есть и другие сценарии. Например, пользователи могут через страницу восстановления пароля /auth/ попасть на регистрацию, где нет всех полей. И зарегистрироваться без номера телефона.

Я считаю, что механизм авторизации в Битриксе крайне непродуманный. Точнее он устаревший. Сначала были включаемые файлы, а потом компоненты 2.0. Потом появилась авторизация через социальные сервисы (кривая для разработчиков). Важно было сохранить преемственность. Получился франкенштейн.

Единственный приемлемый способ работы сейчас:
- в каждом шаблоне сайта кастомизировать шаблон компонента авторизации (с именем .default)
- в каждом шаблоне сайта кастомизировать шаблон компонента регистрации с именем .default и вставить в него вызов компонента main.register со всеми полями.

В ситуации, когда шаблонов сайта много, происходит дублирование кода шаблонов компонентов авторизации/рагистрации в каждом шаблоне сайта.

Ситуацию может исправить использование родительских шаблонов сайта
https://idea.1c-bitrix.ru/vvesti-ponyatie-roditelskogo-shablona-sayta/