0

ユーザーが事前登録のためにメールアドレスを入力する入力フィールドが 1 つしかない単純なページがあります。しかし、ページ レイアウトは、ユーザーがメールの左側の部分だけを挿入できるように設計されています。(特定の電子メール ドメインを持つユーザーのみを受け入れます)。

したがって、ページ レイアウト (メール入力部分) は次のようになります。

[入力ボックス] @ defaultdomain.com

問題は、DB のそれぞれのテーブルにマップされた PreRegistration というモデルを作成したことです。私が今のところそこに保存しているのは、挿入された電子メールだけです。したがって、モデルのバリデータには次のコードがあります。

public $validate = array(
    'email' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'Email field cannot be empty'
        ),
        'email' => array(
            'rule' => array('email'),
            'message' => 'The email is not valid.'
        )   
    )
);

そしてビューで:

echo $this->Form->input('email', array(
        'class' => 'input_box',
        'value' => $input_box_default_text,
        'id' => 'email',
        'label' => false,
        'div' => false
    ));

問題は、バリデーターがテキスト フィールドを検証していて、ユーザーがドメインを含む通常の電子メールを挿入することを期待していることです (当然です)。Cakephp がデフォルト ドメインと連携してテキスト フィールドを検証するにはどうすればよいですか?

4

1 に答える 1

3

@cske によって提案されたようにデータを変更します (ただし、の代わりにController::$request::$dataorを変更します)。つまり、保存/検証する前にドメイン部分をユーザー入力に追加し、その結果、データベースに完全な電子メール アドレスを保存するか、次を使用するカスタム検証ルールを使用します。ドメイン部分は検証目的のみで、次のようになります。Model::$data$_POST

App::uses('Validation', 'Utility');

...

public $validate = array(
    'email' => array(
        'required' => array(
            'rule' => array('notEmpty'),
            'message' => 'Email field cannot be empty'
        ),
        'email' => array(
            'rule' => array('validatePreRegistrationEmail'),
            'message' => 'The email is not valid.'
        )   
    )
);

...

public function validatePreRegistrationEmail($data)
{
    $email = current(array_values($data)) . '@defaultdomain.com';
    return Validation::email($email);
}
于 2013-09-13T12:08:53.253 に答える