任何人都可以帮我定义一个没有hook_menu的URL并将其链接到drupal中的函数?

时间:2011-08-17 12:39:09

标签: json drupal

在drupal中我想定义一个没有hook_menu()的URL,这样我就可以将URL链接到一个将返回JSON的函数(我想从JavaScript代码中调用它)。

function(){
  $arr = array('a'=>'one', ..........);

  return json_encode($arr);
}

让我知道如何定义没有hook_menu()的网址,并将其链接到某个功能。

3 个答案:

答案 0 :(得分:2)

是,但没有

如果你绝对必须破解你的方式来调用特定的php文件。就像你实际上有/somepath/yourscript.php的文件一样,这可以从一般网络上调用。从那里开始,如果你想要Drupal命名空间中的任何内容,你必须自己引导Drupal,或者你必须为你想要调用它的每个文件使用requireinclude ... 但这是一个坏主意。

要引导Drupal你需要这样的东西:

include_once 'path.to.../includes/bootstrap.inc';
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);

在这一点上,无论你创造什么怪物,都欢迎你自己吹嘘自己。希望您已经注意到,通过引导Drupal,您可能无法通过在文件系统中放置一些流氓脚本来保存您想要的任何时间。

Drupal Way

相反,请使用Drupal为您提供的内容...... menu hook实现为MENU_CALLBACK。这将直接接收请求并将其发送到您的功能,如您所愿。在您的函数中,没有什么可以阻止您查看$_POST$_GET变量,但是您确实获得了一些Drupal糖,因为您的MENU_CALLBACK可以接受URL参数,检查其有效性并通过将它们放入您的函数中,以便您可以确保使用有效数据。

您只需要定义菜单挂钩和回调函数。要使用验证,您可以使用命名参数,例如%arg,而不是下面示例中的%。如果使用命名参数,那么您将创建一个名为arg_load($arg)的函数,该函数将确保您具有有效参数,然后返回要传递到callback_function的值。这是你的Drupal代码的样子:

function your_module_menu(){
    $items['js/calls/this/path/%'] = array(
      'title' => 'Some callback',
      'description' => 'Will call callback_function',
      'page callback' => 'callback_function',
      'page arguments' => array(4),
      'access arguments' => array('access content'),
      'type' => MENU_CALLBACK
   );

// moar code here!

return $items;
}

function callback_function($url_var){
  // drupal_json_output manages your content-type header
  // and the json_encode for you.
  drupal_json_output($url_var);
}

我认为Drupal方式比hacky one off文件方式要好得多,原因有几个。其一,如果你采用Drupal方式,开发人员将会理解你在做什么。二,您可以根据需要更改URL。

我选择独立文件的唯一原因是,该文件与Drupal AND 所需的任何内容无关,该操作必须非常快。就像这么快,引导Drupal之间的时间差异也不会太长。在这种情况下,我可能会使用apache或nginx将URL路径转发到文件系统中其他位置的文件。如果是这样的话,我很乐意吃掉我那不起眼的馅饼。

答案 1 :(得分:1)

你做不到。模块公开的每个URL都通过hook_menu()公开。这是让Drupal知道模块处理哪些URL的唯一方法。

有许多Drupal函数返回JSON对象,并且与hook_menu()中定义的URL相关联;例如,poll_choice_js()poll/js的页面回调。通过hook_menu()定义URL这一事实对使用URL获取所需JSON对象的JavaScript代码没有任何影响。

答案 2 :(得分:1)

同意。你不能。在drupal中,有一些方法可以暴露网址。

  • 存在物理文件,因此您可以直接访问它(tho 这很可能是在drupal之外)
  • 通过hook_menu
  • 通过视图页面回调
  • 通过网址别名
  • ...以及其他一些处理网址的模块......

之所以如此,是因为您可能提到的网址并不存在。 path / json的真正路径实际上是index.php?q = path / json到apache服务器

如果你想让一个网址只输出JSON代码..通过调用以下内容完成页面: drupal_json(..)[http://api.drupal.org/api/drupal/includes--common.inc/function/drupal_json/6]