2016-05-23 1 views
0

ノード作成フォームに検証フックを追加しました。フォームが検証に失敗したかどうか確認してください

私のプロジェクトでは、この検証は1回だけ必要です。基本的には、値がすでにDBに存在するかどうかを確認してユーザーに通知します。ユーザーが依然としてフォームを提出する場合、私はとにかくそれを追加する必要があります。

私はそのような何かしたいと思います:検証フックは初回のみ呼び出されるように、私のhook_form_alterで

if (form_did_not_fail_validation_before) { 
    $form['#validate'][] = 'my_module_validation_hook'; 
} 

を。

フォームが既に検証に失敗したかどうかを確認する方法が見つかりません。

+0

"はそれを呼び出すようにしてくださいmy_module_validate "となります。 :) – kwoxer

+0

あなたは何を検証しますか?それはテキストフィールドですか?次に、テキストフィールドのフォーカスを離れるときにajaxコールバックを使用して、フォームを通知で更新することをお勧めします(#markupのフォーム要素)。 バリデーションフックに入れたい場合は、バリデーションを済ませた$ formStateにバリデーションフックを保存することができます。あなたが私にもっと情報を与えるなら、私は例を作るでしょう。 – Triss

答えて

0

ここでこの問題を解決する方法の1つです。しかし、テキスト形式のようなフォーム入力を使用している場合は、Ajaxコールバックを使用することをお勧めします。 Ajaxコールバックを使ってそれを解決する方法の例が必要かどうかを教えてください。

私はここで、キーは、それが簡単にここで$form_state['values']

から値を取得するよりも、私はそのフォームが再構築され$form_state['rebuild'] = true;を使用していることだと思いコードされています

function example_form(array $form, array &$form_state) 
{ 
    $form['temp'] = array(
     '#type' => 'value', 
     '#value' => array_key_exists('values', $form_state) ? $form_state['values']['temp'] + 1 : 1, 
    ); 

    if (array_key_exists('values', $form_state) && $form_state['values']['temp'] == 1) 
    { 
     $form['message'] = array(
      '#markup' => t('I only give you one warning'), 
      '#prefix' => '<p>', 
      '#suffix' => '</p>', 
     ); 
    } 

    $form['submit_button'] = array(
     '#type' => 'submit', 
     '#value' => t('Click Here!'), 
    ); 

    return $form; 
} 

function example_form_validate(array $form, array &$form_state) 
{ 
    $form_state['rebuild'] = true; 
} 

function example_form_submit(array $form, array &$form_state) 
{ 
    if($form_state['values']['temp'] == 1) { 
     // I will not store anything 
    } else { 
     // now I will store it :) 
    } 
} 
関連する問題