0

フィールドのフォーム入力を検証する PHP コードを作成しようとしています。フィールドにすでに値がある場合、システムはエラー メッセージを送信する必要があります。値がない場合、または値が入力と同じ場合は、フォームを送信できます。編集されたコードは次のとおりです。

/**
* Implement a function to get the ID and the title of the referenced node
* of type Reservation
* by the nodereference field called Period
* in the currently edited node from type Board
* Try to do this by the node_load() instead of the database query
* Is it the correct method to get the edited node's ID?
**/
function period_get_value() {
$thisnodeboard = $node->field_period_1[$node->language][0]['nid'];
$reservationrec = node_load(array('nid'=>$thisnodeboard));
return $reservationrec->title;
}
/**
* Implement the hook_form_FORM_ID_alter function to validate
* if the field Period has already value set
* and if there is such to check if it is the same as the input value
**/
function period_validate_form_slickgrid_editor_form_alter(&$form, $form_state){
/**
* The current value is the title of the referenced node
**/
$valcurr = period_get_value();
$valnew = $form_state['values']['field_period_1'];
if (isset($valcurr)&&($valcurr!=$valnew)){
    form_set_error('field_period_1', t('There is already value set for this field'));
  }
return $form;
}

しかし、それでも機能しません。メッセージを設定せず、field_period_1 の既存の値を変更できます。

4

1 に答える 1

0

まず、D7 で手動の SQL クエリを記述することは、絶対的な最後の手段です。

わかりましたので、実際には、ノードが作成された後にユーザーがフィールドを更新するのを防ぎたいだけです。

できることは 2 つのうちの 1 つです。ノード/編集フォームからの編集のみを防止したい場合は、hook_form_FORM_ID_alter() を実装してから、独自の検証または送信ハンドラーを追加できます。次に、フィールドが変更されていないことを検証し、それに応じて行動します。

たとえば、プログラムでどこからでも発生するのを防ぎたい場合。hook_node_update() を実装し、$node->is_new と $node->type をチェックして、新しくないノードへの変更を防ぐことができます。

于 2013-01-31T12:29:19.317 に答える