標準の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. 関連モジュール タイトル降順で並び替える
コンテンツの作成 8.4x json jQueryにjsonで渡す方法
mac linux ファイル名 文字化け 8.7.x mac linux ファイル名 文字化け Macからlinuxにrsyncするとファイル名(濁点)が文字化けする場合の対応方法
フォーム 7.15 system mail()での送信が失敗する
言語 7.15 Entity Translation nodeのEntity Translation
コンテンツの作成 8.4x node node保存前に色々やる方法
アップデート 7.28 Views Pagerが表示されなくなった
アップデート 8.9.x composer patch patch を composer に 組み込む方法
サイトの構築 7.41 Rules Paygent モジュールについて
PHP-FPM 8.9.x PHP PHP-FPM 環境で .htaccess に php_value を 書いてもダメ
PhpStorm 7.50 LocalForward PhpStormから踏み台を使う
JavaScript 7.34 PHP PHPからJavaScriptに変数値を渡したい
サイトの構築 7.19 Plesk Pleskでdrupal7(プライベートファイルシステム)を使う場合の注意点
PCRE 7.50 preg_match()がおかしい
サイトの環境設定 7.15 Secure Pages Secure Pagesが急に機能しなくなった
SFTP 8.4x SFTP RSA SFTP(RSA)でファイル転送(送信)する方法
ニュースレター 7.34 Simple news Simplenewsで追加顧客(リスト)だけにニュースレターを配信する方法
メール 7.50 Smtp smtpでGmailアカウントを使いたい
SSH 7.50 ProxyCommand SSH IP制限を1コマンドで通過する
タクソノミー 7.15 Entity_Trarnslation Taxonomy TaxonomyのEntity Translation
コンテンツの作成 7.50 Expanding Textareas Textareaフォームの行サイズを自動調整するモジュール

ページ