изменение формы drupal ajax

Я работаю над модулем drupal 7, где я хочу распечатать информацию на странице (узел MENU_LOCAL_TASK/%node/что-то) с фильтрами ajax. Я создал форму и добавил 2 флажка, 1 по умолчанию, другой нет. Я хочу показать пользователю информацию, в соответствии с которой установлен флажок. 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;
}

Прежде всего, это «хороший способ» сделать это, потому что я потерял уверенность :) Второй вопрос, как показать данные о загрузке страницы, прямо сейчас нужно изменить один флажок, чтобы увидеть некоторую информацию.

Спасибо и извините за краткое описание :)


person Prokop    schedule 21.02.2013    source источник


Ответы (1)


Вы не должны выполнять обработку в обратном вызове, это должно быть сделано в функции построения формы. Обратный вызов обычно возвращает только ту часть формы, которая изменилась. Кроме того, я не думаю, что в этом случае нет необходимости устанавливать команды [] , поскольку возвращаемая часть формы автоматически заменяет содержимое, установленное «оболочкой».

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.

person 2pha    schedule 23.02.2013