Регистрация Joomla: удаление ненужных полей
Во-первых, я знаю об этом вопросе:
https://stackoverflow.com/questions/14799733/remove-name -полем-с-JOOMLA-регистрации-формы
Но ссылка в его ответе мертва, и упомянутый путь к файлу не существует в последней версии Joomla (версия 3.3), поэтому ответ бесполезен.
Я хочу просто: регистрационная форма для Joomla выглядит так:
Я хочу, чтобы процесс регистрации был как можно более простым для моих пользователей, поэтому они действительно заполняют его, и есть некоторые проблемы:
- Мне не нужно знать настоящее имя пользователя.
- Я бы предпочел не иметь «подтверждать» коробки. Общий консенсус в том, что они не нужны. https://ux.stackexchange.com/вопросы /484 /это-повторяю пароль-поле-необходимо-в-SIGNUP-странице
- Требуется все, для чего нужно пометить обязательные поля?
Конечно, это гораздо лучшая страница регистрации:
Я изменил файл \ components \ com_users \ models \ forms \ registration.xml , чтобы форма выглядела так, как я хочу, и она сработала! Но всякий раз, когда я отправляю форму, валидация по-прежнему ищет недостающие поля, поэтому она сообщает мне, что мне нужно указать имя:
«Ошибка регистрации: введите свое имя».
Как отключить проверки поля имени, а также два поля подтверждения?
Поскольку имя требуется, я хотел бы указать имя для указанного имени пользователя (так что имя пользователя и имя по умолчанию совпадают). Если пользователь действительно хочет установить настоящее имя на странице своего профиля после , они должны быть в состоянии, но это не обязательно.
Неужели я ошибаюсь? Я читал в некоторых местах, что изменение основных файлов Joomla не очень хорошо, поскольку оно может сломаться в обновлении и что вместо этого следует использовать «переопределения». Обычно эти ответы просто ссылаются на страницу Joomla на переопределениях и не дают более подробного объяснения о том, как использовать их, чтобы делать то, что хочет ассер. Я попытался выяснить их, но не могу, поэтому, если переопределения - это путь, пожалуйста, объясните, как я буду делать это с ними, а не просто ссылку на учебник переопределения.
Я бы очень признателен за любую помощь, которую вы можете предоставить, я пытался понять это в течение нескольких часов!
3 ответа
В идеале это будет сделано в пользовательском плагине. Я не уверен, что многие люди это понимают, но вы можете отредактировать форму из плагина (не требуется основной хакер).
Аналогично, плагин увидит вход, прежде чем модель попытается сохранить запись, поэтому вы можете издеваться над некоторыми полями дублирования поля, чтобы заставить его пройти проверку.
Эта функция в плагине «users» позволяет вам изменить форму:
function onContentPrepareForm($form, $data)
{
if (!($form instanceof JForm))
{
$this->_subject->setError('JERROR_NOT_A_FORM');
return false;
}
// Check we are manipulating a valid form,
// may also want to check whether this is frontend or admin depending on where all you want to affect
// JFactory::getApplication()->isAdmin()
$name = $form->getName();
if (!in_array($name, array('com_admin.profile', 'com_users.user', 'com_users.profile', 'com_users.registration')))
{
return true;
}
// remove fields on frontend
if (!JFactory::getApplication()->isAdmin()) {
$form->removeField('password2');
$form->removeField('email2');
}
return true;
}
Затем вы можете использовать функцию onUserBeforeSave для сброса любого из полей, которые необходимо сбросить, чтобы пройти проверку. (Это может быть не обязательно, поэтому попробуйте без ошибок и посмотрите, какие ошибки вы получите.)
function onUserBeforeSave($user, $isnew, $new) {
$user['password2'] = $user['password1'];
}
Хорошо, поэтому я подумывал о подходе, не имея при себе никакого взлома или установки каких-либо сторонних расширений. Мой метод будет включать переопределение шаблона , который вам нужно будет сделать для компонента com_users , в частности представление Регистрация .
Теперь для полей (при условии, что ваш шаблон переопределяет все настройки), мы не будем их удалять, а вместо этого скрывать их, поскольку контроллер и модальные данные требуют от них. Поэтому откройте следующий файл, который теперь отменяется вашим шаблоном:
Шаблоны /YOUR_TEMPLATE /html /com_users /регистрация /default.php
и добавьте следующий код в верхней части файла сразу после JHtml::_('behavior.formvalidation');
:
$doc = JFactory::getDocument();
$js = "
jQuery(document).ready(function($){
// Define the variables
var regForm = $('#member-registration');
var name = regForm.find('#jform_name');
var password = regForm.find('#jform_password1');
var password2 = regForm.find('#jform_password2');
var email = regForm.find('#jform_email1');
var email2 = regForm.find('#jform_email2');
// Hide the required field, star, name, confirm pass and confirm email
regForm.find('.spacer').parents('.control-group').hide();
regForm.find('.star').hide();
name.parents('.control-group').hide();
password2.parents('.control-group').hide();
email2.parents('.control-group').hide();
// Add a default value to the name field
name.val('Anonymous');
// Clone password and email values to the confirm fields
email.on('keyup', function() {
email2.val( this.value );
});
password.on('keyup', function() {
password2.val( this.value );
});
});
";
$doc->addScriptDeclaration($js);
Я добавил некоторые комментарии, чтобы вы знали, что делает каждый фрагмент кода.
Надеюсь, что это поможет:)
@ Ответ DavidFritsch был очень полезен. Несколько проблем, которые я нашел, были:
A) Вы не можете полностью удалить определенные обязательные поля, поскольку это вызывает проблемы с фильтрацией данных при отправке формы (см. комментарии в коде ниже). Чтобы бороться с этим, скройте, а не удалите поля из объекта формы. B) Событие onUserBeforeSave не запускается до тех пор, пока не будет слишком поздно, чтобы предотвратить отклонение логики проверки регистрации от отправки формы. Вместо этого используйте событие onUserBeforeDataValidation.
В моем конкретном случае все, что я хотел, это адрес электронной почты и пароль. Однако Joomla усложнила ситуацию, поскольку адрес электронной почты появлялся после пароля (продиктованного порядком полей, объявленных в файле registration.xml), что выглядело бы глупо с точки зрения пользователя. Чтобы обойти это, я перемаркировал поле имени пользователя «Адрес электронной почты» и вместо этого скрыл поле адреса электронной почты. Затем по умолчанию имя пользователя отправляется по имени пользователя.
(Незначительное примечание: я ограничил плагин, чтобы он работал только в форме «com_users.registration» для моих целей, по сравнению с ответом Дэвида, который также рассматривает другие формы.)
class PlgUserSimpleRegistration extends JPlugin
{
function onContentPrepareForm($form, $data)
{
if (!($form instanceof JForm))
{
$this->_subject->setError('JERROR_NOT_A_FORM');
return false;
}
// Check we are manipulating the registration form
if ($form->getName() != 'com_users.registration')
{
return true;
}
// Check whether this is frontend or admin
if (JFactory::getApplication()->isAdmin()) {
return true;
}
// Remove/Hide fields on frontend
// Note: since the onContentPrepareForm event gets fired also on
// submission of the registration form, we need to hide rather than
// remove the mandatory fields. Otherwise, subsequent filtering of the data
// from within JModelForm.validate() will result in the required fields
// being stripped from the user data prior to attempting to save the user model,
// which will trip an error from inside the user object itself on save!
$form->removeField('password2');
$form->removeField('email2');
$form->setFieldAttribute('name', 'type', 'hidden');
$form->setValue('name', null, 'placeholder');
$form->setFieldAttribute('email1', 'type', 'hidden');
$form->setValue('email1', null, JUserHelper::genRandomPassword(10) . '@invalid.nowhere');
// Re-label the username field to 'Email Address' (the Email field
// ordinarily appears below the password field on the default Joomla
// registration form)
$form->setFieldAttribute('username', 'label', 'COM_USERS_REGISTER_EMAIL1_LABEL');
return true;
}
function onUserBeforeDataValidation($form, &$user) {
if ($form->getName() != 'com_users.registration') {
return true;
}
if (!$user['username']) {
// Keep up the pretense from above!
$form->setFieldAttribute('username', 'label', 'COM_USERS_REGISTER_EMAIL1_LABEL');
return true;
}
if (!$user['name'] or $user['name'] === 'placeholder') {
$user['name'] = $user['username'];
$user['email1'] = $user['email2'] = $user['username'];
$user['password2'] = $user['password1'];
}
}
}