获取发出$ .post请求的页面的节点ID

时间:2010-12-10 06:06:32

标签: jquery ajax drupal

所以在我的模块中,我正在为一个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");

2 个答案:

答案 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容器中的节点。因此,如果没有其他服务器端代码,您还可以使用

在JavaScript中检索当前页面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');
  }
}