Изменение формы Drupal AJAX
Я работаю над модулем drupal 7, где хочу распечатать информацию на странице (узел MENU_LOCAL_TASK /% узел / что-то) с фильтрами ajax. Я создал форму и добавил 2 флажка, один по умолчанию, другой нет. Я хочу показать пользователю информацию, в соответствии с которой установлен флажок. 1 в таблице отображается строка 1, 2 в строке 2 отображается таблица. Если некоторые из них отключены, то строка таблицы отключена. Я упоминал, что я хочу решить это без отправки и перезагрузки, только ajax. Я добавил к двум 'флажкам' следующее 'ajax' => array('callback' => 'my_module_callback')
, Вот остаток кода, простой.
function my_module_callback($form, $form_state) {
$data = array();
$nid = 1;
if ($form_state['values']['checkbox1']) {
$data += load_data($nid, "checkbox1");
}
if ($form_state['values']['checkbox1']) {
$data += load_data($nid, "checkbox2");
}
$commands[] = ajax_command_html("#here", my_module_table($data));
return array('#type' => 'ajax', '#commands' => $commands);
}
function my_module_table($data){
//do some stuff with the data in a foreach
return theme("my_module_fancy_table",array("data" => $data));
}
function theme_my_module_fancy_table($data){ //registered with my_module_theme()
// putting html into $output in a foreach
return $output;
}
function my_module_page_callback_from_menu_function($nid){
$output = drupal_render(drupal_get_form('my_module_custom_ajax_form'));
$output .= "adding other stuffs including div#here";
return $output;
}
Во-первых, это "хороший способ" сделать это, потому что я вроде как потерял уверенность:) Второй вопрос, как показать данные о загрузке страницы, теперь нужно поменять один флажок, чтобы увидеть какую-то информацию.
Спасибо и извините за краткое описание:)
1 ответ
Вы не должны действительно выполнять обработку в обратном вызове, это должно быть сделано в функции построения формы. Обратный вызов обычно возвращает только часть формы, которая изменилась. Кроме того, я не думаю, что в этом случае нет необходимости устанавливать команды [], так как возвращающаяся часть формы автоматически заменит набор содержимого, заданный 'wrapper'.
function my_module_form($form, $form_state){
$data = array();
$nid = 1;
if ($form_state['values']['checkbox1']) {
$data += load_data($nid, "checkbox1");
}
if ($form_state['values']['checkbox2']) {
$data += load_data($nid, "checkbox2");
}
$form = array();
$form['checkbox1'] = array(
'#type' => 'checkbox',
'#ajax' => array(
'callback' => 'my_module_callback'
'wrapper' => 'mydata',
'event' => 'change',
),
);
$form['checkbox2'] = array(
'#type' => 'checkbox',
'#ajax' => array(
'callback' => 'my_module_callback'
'wrapper' => 'mydata',
'event' => 'change',
),
);
$form['mydata'] = array(
'#prefix' => '<div id="mydata">',
'#suffix' => '</div>',
'#markup' => my_module_table($data),
);
return $form;
}
function my_module_callback($form, $form_state){
// $form_state['rebuild'] = true; may have to be set because the form has not been submitted and wont be rebuilt...I think, I cant remember for sure.
return $form['mydata'];
}
Чтобы показать данные при загрузке страницы, вам просто нужно изменить логику установки данных в функции построения формы. Кроме того, к вашему сведению, есть стековый сайт специально для drupal по адресу: http://drupal.stackexchange.com/