標準のajaxフォーム(複数値:値の数=無制限)の制御l方法

カテゴリ コンテンツの作成 コアバージョン 7.34 関連モジュール ajax

標準のajaxフォーム、コンテンツ設定にて「値の数=無制限」にしているフィールドを、設定値の増減に応じて(状況に応じて)変更するような制御はどうしたらよいですか?

コメント

ユーザー actbrain の写真

複数値フィールド(値の数=無制限)は、入力フォームの増減がajaxで制御されます。
そのため、フォームロード時のみのhookでは制御しきれません。

例として、下記フィールドを想定して説明します。

・フィールドタイプ=ターム参照。
・ウィジェット=選択リスト。
・選択済みの項目を[別のアイテムを追加]ボタンクリック時に追加される新フォームで選択させたくない。

以下のような措置を行います。

1.hook_form_alter()に下記コードを挿入

if ($form_id == '{field machine name}_node_form') {
 // Treatment of when the form load.
 foreach ($form[{field machine name}]['und'] as $delta => &$el) {
  if (is_numeric($delta)) {
   if (!empty($el['und']['#default_value'][0])) {
    // Eliminate non-selected choices.
    _{your module name}_field_option_compress($el['und']['#options'], $el['und']['#default_value'][0]);
   }
  }
 }
 // Setting callback.
 $form[{field machine name}]['und']['add_more']['#ajax']['callback'] = '{your module name}_field_add_more_js';
}

2.{your module}に下記コードを挿入

function {your module name}_field_add_more_js(&$form, $form_state) {
 $element = field_add_more_js($form, $form_state); // Call standard ajax callback.
 // Collect already selected item value.
 $selected = array();
 foreach ($element as $delta => &$el) {
  if (is_numeric($delta)) {
   if (!empty($el['und']['#default_value'][0])) {
    $selected[] = $el['und']['#default_value'][0];
    // Eliminate non-selected choices.
    _{your module name}_field_option_compress($el['und']['#options'], $el['und']['#default_value'][0]);
   }
  }
  // Eliminate selected choices.
  foreach ($selected as $i) {
   unset($element[$element['#max_delta']]['und']['#options'][$i]);
  }
 }
 return $element;
}

// Eliminate non-selected choices.
function _{your module name}_field_option_compress(&$el, $aleady) {
 foreach ($el as $i => $option) {
  if ($i != $aleady) {
   unset($el[$i]);
  }
 }
}

まず、1.により、最初のフォームロード時の制御と、コールバックの設定を行います。
1.の仕掛けにより、フォーム入力中、[別のアイテムを追加]ボタンをクリックするたびに、2.が呼ばれます。
2.では、既存のフォームの選択肢と、新規フォームの選択肢両方に措置を行います。

ページ

OTHER FAQ

Drupal開発・運用の疑問/質問の答えはここに

無料ユーザー登録すると質問できます。

カテゴリ降順で並び替える Core Ver. 関連モジュール タイトル
video 8.4x video map 動画上にクリッカブルマップを作成する方法
Views 8.4x hook_views_query_alter 現在のViewsクエリを保存・再現する方法
Views 8.4x hook_views_query_alter Viewsクエリの条件式にサブクエリを追加する方法
Views 8.4x hook_views_query_alter Viewsクエリに多くの条件を追加する方法
Views Exposed Filter 8.4x hook_views_pre_view Views Exposed Formの複数単語入力(textfield)をフォーム上だけ複数行入力(textarea)にする方法
Viewsプログラミング 8.4x Views drupal8におけるViewsプログラミング
Viewsプログラミング 8.6.x Views Drupal8 Viewsの動的キャッシュをクリアする方法
アップデート 8.9.x Composer update composer update するときに パッチが必要なモジュールが更新されパッチが消えてしまうことへ対応する方法
アップデート 7.28 Views Pagerが表示されなくなった
アップデート 8.8.x Composer composer updateが異常終了する
アップデート 7.16 Core 7.15→7.16アップデート
アップデート 7.34 Distribution(Commerce Kickstart) drushでcommerce_kickstartのアップデートに失敗する
アップデート 7.15 Webform Backup_and_Migrate drupal7.12 -> drupal7.14アップデートメモ
アップデート 7.50 Download count DOWNLOAD MODULEページでダウンロードが失敗することがある
アップデート 8.9.x composer patch patch を composer に 組み込む方法
アップデート 8.9.x Composer update Composer で drupal/core-8.9.7 に更新できなくなった場合の処置
アップデート 8.9.x PHP CentosでPHPのバージョンアップ(例:5.3->5.6)を行う方法
アップデート 7.28 DisableMessages モジュールのアップデートガイダンスを非表示にしたい
アップデート 7.34 Core 簡単にCoreのセキュリティアップデートがしたい
アップデート 8.7.2 menu drupal-core 8.7.2にupdateしたところ

ページ