2017-09-28 21 views
2

私はCakePHPで 'フォームエディタ'を作成しています。オンザフライ/ダイナミックCakePhp 3検証とFormHelper

インターフェイスでは、ユーザーがフィールドに適用する検証を選択できます。数値、電子メールなど

このように私は、ユーザー入力に基づいてモデルの検証を動的に作成する必要があります。このために私はValidationオブジェクトを使うことができます:https://book.cakephp.org/3.0/en/core-libraries/validation.html

フィールドのエラーメッセージを自動的に出力するなど、FormHelperの機能を利用したいと考えています。

私はフォーム - のコンテキストオプションでバリ>(作成)を設定することにより、これを行うにはモデルからハードコーディングされたバリデータを使用する方法を見ることができます - しかし、どのように私はされている顧客の$バリデータオブジェクトを使用します動的に作成されますか?

明確化:

//get the form configuration 
$form = $this->Forms->get($id, ['contain'=>['FormFields'=>['Validations']]]); 


//set up validation based on the configuration 

$validator = new Validator(); 
foreach($form->form_fields as $field){ 
    ... 
    if($field->required) $validator->notBlank($field->field_name); 

} 


$table = TableRegistry::get($form->type); 

$table->setValidator($validator); 

残念ながらsetValidator()TableRegistryの方法ではありません。

私は私のコントローラ内のいくつかのコードを持っています。

モデルで検証を設定した場合は、正しいフォーム設定を検索するために$ idパラメータが必要になります。

+0

あなたの質問はどういうわけか、実際の問題がないかのように読み込まれます。オブジェクトがどのように作成されたか、一度作成されると、原点に関係なく使用されます。 – ndm

+0

ありがとうございました。私はそれから私の質問はどう思う? Validatorオブジェクトを作成できます。そのオブジェクトを使用して検証を実行できますが、これを使用してフォームヘルパーがエラーにアクセスできるようにテーブル(?)を設定するにはどうすればよいですか? –

+0

バリデータを作成する場所と作成方法、バリデーションにどのように使用されているかを示すことができます。たとえば 'validationDefault()'(またはモデルの検証メソッド)や 'Model.buildValidator'イベントを使って作成すると、何もする必要はありません。通常、検証エラーはエンティティは、ほとんどの場合、最初に手動でバリデータオブジェクトに触れる必要はありません。エンティティをフォームヘルパに渡すだけで済みます。 – ndm

答えて

0

私は私のモデルに次のコードを追加しました:

protected $validator = null; 

public function validationDefault(Validator $validator){ 
    if($this->validator != null) return $this->validator; 
    return $validator; 
} 

public function setValidator(Validator $validator){ 
    $this->validator = $validator; 
} 

をので、デフォルトのバリが効果的setValidatorメソッドを経由して設定することができます。その後、私のコントローラで

//get the form configuration 
$form = $this->Forms->get($id, ['contain'=>['FormFields'=>['Validations']]]); 


//set up validation based on the configuration 

$validator = new Validator(); 
foreach($form->form_fields as $field){ 
    ... 
    if($field->required) $validator->notBlank($field->field_name); 

} 


$table = TableRegistry::get($form->type); 

$table->setValidator($validator); 

私は、これは他の人のために役立ちます願っています。