@DavidFritsch의 답변은 매우 도움이되었습니다. 내가 찾은 몇 가지 문제는 다음과 같습니다.
A) 양식 제출시 데이터 필터링에 문제가 발생하므로 특정 필수 필드를 완전히 제거 할 수 없습니다 (아래 코드의 주석 참조). 이 문제를 해결하려면 양식 객체에서 필드를 제거하지 말고 숨기십시오. B) 등록 유효성 검사 논리가 양식 제출을 거부하지 못하도록 너무 늦을 때까지 onUserBeforeSave 이벤트가 시작되지 않습니다. 대신 onUserBeforeDataValidation 이벤트를 사용하십시오.
제 경우에는 이메일 주소와 비밀번호 만 있으면됩니다. Joomla는 이메일 주소가 비밀번호 (등록 .xml 파일에 선언 된 필드의 순서에 따라 결정됨) 뒤에 표시되어 사용자 경험의 관점에서 다루어지지 않았기 때문에 여기서 합병증을 일으켰습니다. 이 문제를 해결하기 위해 사용자 이름 필드에 '이메일 주소'라는 레이블을 다시 지정하고 대신 이메일 주소 필드를 숨겼습니다. 이메일은 양식 제출시 사용자 이름으로 기본 설정됩니다.
(사소한 참고 : 다른 형식도 고려하는 David의 대답과 비교할 때 플러그인이 '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'];
}
}
}