web-dev-qa-db-ja.com

プログラムでノードを検証しますか?

プログラムで多くのノードを作成しています。明らかにそれらを保存する前に有効でなければなりません。そのような_$node_オブジェクトには、CCKフィールドとカスタムフィールドが混在しています。

バリデーターは form_set_error() のみを設定し、検証結果を返すことはほとんどないため、ノードが有効かどうかを知るためにform-apiを経由する必要があります。そうみたいです。

私は node_validate() を呼び出し、次に form_get_errors() (これはform_set_error()を呼び出します)。

このアプローチにはいくつかの問題があるようです:

  • form_set_error()drupal_set_message() ;でメッセージを設定します。 cron(セッションレスユーザー)などの場合、これは孤立した永続的なエラーメッセージをデータベースに追加します(これらは表示されないため、削除されません)。
  • エラーの戻り配列は、多次元フォーム配列で使用するために作成されます。特にCCKフィールドでは、実際のエラーを見つけるためにかなり深く掘る必要があります。
  • ノードを保存したいだけなので、ユーザー向けのフォームには興味がありません。フォームAPIの使用は、間違っているように感じます。

よりシンプルでエレガントな方法はありますか?

7
berkes

ノードを検証するためにモジュールが実装する必要があるフックはhook_validate()(モジュールがコンテンツタイプを実装する場合)と hook_nodeapi( 'validate') (すべての他のモジュール)。これらのフックは$formパラメータを取得し、検証エラーが発生した場合に form_set_error() を呼び出すことになっています。

フォームに設定されたエラーがあるかどうかを見つける簡単な方法は、form_get_errors()を使用して、form_set_error()からも呼び出される関数であるform_error()で設定されたすべてのエラーを含む配列を返すことです。

複数のノードが検証される場合、form_set_error(NULL, '', TRUE)の前にnode_validate()を呼び出し、form_get_errors()からエラーメッセージを含む配列を取得する必要があります。これが空の場合、エラーメッセージはありません。

form_set_error(NULL, '', TRUE);

// node_validate() call.

$errors = form_get_errors();

if (!empty($errors)) {
  // Some module reported an error.
}

または、次のスニペットを使用して、node_validate()を呼び出した後、モジュールがエラーを報告していないことを確認できます。

if (!empty($_SESSION['messages']['error'])) {
  // Some module reported an error.
}

Cronタスクからnode_validate()を呼び出す前に、$_SESSION['messages']['error']を空の配列に設定する必要があります。このようにして、配列で報告されたエラーがノード検証フックによって引き起こされていることを確認します。

$_SESSION['messages']は、関数に渡されるメッセージを格納するために drupal_set_message() から使用される変数です。

function drupal_set_message($message = NULL, $type = 'status', $repeat = TRUE) {
  if ($message) {
    if (!isset($_SESSION['messages'])) {
      $_SESSION['messages'] = array();
    }

    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }
    // …
  }
  // …
}
5
kiamlaluno