@DavidFritschの答えはとても役に立ちました。しかし、私が見つけたいくつかの問題は次のとおりです。
A)フォーム送信時のデータフィルタリングで問題が発生するため、特定の必須フィールドを完全に削除することはできません(以下のコードのコメントを参照)。これに対処するには、フォームオブジェクトからフィールドを削除するのではなく非表示にします。B)onUserBeforeSaveイベントは、登録検証ロジックがフォームの送信を拒否するのが遅すぎるまで発生しません。代わりに、onUserBeforeDataValidationイベントを使用します。
私の特定の場合、私が欲しかったのはメールアドレスとパスワードだけでした。ただし、Joomlaはここで問題を起こしました。パスワードの後に電子メールアドレスが表示されたため(registration.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'];
}
}
}