カスタムユーザープロファイルを作成できるプラグインを開発しました。それは動作し、必要に応じてフィールドを追加/削除できます。
私が直面している問題は次のとおりです。姓と名を別々に要求できるように、登録フォームの「名前」フィールドを削除または変更するにはどうすればよいですか?
ユーザーデータベースには名前が含まれているので、フィールドを削除することはできないことがわかります。そのため、データベースに入力するために、姓名を「name」フィールドに連結するのが最善であると考えていました。しかし、これを実装しようとしたときに問題が発生しました。
登録フォームから 'name'フィールドを削除するために、プロファイルプラグインのonContentPrepareForm()関数に以下を追加しました。
$ form-> removeField( 'name');
これにより、フィールドが正常に削除されます。ただし、名前=名+姓を他の場所に設定する必要があります。これらのフォーラムで、onUserBeforeSave()関数のデータを変更できることを確認しました。残念ながら、登録が失敗し、名前を入力する必要があることを示す検証エラーメッセージが表示されるまでは、このメソッドは呼び出されません。次に、registration.xmlファイルでrequiredをオフにしようとしました。うまくいかなかった(または間違ったファイルを変更した)。
次に、おそらくonContentPrepareData()関数に配置できると考えました。ここで遭遇した問題は、「名前」がフォームから削除され、それが$ data配列にないことです。
私は何をすべきか?これを修正する適切な方法は何ですか?
よろしくお願いします。
まず、この方法を容認しないことから始めましょう。次に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テーブルを照会する必要がある場合に、後日データベース内のユーザー関連フィールドを照会することもできます。
別の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>
詳細を忘れていなければ、コアファイルを変更しなくても機能するはずです。