同様の質問:
フィールドウィジェットフォームでの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(機能していません!)
私はこれを次のように機能させるための回避策を見つけることができました:
location-div-myfield-0
(これは、同じフィールドの複数のインスタンスが同じページにある場合に必要です)myfield
)とデルタ(ここでは0
)を$field_state
(hook_field_widget_form
内)に保存します$field_state
から読み取り(ここではsome_ajax_callback
)、目的のフォーム要素を返します。ただし、フォームにフィールドのインスタンスが1つしかない場合、これは機能します。それ以外の場合、$form_state
の値は常に最後のインスタンスの値になります。
可能な解決策
triggering_element
の$form_state
のsome_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];
...
}
私は一般的に次のようなことをします:
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']から値を取得することもできます。
同じ問題がありました。私はこれを使うだけで解決できます
これは複数値フィールドで機能します。
ビルドされたときのデルタを含む別のプロパティをフォーム要素に追加します。 AJAXコールバックでは、トリガー要素の値を介してこのデルタを取得できます。
$element[$delta]['value']['#element_index'] = $delta;
$element[$delta]['value']['#ajax'] ...;
そして、あなたのAJAXコールバックで
$delta = $form_state['triggering_element']['#element_index'];
これにより、他のデータからのプルに依存することなく、デルタを明示的に設定および取得できます。
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
_を使用し、正規表現または何かを使用して両方を抽出します)。これにより、フィールド名とデルタが送信ボタンに直接リンクされます。そのため、複数のフィールドとデルタがある場合でも、特定の送信ボタンがどれに適用されるかを簡単に判別できます。