我是drupal的新手并使用drupal6 ..我有一个模块,它根据输入字段从数据库中获取一组员工详细信息。提交按钮在 JavaScript函数 > emp.js 生成ajax调用的文件
xmlHttpReq.open('GET', "/empfinder.json&dept=" + dept + "&gender=" + gen+ "&age=" + age, true);
当我尝试使用寻呼机时,它会直接拨打以下电话并显示在新页面中。
http://156.23.12.14/empfinder.json?page=1&dept=ACC&gender=Male&age=34
我需要在同一页面显示结果。如何修改寻呼机呼叫才能这样做?
答案 0 :(得分:3)
您应该在执行AJAX请求时使用jquery实用程序函数,而不是“自己”执行它们,从而使您的生活更轻松。 jquery库包含在Drupal核心中(至少对于Drupal 6)。至于文档,您可以从this post on Ajax in Drupal using jQuery开始。
答案 1 :(得分:0)
我做了一个关于这个主题的博客JS with AJAX and PHP,并将其粘贴在下面。
使用AJAX和PHP的JS
作为标准表单的一部分,Drupal对JS和AJAX提供了广泛的支持,并且有一些教程可以解释这是如何工作的。但是,我找不到一个很好的教程来解释Javascript如何以特殊的方式与Drupal模块进行通信。例如,我希望能够根据PHP中可用的状态信息修改任意html。这种技术如下所示。
您将在此页面顶部看到默认情况下此主题中的标签非常简单。我想修改它们,以便当前选择的选项卡更突出。当然,这可以通过CSS完成,但我想在单独使用CSS的情况下开发这种技术。
以下是可以直接添加到前面描述的JS文件的JS。每次页面加载并准备就绪时,都会有一个jQuery函数对id为'main-menu-links'的元素进行操作。我得到innerHTML并使用encodeURIComponent将其转换为可以作为URL参数传递的安全字符串。我不得不这样做,因为其中一个选项卡引用了传递参数的URL。
var xmlhttp;
var childnodes;
// Send post to specified url
function loadXMLDoc(url,cfunc)
{
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=cfunc;
// alert("loadXMLDoc: " + url);
xmlhttp.open("POST",url,true);
xmlhttp.send();
}
// AJAX redirect to camr_custom/getvisits with callback function to replace the href
// with something to disable the link for nodes that have not been visited.
function getMenuTabs(str)
{
loadXMLDoc("?q=flashum_status/get_menu_tabs&block="+str,function()
{
// alert("getMenuTabs status: " + xmlhttp.status + " readyState: " + xmlhttp.readyState);
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
// alert("getMenuTabs: " + xmlhttp.responseText);
data= jQuery.parseJSON('['+xmlhttp.responseText+']')
$.each(data,function(){
// alert(this['block']);
document.getElementById("main-menu-links").innerHTML = this['block'];
});
}
});
}
// Locate book navigation block and send innerHTML to PHP module
$('#main-menu-links').ready(function() {
lis = document.getElementById("main-menu-links").innerHTML;
// alert("main-menu-links: " + lis);
// safe encode this block so that it can contain arbitrary urls in the href links
lis = encodeURIComponent(lis);
getMenuTabs(lis);
});
jQuery函数最终调用loadXMLDoc,这是AJAX帖子发生的地方,指定了Drupal模块中hook_menu捕获的URL。它还使用在cfunc参数中传递的回调函数。返回时,解析JSON响应以将其转换为HTML,并将其直接存储回原始的innerHTML。因此,无论PHP模块对HTML做了什么,都会替换原始HTML。
在PHP方面,首先是hook_menu的数组元素:
$items['flashum_status/get_menu_tabs'] = array(
'page callback' => 'get_menu_tabs',
'access arguments' => array('access flashum status'),
'type' => MENU_CALLBACK,
);
回调函数如下所示。它首先拉出block参数并将其加载到DOM对象中,以便可以对其进行解析。 simple_html_dom对象由simplehtmldom模块提供,您需要安装并启用它。不要忘记安装相关的库。这应该在/all/libraries/simplehtmldom/simple_html_dom.php中结束。
function get_menu_tabs() {
// drupal_set_message(t("get_menu_tabs: @code", array('@code' => print_r(null, TRUE))));
if (array_key_exists ('block', $_GET)) {
$block = $_GET['block'];
// drupal_set_message(t("get_menu_tabs block: @code", array('@code' => print_r($block, TRUE))));
// Create a DOM object.
$html_obj = new simple_html_dom();
// Load HTML from a string.
$html_obj->load($block);
// remove href for nodes not yet visited
$index = 0;
foreach ($html_obj->find('li') as $li ) {
$start = strpos($li->innertext, 'href');
$end = strpos($li->innertext, '>', $start);
$start_html = substr($li->innertext, 0, $end);
$end_html = substr($li->innertext, $end);
if (strpos($li->innertext, 'active')) {
$li->innertext = $start_html.' style="color:red;border: solid red;margin-left:5px;margin-right:5px;"'.$end_html;
// drupal_set_message(t("get_menu_tabs html_obj: @code", array('@code' => print_r($li->innertext, TRUE))));
}
else
$li->innertext = $start_html.' style="color:black;border: solid #777;"'.$end_html;
$index++;
}
$str = $html_obj->save();
// drupal_set_message(t("get_menu_tabs str: @code", array('@code' => print_r($str, TRUE))));
// Release resources to avoid memory leak in some versions.
$html_obj->clear();
unset($html_obj);
return drupal_json_output(array('block'=>$str));
}
}
最后,它循环遍历li项目,添加内联CSS样式,该样式根据选项卡是否处于活动状态而更改。然后它只是从DOM对象创建一个字符串,并通过drupal_json_output返回它,将其转换为JSON格式。这当然是在JS回调函数中收到的。