web-dev-qa-db-ja.com

Joomlaの登録:不要なフィールドを削除する

まず、私はこの質問を認識しています。

https://stackoverflow.com/questions/14799733/remove-name-field-from-joomla-registration-form

しかし、その答えのリンクは無効であり、言及されているファイルパスは最新のJoomla(バージョン3.3)には存在しないため、答えはまったく役に立ちません。

私が欲しいのは簡単です:Joomlaの登録フォームは次のようになります:

registration image default

ユーザーが実際にそれを完了するように、登録プロセスができるだけ簡単であることを確認したいのですが、いくつかの問題があります。

確かに、これははるかに優れた登録ページです。

better registration image

\ components\com_users\models\forms\registration.xmlファイルを変更して、フォームを希望どおりに表示しました。しかし、フォームを送信するたびに、検証はまだ欠落しているフィールドを探しているため、名前を指定する必要があることが通知されます。

「登録に失敗しました:名前を入力してください。」

名前フィールドと2つの確認フィールドのチェックを無効にするにはどうすればよいですか?

名前は必須なので、指定したユーザー名に名前を設定します(ユーザー名と名前はデフォルトで同じです)。ユーザーが実際に自分のプロファイルページに実際の名前を設定したい場合afterの登録は可能ですが、必須ではありません。

私はこれを間違った方法で行っていますか?いくつかの場所で、コアJoomlaファイルの変更は更新で中断する可能性があるため、適切ではなく、代わりに「オーバーライド」を使用する必要があることを読みました。通常、これらの応答は、オーバーライドに関するJoomlaのページにリンクしているだけであり、それらを使用して要求者が望むことを行う方法についての詳細な説明はありません。私はそれらを理解しようとしましたが、できません。そのため、オーバーライドが適切な方法である場合は、オーバーライドチュートリアルにリンクするだけでなく、それらを使用してこれを実行する方法を説明してください。

私はあなたが提供できるどんな助けにも大いに感謝します、私はこれを数時間今理解しようとしています!

16
gfrung4

理想的には、これはすべてユーザープラグインで行われます。多くの人がこれを理解しているとは思いませんが、プラグインからフォームを編集できます(コアハックは必要ありません)。

同様に、プラグインは、モデルがエントリを保存しようとする前に入力を確認するため、フィールド重複フィールドの一部をモックして、検証に合格させることができます。

この「ユーザー」プラグインの機能により、フォームを変更できます。

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'];
}
12
David Fritsch

さて、コアハッキングやサードパーティの拡張機能をインストールすることなく、アプローチについて考えていました。私の方法には Template Override が含まれ、これはcom_usersコンポーネント、特にRegistrationビュー。

ここでフィールド(テンプレートのオーバーライドがすべて設定されていると想定)については、フィールドを削除するのではなく、コントローラーとモーダルがフィールドからのデータを必要とするため非表示にします。テンプレートの上書きになる次のファイルを開きます。

templates/YOUR_TEMPLATE/html/com_users/registration/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);

私はいくつかのコメントに追加したので、コードの各スニペットが何をしているのかわかるでしょう。

お役に立てれば :)

8
Lodder

@DavidFritschの回答は非常に役に立ちました。私が見つけたいくつかの問題は次のとおりです。

A)特定の必須フィールドを完全に削除することはできません。フォーム送信時のデータフィルタリングで問題が発生するためです(以下のコードのコメントを参照)。これに対処するには、フォームオブジェクトからフィールドを削除するのではなく、非表示にします。 B)onUserBeforeSaveイベントは、登録検証ロジックがフォームの送信を拒否するのを遅らせるのが遅すぎるまで発生しません。代わりに、onUserBeforeDataValidationイベントを使用してください。

私の特定のケースでは、私が欲しかったのはメールアドレスとパスワードだけでした。ただし、電子メールアドレスがパスワードの後に​​表示されていたため(registration.xmlファイルで宣言されたフィールドの順序によって決定される)、Joomlaはここで複雑な問題を投げ込みました。これを回避するために、ユーザー名フィールドのラベルを「メールアドレス」に変更し、代わりにメールアドレスフィールドを非表示にしました。その後、フォームの送信時にユーザー名からデフォルトで電子メールが送信されます。

(マイナーな注意:他のフォームも考慮している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'];
    }
}

}
1
John Rix