所以在我的模块中,我正在为一个drupal菜单回调制作$ .post。有没有办法找出用户在服务器端执行$ .post的节点?感谢。
不起作用的示例代码:
function module_menu() {
$items = array();
$items['checkNID'] = array(
'title' => 'Check Users',
'page callback' => 'NIDCheck',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK
);
return $items;
}
function NIDCheck (){
$result = array();
$result['nid'] = arg(1);
return drupal_json($result);
}
$.post('/checkNID/', function(data) {
console.log(data);
// this should return the nid
}, "json");
答案 0 :(得分:0)
如果您正在从节点页面本身执行帖子,则可以使用
$nid = arg(1);
arg()将检索传入的drupal路径的值.IE:
http://example.com/hi/mark/it/is/erik
arg(0) = hi
arg(1) = mark
arg(2) = it
...
因为每个节点页面的url都是http://example.com/node/ $ nid,所以arg(1)将始终返回正确的nid,即使该节点有别名。
修改强>:
使用preprocess_node()并添加对drupal_add_js()的调用:
drupal_add_js(array('my_module' => array('nid' => arg(1)), 'setting');
然后在你的JS中,你可以这样访问这个值:
Drupal.settings.my_module.nid
埃里克
答案 1 :(得分:0)
您无法获取用户在回调中执行$ .post的节点的nid,而不会在后台POST请求中传递它。当您处于回调中时,arg()使用的请求路径是'checkNID'。你不能从那里提取nid。
您可以使用
$.post('/checkNID/', {nid: a_var_containing_the_current_page_nid}, function(data) {
console.log(data);
}, "json");
或者,如果您确实需要检索nid的节点,可以使用Drupal的wilcard loader argument:
function module_menu() {
$items = array();
$items['checkNID/%node'] = array(
'title' => 'Check Users',
'page callback' => 'NIDCheck',
'access arguments' => array('access content'),
'type' => MENU_CALLBACK
);
return $items;
}
function NIDCheck ($node){
$result = array();
$result['nid'] = $node->nid;
return drupal_json($result);
}
在JS中
$.post('/checkNID/'+ a_var_containing_the_current_page_nid, function(data) {
console.log(data);
}, "json");
大多数主题使用div
作为其id输出node-$nid
容器中的节点。因此,如果没有其他服务器端代码,您还可以使用
var current_nid = $('div[id^=node-]').attr('id').split('-')[1];
您还可以使用drupal_add_js
将当前页面nid存储在PHP代码的JavaScript变量中。您需要在节点视图(即包含页面)上进行此操作,而不是在NIDCheck()
中。像
function module_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
if($op === 'view') {
drupal_add_js(array('module' => array('nid' => $node->nid), 'setting');
}
}