プログラムで多くのノードを作成しています。明らかにそれらを保存する前に有効でなければなりません。そのような_$node
_オブジェクトには、CCKフィールドとカスタムフィールドが混在しています。
バリデーターは form_set_error()
のみを設定し、検証結果を返すことはほとんどないため、ノードが有効かどうかを知るためにform-apiを経由する必要があります。そうみたいです。
私は node_validate()
を呼び出し、次に form_get_errors()
(これはform_set_error()
を呼び出します)。
このアプローチにはいくつかの問題があるようです:
form_set_error()
は drupal_set_message()
;でメッセージを設定します。 cron(セッションレスユーザー)などの場合、これは孤立した永続的なエラーメッセージをデータベースに追加します(これらは表示されないため、削除されません)。よりシンプルでエレガントな方法はありますか?
ノードを検証するためにモジュールが実装する必要があるフックは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();
}
// …
}
// …
}