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


16

まず、私はこの質問を知っています:

/programming/14799733/remove-name-field-from-joomla-registration-form

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

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

登録画像のデフォルト

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

  • ユーザーの本名を知る必要はありません。
  • 私はむしろ「確認」ボックスを持っていません。一般的なコンセンサスは、それらは必要ではないということです。 /ux/484/is-a-repeat-password-field-necessary-in-a-signup-page
  • すべてが必要ですが、なぜ必須フィールドにマークを付けるのですか?

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

より良い登録画像

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

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

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

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

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

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


1
このようなことを行う拡張機能のソースとしてJEDを指摘したいと思います。
バレンティンデスパ

@Lodderは、検証プロセスをスキップするために挿入した情報に感謝しますが、テンプレートで機能していないことを恐れています。コードを確認し、機能するコードで更新してください。@Ricksterのプロセスをフォローアップしたところ、それは魅力のように機能しました。私はjoomlaの初心者なので、この点に関してあなたの支援を求めています。前もって感謝します。

このStackoverflowの質問に対する答えは、あなたが望むものであることがわかった:Joomla 3登録の一部のフィールドの検証を無効にする方法
ロブL

回答:


12

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

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

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

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

8

わかりましたので、コアハックやサードパーティの拡張機能をインストールすることなくアプローチを考えていました。私の方法には、com_usersコンポーネント、特に登録ビュー用に作成する必要があるテンプレートオーバーライドが含まれます。

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

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);

コードの各スニペットが何をしているのかがわかるように、コメントを追加しました。

お役に立てれば :)


1

@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'];
    }
}

}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.