標準の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. 関連モジュール降順で並び替える タイトル
コンテンツの作成 7.38 node form ノード編集フォームをテーブル表示形式にしたい
コンテンツの作成 7.22 node Views ノードに付いたコメントに関する情報を得る
コンテンツの管理 7.15 Pagenation 一つの長いページをBookなどのように連続して読ませることはできますか?
ユーザ 7.44 Password Policy 無効なユーザーを整理したい
テーマ 8.9.x patch パッチ 開発環境のファイル変更を本番環境にパッチでデプロイする方法(画像含まず)
サイトの環境設定 7.23 Pathauto 自動生成されるURLエイリアスがおかしい
権限 7.15 Path_Access Content_Access 特定のページ(パス)をアクセス制限したい
ユーザの管理 7.50 Paypal continued billing drupal7のPaypal継続課金モジュールについて
コンテンツの作成 7.26 PHP ノード内の一部(フィールド)を変更する
ユーザ 7.23 PHP user_load_multiple()の復帰値
コンテンツの管理 7.16 PHP 好きなところにノードを埋め込みたい
PHP-FPM 8.9.x PHP PHP-FPM 環境で .htaccess に php_value を 書いてもダメ
ユーザの管理 7.27 PHP 新規ユーザーの追加ができない
PHP 8.9.x PHP YamlをPHP配列にする方法
JavaScript 7.34 PHP PHPからJavaScriptに変数値を渡したい
チューニング 7.26 PHP DrupalはNginxで動く?
アップデート 8.9.x PHP CentosでPHPのバージョンアップ(例:5.3->5.6)を行う方法
JavaScript 8.5.x PHP Commerce決済モジュール設定をJavaScriptにデータに渡す方法
PHP 7.22 PHP ノードに付いたコメントを好きな場所に表示する
Database 7.34 PHP データベースクエリ(SELECT)時のSQL関数

ページ