web-dev-qa-db-ja.com

登録フォームの「名前」フィールドを削除または変更して、姓名を個別に要求するにはどうすればよいですか?

カスタムユーザープロファイルを作成できるプラグインを開発しました。それは動作し、必要に応じてフィールドを追加/削除できます。

私が直面している問題は次のとおりです。姓と名を別々に要求できるように、登録フォームの「名前」フィールドを削除または変更するにはどうすればよいですか?

ユーザーデータベースには名前が含まれているので、フィールドを削除することはできないことがわかります。そのため、データベースに入力するために、姓名を「name」フィールドに連結するのが最善であると考えていました。しかし、これを実装しようとしたときに問題が発生しました。

登録フォームから 'name'フィールドを削除するために、プロファイルプラグインのonContentPrepareForm()関数に以下を追加しました。

$ form-> removeField( 'name');

これにより、フィールドが正常に削除されます。ただし、名前=名+姓を他の場所に設定する必要があります。これらのフォーラムで、onUserBeforeSave()関数のデータを変更できることを確認しました。残念ながら、登録が失敗し、名前を入力する必要があることを示す検証エラーメッセージが表示されるまでは、このメソッドは呼び出されません。次に、registration.xmlファイルでrequiredをオフにしようとしました。うまくいかなかった(または間違ったファイルを変更した)。

次に、おそらくonContentPrepareData()関数に配置できると考えました。ここで遭遇した問題は、「名前」がフォームから削除され、それが$ data配列にないことです。

私は何をすべきか?これを修正する適切な方法は何ですか?

よろしくお願いします。

2
nimble

まず、この方法を容認しないことから始めましょう。次にJoomlaを更新するときに、これらの変更を完全に元に戻す可能性が高くなります。

ただし、これは、達成しようとしていることを行うための実用的な方法です。

ファイルコンポーネントを編集> com_users>モデル>フォーム> registration.xml

名前フィールドをコメント化する

<!--<field
    name="name"
    type="text"
    description="COM_USERS_REGISTER_NAME_DESC"
    filter="string"
    label="COM_USERS_REGISTER_NAME_LABEL"
    required="true"
    size="30"
/>-->

これら2つのフィールドを追加

<field
    name="firstname"
    type="text"
    description="Users First Name"
    filter="string"
    label="First Name"
    required="true"
    size="30"
/>

<field
    name="lastname"
    type="text"
    description="Users First Name"
    filter="string"
    label="First Name"
    required="true"
    size="30"
/>

ファイルコンポーネント> com_users> controllers> registration.php

次のコード行を127行目に追加します。

$requestData['name'] = $requestData['firstname'].' '.$requestData['lastname'];

直後

$requestData = $this->input->post->get('jform', array(), 'array');

これにより、名と姓のフィールドがJoomlasの登録に必要な名前フィールドに連結されます。

これを行うもう1つの方法は、Community Builderをインストールし、必要なカスタムフィールドをセットアップして、com_usersの代わりにCBに登録を処理させるだけです。これにより、ユーザーIDをフィルターとして使用してデータベース内のCBテーブルを照会する必要がある場合に、後日データベース内のユーザー関連フィールドを照会することもできます。

2
Terry Carter

別のRegistration Controllerを作成して、register()の動作をオーバーライドできます。

<?php
class UsersControllerRegistration2 extends UsersController
{
    public function register()
    {
        ...
        $requestData = $this->input->post->get('jform', array(), 'array');
        $requestData['name'] = $requestData['firstname'].' '.$requestData['lastname'];
        ...
        $data   = $model->validate($form, $requestData);
        ...
    }
}
?>

元のメソッドで、このregister()メソッドの欠落部分を確認できます。この新しいコントローラーファイルにregistration2.phpという名前を付け、components/com_users/controllers /ディレクトリに配置します。

登録フォームで、アクションターゲットとタスク入力を変更する必要があります(テンプレートの登録ビューをオーバーライドして変更します)。

 <form id="member-registration" action="<?php echo JRoute::_('index.php?option=com_users&task=registration2.register'); ?>" method="post" class="form-validate form-horizontal well" enctype="multipart/form-data">
 ...
  <input type="hidden" name="task" value="registration2.register" />
 ...
 </form>

詳細を忘れていなければ、コアファイルを変更しなくても機能するはずです。

1
titchagcreation