web-dev-qa-db-ja.com

myform_validate()中に値を保持します

Drupal 6には、カスタムフォーム検証関数があります。ここで、

  • フィールドBが空の場合、フィールドAからフィールドBに値をコピーします。
  • フィールドBにX個を超える文字が含まれている場合は、form_set_error()を呼び出します。

検証は正常に機能し、エラーが設定されます。問題は、フォームが再構築されるときにフィールドBの値が保持されないことです。フィールドBは空のままです。検証後(エラーが設定されている場合)にフィールドBの値を保持して、ユーザーが適切な長さまで簡単に編集できるようにします。

私の検証関数は次のようになります:

function myform_validate($form, &$form_state) {
  if (empty($form_state['values']['field_b']['0']['value'])) {
        $form_state['values']['field_b']['0']['value'] = $form_state['values']['field_a']['0']['value']; 
      }
      if (strlen($form_state['values']['field_b']['0']['value']) > 260) {
        form_set_error('field_b', 'Text in field b is too long');
      }
    }
  }
}

フォームが再構築されるときにフィールドBの値を保持する方法に関する提案はありますか?

3
brunodbo

検証コールバック内からフォームの値を設定する場合は、 form_set_value のようなものを使用する必要があります。上記の方法で直接割り当てられた値は保持されませんが、その関数はうまくいくはずです!これは、特にこの目的を目的としています-検証フェーズ中にフォームの値を設定します。

例えば:

function myform_validate($form, &$form_state) {
  if (empty($form_state['values']['field_b'])) {
        // Note that the $form array - not $form_state - is used in the first parameter.
        // The second parameter is the value you are setting.
        // Third just pass the $form_state array itself, which will be altered by form_set_vaue().
        form_set_value($form['field_b'], $form_state['values']['field_a'], $form_state); 
      }
      if (strlen($form_state['values']['field_b']) > 260) {
        form_set_error('field_b', 'Text in field b is too long');
      }
    }
  }
}
4
jordojuice