web-dev-qa-db-ja.com

フィールドウィジェットフォームでAJAXを使用して値を更新します

同様の質問:

フィールドウィジェットフォームでのAjaxラッパーの置き換え

AJAXフィールドウィジェットの作成方法

問題:

AJAXコールバック関数?(下記参照)でFIELD_NAMEおよびDELTAを取得します)

何が行われるか:

textfield の値をウィジェットフォームで変更します( こちら を参照)値の変更(jQueryイベント .change() )ウィジェット形式の別のtextfieldの。

コードサンプル:

hook_widget_form

// Changes of this field fire the AJAX event
$element['value'] = ...
$element['value']['#ajax'] = array(
                    'callback' => 'some_ajax_callback',
                    'wrapper' => 'location-div',
                    'method' => 'replace',
                    'effect' => 'fade'
            );
// This field is updated upon AJAX call
$element['location'] = ...
// Here is where the actual change occurs
if(!empty($form_state['values'][$field['field_name']]['und'][$delta]['value'])) {
            $element['location']['#value'] = ...;
        }

some_ajax_callback

function some_ajax_callback ($form, $form_state) {
  // Where do I get FIELD_NAME, and DELTA?
  return $field[FIELD_NAME]['und'][DELTA]['location'];
}

どうなりますか?

それが言及されているように ここに#default_valueはAJAXを使用して入力されないため、 this 代わりに#valueを使用してください。

問題は、どのようにFIELD_NAMEおよびDELTAをAJAXコールバック関数?)で取得するかです(上記を参照)。

UPDATE(機能していません!)

私はこれを次のように機能させるための回避策を見つけることができました:

  • 更新するアイテムは、field_nameとdeltaで構成されるIDを受け取ります(例:location-div-myfield-0(これは、同じフィールドの複数のインスタンスが同じページにある場合に必要です)
  • フィールド名(ここではmyfield)とデルタ(ここでは0)を$field_statehook_field_widget_form内)に保存します
  • 保存された値をajaxコールバックの$field_stateから読み取り(ここではsome_ajax_callback)、目的のフォーム要素を返します。

ただし、フォームにフィールドのインスタンスが1つしかない場合、これは機能します。それ以外の場合、$form_stateの値は常に最後のインスタンスの値になります。

可能な解決策

triggering_element$form_statesome_ajax_callbackを使用すると、必要なすべての情報を取得できます。

function some_ajax_callback ($form, $form_state)
{
    // This contains info about triggering element
    // Index 0 = field name, 1 = language, 2 = delta, 3 = element name
    $element = $form_state['triggering_element']['#parents'];
    $delta = $element[2];
    $field_name = $element[0];
    ...
}
3
user19626

私は一般的に次のようなことをします:

function gft_enable_display_callback($form, $form_state) {
  // Get the array parents of the triggering element
  $parents = $form_state['triggering_element']['#array_parents']; 
  // Pop off the triggering element as we usualy want the one above it
  array_pop($parents);
  // Get the element from the nested array
  $element = drupal_array_get_nested_value($form, $parents);

  return $element; // or we can return $element['someotherfield']
}

Drupal_array_get_nested_valueを使用して、必要に応じてform_state ['values']から値を取得することもできます。

1
Gavin Mcdonough

同じ問題がありました。私はこれを使うだけで解決できます

  • $ element ['#parents'] [0](フィールド名)
  • デルタの$ element ['#delta']

これは複数値フィールドで機能します。

0
Frank

ビルドされたときのデルタを含む別のプロパティをフォーム要素に追加します。 AJAXコールバックでは、トリガー要素の値を介してこのデルタを取得できます。

$element[$delta]['value']['#element_index'] = $delta;
$element[$delta]['value']['#ajax'] ...;

そして、あなたのAJAXコールバックで

$delta = $form_state['triggering_element']['#element_index'];

これにより、他のデータからのプルに依存することなく、デルタを明示的に設定および取得できます。

0
Steven W

AJAXコールバックで_$form_state['triggering_element']_を使用して送信ボタンフォーム要素にアクセスできるため、送信ボタンに識別子を追加できます。たとえば、hook_widget_form()

_$element['value']['#ajax'] = array(
  'callback' => 'some_ajax_callback',
  'wrapper' => 'location-div',
  'method' => 'replace',
  'effect' => 'fade'
);
$element['value']['#name'] = 'submit_field_name_FIELD_NAME';
_

そしてあなたのAJAXコールバックで:

_$submit_name = $form_state['triggering_element']['#name'];
$field_name = str_replace('submit_field_name_', '', $submit_name);
_

同様のことを行って、フィールドデルタを取得することができます(つまり、_submit_field_name_FIELD_NAME_delta_DELTA_を使用し、正規表現または何かを使用して両方を抽出します)。これにより、フィールド名とデルタが送信ボタンに直接リンクされます。そのため、複数のフィールドとデルタがある場合でも、特定の送信ボタンがどれに適用されるかを簡単に判別できます。

0
nerdlinger