题
我新的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
我需要显示在同一页的结果。应如何修改寻呼机呼叫做到这一点?
解决方案
您应该让您的生活做AJAX请求时使用jQuery的实用功能,而不是做他们“自己”更容易。 jQuery库包含在Drupal核心(至少为Drupal 6)。至于文件,你可以用这个职位上的Ajax在Drupal使用jQuery 启动。
其他提示
我做了对这一主题的博客 JS使用AJAX和PHP 和已粘贴下面它。
JS的AJAX和PHP
Drupal有作为它的标准形式一部分JS和AJAX的广泛支持,并有解释它是如何工作的教程。但是,我无法找到一个很好的教程来解释的Javascript如何可以在特设的方式一个Drupal模块进行通信。举例来说,我希望能够基于PHP可用的状态信息来修改任意的HTML标记。这种技术介绍如下。
您在本页面顶部看到的标签,默认情况下在这个主题是较为平淡。我想修改它们使得当前选中的选项卡将更加突出。当然,这可能只用CSS来实现,但我想开发这种技术的情况下,单独CSS是不够的。
下面是可以直接加入到先前描述的JS文件的JS。存在与ID每个页面已经被加载,并准备时间“主菜单中的链接”在元件上操作的jQuery函数。我得到的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,
);
回调函数然后如下所示。它首先拉出块参数并将其装入,以便它可以被解析为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));
}
}
最后,它循环通过利项添加,取决于标签是否是活动的或不改变的内联的CSS样式。然后,它只是创建一个从DOM对象的字符串,并通过drupal_json_output,将其转换成JSON格式返回。这当然被接纳在JS回调函数。