標準の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.15 Path_Access Content_Access 特定のページ(パス)をアクセス制限したい
サイトの環境設定 7.23 Pathauto 自動生成されるURLエイリアスがおかしい
テーマ 8.9.x patch パッチ 開発環境のファイル変更を本番環境にパッチでデプロイする方法(画像含まず)
ユーザ 7.44 Password Policy 無効なユーザーを整理したい
コンテンツの管理 7.15 Pagenation 一つの長いページをBookなどのように連続して読ませることはできますか?
コンテンツの作成 7.22 node Views ノードに付いたコメントに関する情報を得る
コンテンツの作成 7.38 node form ノード編集フォームをテーブル表示形式にしたい
コンテンツの作成 8.4x node 新規ノードを作成する
コンテンツの作成 8.9.x node ノード保存時の前回値の参照方法
コンテンツの作成 7.38 node 代理投稿を可能にしたい
コンテンツの作成 8.4x node node保存前に色々やる方法
リバースプロキシ 8.9.x mod_proxy mod_proxy_http mod_ssl Apache2.4 から httpsサーバーへリバースプロキシする方法
サイトの構築 7.50 Module Missing Message Fixer モジュールをアンインストールしたらエラーがでるようになった
アップデート 8.7.2 menu drupal-core 8.7.2にupdateしたところ
コンテンツの作成 7.23 maxlength テキストフィールドの最大長のチェック&カウントダウン
コンテンツの作成 7.15 Mailhandler メールを通じてnodeの投稿をするには
開発 mail 7.50 Mail Safety 開発/テスト用サイトのメール
mac linux ファイル名 文字化け 8.7.x mac linux ファイル名 文字化け Macからlinuxにrsyncするとファイル名(濁点)が文字化けする場合の対応方法
排他 7.26 lock Viewsモジュールの設定ページのような排他機能
PhpStorm 7.50 LocalForward PhpStormから踏み台を使う

ページ