Как я могу загрузить форму Drupal через ajax в диалоге jQuery? - PullRequest
0 голосов
/ 14 декабря 2011

У меня есть модуль, в котором я строю форму. Я могу нажать форму через пункт меню, который также был создан в этом модуле. Когда я пытаюсь загрузить форму через ajax, я получаю всю страницу (верхний колонтитул, форму и нижний колонтитул), а не только форму. Вот пункт меню:

$items['sendmessage'] = array(
   'title' => 'Send Message',
   'description' => 'Send a message',
   'page callback' => 'drupal_get_form',
   'page arguments' => array('rmessages_message_form', 1),
   'access callback' => TRUE,
   'type' => MENU_NORMAL_ITEM,
);

Вот код JavaScript:

$('.send_message').click(function(){
   $('.send-message-dialog').dialog('open');
      $('.send-message-dialog .dialog-content').load('/sendmessage/7');
   }
);

Если я загружаю URL через браузер, загружается форма. Есть ли способ заставить drupal просто визуализировать форму и вернуть HTML, а не пытаться загрузить всю страницу.


Кажется, это работает ... надо запомнить функцию drupal_render;)

$items['sendmessage'] = array(
   'page callback' => 'rmessage_send_message_form',
   'page arguments' => array('rmessages_message_form', 1),
   'access callback' => TRUE
);

Использование drupal_build_form для получения массива элементов, который визуализируется drupal_render ()

function rmessage_send_message_form($form_id, $nid) {
   $form_state = array();
   echo drupal_render(drupal_build_form('rmessages_message_form', $form_state, $nid));
}

1 Ответ

4 голосов
/ 15 декабря 2011

Я думаю, что лучший способ сделать это - сделать вашу форму доступной с обычного URL (для тех, у кого нет JavaScript) и , доступных для AJAX. Вы можете сделать это так:

function rmessage_menu() {
  $items['sendmessage/%node'] = array( // Using the '%node' load argument ensures that the nid attempting to be accessed belongs to an existing node.
    'title' => 'Send Message',
    'description' => 'Send a message',
    'page callback' => 'rmessages_message_form',
    'page arguments' => array(1),
    'access callback' => TRUE
  );

  return $items;
}

function rmessages_message_form($node) {
  $form = drupal_get_form('rmessage_send_message_form', $node->nid);

  // Just print the form directly if this is an AJAX request
  if (isset($_GET['ajax'])) {
    echo render($form);

    // Halt page processing
    drupal_exit();
  }

  // Otherwise return the form as normal
  return $form;
}

Тогда в вашем JS вам просто нужно добавить строку запроса:

$('.send_message').click(function(){
   $('.send-message-dialog').dialog('open');
      $('.send-message-dialog .dialog-content').load('/sendmessage/7?ajax');
   }
);

Надеюсь, что поможет

...