Drupal 7 开发内部培训资料, 分头诗人

AJAX在select的使用如何激活AJAX?

赞成!
0
否决!

node.tpl.php


	   $form['colors'] = array(
            '#type' => 'select',
            '#options' =>array('red','blue','black','white'),
            '#submit' => array('options_color'),
            '#ajax' => array(
                    'event'=>'change',
                    'callback' =>'options_color',
                    'wrapper' => 'myDiv',
            ));
       echo drupal_render($form);

 

模块上:

function options_color($pid)
{
	if ($type == 'ajax') {
	$output = t("This is some content delivered via AJAX");
	$commands = array();
	// See ajax_example_advanced.inc for more details on the available commands
	// and how to use them.
	//$commands[] = ajax_command_append('#myDiv', $output);
	$commands[] = ajax_command_replace('#myDiv', $output);
	$commands[] = ajax_command_replace('#myDiv2', '第二个');
	$page = array('#type' => 'ajax', '#commands' => $commands);
	ajax_deliver($page);
  }
  else {
	$output = t("This is some content delivered via a page load.");
	return $output;
  }
}

 

但下拉框选择的时候没有反应,摸索了2天不知道怎么整,大侠们能否指点一下?

3 个回答

赞成!
0
否决!

我小白,不过我貌似知道这个问题。ajax_deliver接受的参数是$page_callback_result,页面回调函数的结果。而默认的ajax的 回调函数是ajax_process_form,ajax提交的默认路径是system/ajax对应的页面回调函数就是这个ajax_process_form。ajax_process_form调用了ajax_pre_render_element里边预设了很多jquery ajax要用到的参数(就是你要用到的这部分form表单的ajax相关的settings),ajax_deliver返回的虽然是打包一起的json格式的commands数组,但是只有自己写的commands命令恐怕不够哦,还得经过这个页面回调函数给提供必要的参数。楼主的$page只是个包含自己commands的数组,不是回调函数的结果。我想应该不用自己指定

 $page = array('#type' => 'ajax', '#commands' => $commands);
ajax_deliver($page);

jquery ajax我也在看,主要是drupal安装目录下的 /misc目录下的.ajax.js和jquery.form.js用到这些参数,当然还有jquery.js。

我不大明白的是ajax.js 有个settings.ajax在ajax_pre_render_element里边并没有查到,这个settings.ajax里边包含了触发ajax的jquery选择器

Drupal.behaviors.AJAX = {
  attach: function (context, settings) {
    // Load all Ajax behaviors specified in the settings.
    for (var base in settings.ajax) {
      if (!$('#' + base + '.ajax-processed').length) {
        var element_settings = settings.ajax[base];

        if (typeof element_settings.selector == 'undefined') {
          element_settings.selector = '#' + base;
        }
        $(element_settings.selector).each(function () {
          element_settings.element = this;
          Drupal.ajax[base] = new Drupal.ajax(base, this, element_settings);
        });

        $('#' + base).addClass('ajax-processed');
      }
    }

for (var base in settings.ajax) {

$('#' + base + '.ajax-processed')

......

}

我不明白绑定了ajax的form部件是怎么设定成settins.ajax里边的选择器的。当然这部分我也还没有彻底看完jquery.js相关部分也好几千行...

请大侠们指导斧正^_^

赞成!
0
否决!

哦,我的意思,楼主的ajax callback 是'callback' =>'options_color',在callback这里边加入的commands应该会随后在ajax_render中被和$page_callback_result中被返回的默认settings值合并成最终的 commands数组,然后被转换为json给js文件用

赞成!
0
否决!
$scripts = drupal_add_js();
  if (!empty($scripts['settings'])) {
    $settings = $scripts['settings'];
    array_unshift($commands, ajax_command_settings(drupal_array_merge_deep_array($settings['data']), TRUE));
  }

  // Allow modules to alter any Ajax response.
  drupal_alter('ajax_render', $commands);

  return drupal_json_encode($commands);

部分ajax_render函数代码