Drupal 7 AJAX通过hook_menu调用

时间:2012-06-07 02:39:47

标签: php javascript drupal ubercart

所以,我试图让Ubercart Checkout页面上的新窗格在有人选择新的送货选项时更新。到目前为止,我可以在选择新的运输选项后每次刷新页面时都会出现这种情况。下一步是让它在VIA AJAX上运行。

我的问题是ajax命令没有从AJAX Callback中触发。 div没有更新。现在我只有一些简单的文字。稍后,我将添加我需要的实际表单信息,这将是另一个问题。但是,我甚至无法让这个测试用例起作用。

我正在为Drupal的Ubercart FedEx模块开发一项新功能。我一直在研究这个问题一段时间无济于事。我尝试了很多不同的东西,没有用。

非常明确......我知道ajax调用正在解雇。我甚至可以将成功附加到ajax $ .get调用并获取控制台输出并设置drupal变量。只有div替换代码不起作用。这个谜题的所有其他部分都有效。

我进入ajax调用并返回到javascript。我甚至可以在JS中的ajax调用上附加成功函数,并在成功时获得控制台输出。 javascript不是问题。

// Implements hook_menu()
function uc_fedex_menu() {
  $items = array();
  $items['uc_fedex_jquery_callback/%'] = array(
    'title' => 'My Custom Callback', 
    'description' => 'Listing of blogs.', 
    'page callback' => 'uc_fedex_calendar_jquery_callback', 
    'page arguments' => array(1),
    'access arguments' => array('access content'), 
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );
  return $items;
}

// AJAX callback: Updates calendar
// THIS IS WHERE THE ERROR IS... the variable is set
// But the div content is never replaced.
function uc_fedex_calendar_jquery_callback($argument) {
  variable_set('uc_fedex_shipment_type',$argument);
  $commands[] = ajax_command_replace('#fromdate', "works");
  return array('#type' => 'ajax', '#commands' => $commands);
}

// Actual UI of Calendar Pane
function uc_fedex_uc_checkout_pane_shipdate($op, $order, $form = NULL, &$form_state = NULL) {
    switch ($op) {
    case 'view':
      // Check for shipping quote option without altering Ubercart Core.
      // The $.get line makes the hook_menu call which in turn
      // makes the call back to the above function that has the issue
      drupal_add_js("
      jQuery(function ($) {
      $(document).ready(function() {
      last = 'o';
          setInterval(function() {
           $('#quote input:radio:checked').each(function() {
              if($(this).val() != last){
                last = $(this).val()
                $.get('https://www.fdanconia.com/uc_fedex_jquery_callback/'+ $(this).val());
              }
           });
          }, 500);
        });
      });", 'inline');

      $contents['calendar'] = array(
        '#type' => 'textfield',
        '#title' => t('Choose Your Estimated Arrival Date'),
        '#default_value' => date('m/j/Y',$response[1]),
        '#prefix' => '<div id="fromdate">',
        '#suffix' => '</div>',
      );
      return array('description' => $description, 'contents' => $contents);
    }
}

// Implements hook_uc_checkout_pane().
function uc_fedex_uc_checkout_pane() {
  $panes['calendar'] = array(
    'callback' => 'uc_fedex_uc_checkout_pane_shipdate',
    'title' => t('Shipping Calendar'),
    'desc' => t('A calendar to allow customers to choose shipping date.'),
    'process' => TRUE,
  );
  return $panes;
}

2 个答案:

答案 0 :(得分:0)

关于js的说明, jQuery(function same_func(){})相当于$(document).ready(function same_func(){})

所以外部jQuery()调用绑定一个函数来准备文档。该函数在文件就绪时触发,并将另一个函数绑定到已经触发的文档就绪。

在Drupal中,大多数时候变量$都是未附加的,所以你必须显式创建一个以jQuery形式传递给$的方法(函数)。

(function($){ 

$ available in here

})(jQuery);

Think of the the above as: 
(function)(variables) where the function takes a variable $ .. 

Or you can think of it like this:

function test ($) {
  $(jquery magic).etc()'
}
test(jQuery);

..除了函数测试,函数调用包含在“相同”行中。

检查firebug / console以查看是否正在调用$ .get。

另一个调试是在uc_fedex_calendar_jquery_callback()中使用php的error_log('message')并观察apache error.log。

答案 1 :(得分:0)

我最终在响应回调中添加了我需要的参数,然后在原始调用的AJAX响应中处理它们。我只是使用jQuery手动使用更新的变量数据来操作DOM。如果不改变Ubercart核心,我认为没有办法做到这一点,这是不可接受的。

如果有人想要我用来解决这个问题的代码,那就问问你接受。 (有点长,但如果有人想要,我会在这里发帖。)