web-dev-qa-db-ja.com

AJAXを既存のノードフォームに追加する

D7コアによる新しいコンテンツタイプの作成は、直感的で高速で見栄えが良いです。 dbテーブルと単純な検証について心配する必要はありません。ウィジェットやディスプレイなどがあります。実際にフォーム(company_node_form)を作成しています。

例:

カスタムコンテンツタイプ:会社

フィールドグループ:会社の住所(垂直タブ)

  • フィールド(簡単なテキスト):通り
  • フィールド(簡単なテキスト):いいえ。
  • フィールド(単純なテキスト):郵便番号
  • フィールド(簡単なテキスト):国

フィールドグループ:会社の連絡先(垂直タブ)

  • フィールド(チェックボックス):電話あり
  • フィールド(単純なテキスト):電話
  • フィールド(チェックボックス):ファックスあり
  • フィールド(簡単なテキスト):ファックス

フィールドグループ:プライバシー(垂直タブ)

  • フィールド(チェックボックス):住所を表示
  • フィールド(チェックボックス):電話を表示

質問

カスタムモジュール「my_module」を使用して代替を追加してAJAX動作追加または編集中コンテンツタイプを提供する方法、つまり「電話がある」場合にのみ「電話」フィールドを表示する方法チェックされているか、テキストが表示されます "申し訳ありませんが、選択した国の企業を追加する権限がありません。

感嘆符

上記のフォームはmy_module内でコーディングするのが非常に簡単であることを知っていますが、コーディングの代わりにコアノードコンストラクターを使用してそのフォームを構築したいと考えています。

4
Gregory Zbinsky

この機能をノードフォームに追加するには、条件付きフィールドモジュール- http://drupal.org/project/conditional_fields を使用します。前のフィールドの入力がいくつかの基準を満たす場合にのみ特定のフィールドが表示されるようにするには、フィールドの依存関係を作成する必要があります。

1
designplusdev

フォームの変更をトリガーする要素に '#ajax'配列を追加するには、モジュールに hook_form_alter() を実装する必要があります。 #ajax要素には、置換するフォームの部分のHTML IDを指定する「wrapper」および「callback」要素と、置換されるフォームの部分を返すモジュール内の関数が含まれます。

たとえば、要素「my-element」を置き換える必要がある場合は、

'#prefix' => '<div id="my-element-id">', 
'#suffix' => '</div>' 

キー 'my-element'を持つフォーム配列に。置換をトリガーする要素は、

'#ajax' => array(
   'wrapper' => 'my-element-id',
   'callback' => 'my_callback',
   'method' => 'replace',
),

これがコールバック関数です:

function my_callback($form, &$form_state) {
    return $form['my-element'];
}

Hook_form_alter()は、要素を非表示/表示し、$ form_state(ajaxコールバックが発生したときに読み取る)に応じてカスタムメッセージングを生成します。

1
Joe Beuckman

@sel_spaceが言及したように、最初にフォームをビルドするときにhook_form_alterトリガーが1回。 #after_buildを使用して独自のコールバックを追加できると思います。

0
Vlad Moyseenko

単純なAjax機能については、 #states フォームAPI。

/**
 *  Implements hook_form_alter().
 */
function MYMODULE_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'MYNODETYPE_node_form') {
    $form['field_telephone_number']['#states'] = array(
      'visible' => array(
        ':input[name="field_has_phone"]' => array('checked' => TRUE),
      ),
    );
  }
}
0
leymannx