function ajax_example_simplest($form, &$form_state) {
//This is my ajax trigger element
$form['element_trigger'] = array(
'#type' => 'select',
'#options' => array(
'one' => 'one',
'two' => 'two',
'three' => 'three',
),
'#ajax' => array(
'callback' => 'ajax_example_simplest_callback',
/** Q: Can I somehow declare more than one wrapper? **/
//Say for instance, something like:
'wrapper' => array('replace_div_1', 'replace_div_2'),
),
);
//replace_div_1
$form['element_to_be_replaced_1'] = array(
'#type' => 'textfield',
'#title' => t("My conditional field one"),
'#prefix' => '<div id="replace_div_1">',
'#suffix' => '</div>',
);
//... more form elements here
//replace_div_2
$form['element_to_be_replaced_2'] = array(
'#type' => 'textfield',
'#title' => t("My conditional field two"),
'#prefix' => '<div id="replace_div_2">',
'#suffix' => '</div>',
);
return $form;
}
function ajax_example_simplest_callback($form, $form_state) {
//... do my stuff here
//normally I would return only the form bit for replacing a single wrapper
//declared in the trigger element, like this:
return $form['element_to_be_replaced_blahblah'];
}
هل من الممكن إرجاع أكثر من بت واحد في دالة رد الاتصال لإخبار AJAX Framework الذي يجب أن يحل $form['element_to_be_replaced_1']
<div id="replace_div_1">
و $form['element_to_be_replaced_2']
يجب استبدال <div id="replace_div_2">
؟
بدلاً من إرجاع HTML الخاص بالعنصر المفرد للتحديث ، يمكن أن يرجع رد اتصال ajax صفيف من أوامر ajax . لذلك يمكن إرجاع اثنين ajax_command_replace لاستبدال كل عنصر.
function ajax_example_simplest_callback(&$form, $form_state) {
return array(
'#type' => 'ajax',
'#commands' => array(
ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1'])),
ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']))
)
);
}
دروبال 8 النحو البديل
use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\ReplaceCommand;
class name extends FormBase{
function ajax_example_simplest(array $form, FormStateInterface &$form_state) {
$response = new AjaxResponse();
$response->addCommand(new ReplaceCommand("#replace_div_1", ($form['element_to_be_replaced_1'])));
$response->addCommand(new ReplaceCommand("#replace_div_2", ($form['element_to_be_replaced_2'])));
return $response;
}
}
اختلاف واحد هو أنه تم إسقاط الأمر تقديم ، لأن AjaxResponse يطبق Drupal\Core \يجعل\ المرفقات Interface
يجعل(نموذج $ ['element_to_be_replaced_1'])
لا تزال إضافة التجسيد تعمل ، ولكني واجهت مشاكل عند تحديث TableSelect Table بهذه الطريقة.
إجابة بيير بييل لم تنجح معي. ومع ذلك ، عمل شيء مثل التالي.
function ajax_example_simplest_callback(&$form, $form_state) {
$commands = array();
$commands[] = ajax_command_replace("#replace_div_1", render($form['element_to_be_replaced_1']));
$commands[] = ajax_command_replace("#replace_div_2", render($form['element_to_be_replaced_2']));
$page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);
}
لاحظ استدعاء ajax_deliver () ، بدلاً من إرجاع صفيف أوامر AJAX.