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


7

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

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

node_validate()次にを呼び出します(次にを呼び出しform_get_errors()ますform_set_error())。

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

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

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


使用しているデータソースに無効なデータが含まれている可能性があるという問題ですか、それとも自分のコードを検証しようとしているだけですか。
mpdonadio

有効であるかどうかの定義に応じて、「無効」なノードの保存を避けたいだけです。たとえば、画像が必要な場合、テーマに関係なくその画像をレンダリングできると想定できます。インポーターがこれらの画像なしでノードの保存を開始すると、テーマは壊れた画像リンクを印刷します。
11

回答:


5

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

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

複数のノードが検証される場合、form_set_error(NULL, '', TRUE)before を呼び出して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.
}

node_validate()cronタスクから呼び出す前$_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();
    }
    // …
  }
  // …
}

これはdrupal 7で動作しますか?
Lucifer

問題はDrupal 6です。あなたは少しのDrupal 7用のコードに変更する必要があります
kiamlaluno

drupal 7での方法を指示できますか
Lucifer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.