4

我有一个使用 Ajax 的 Drupal Web 应用程序;Ajax 函数有时需要将字符串作为参数传递给 Drupal 函数

$.ajax({url: "index.php?q=get_value/"+encodeURIComponent(value),  

当值包含斜杠时,Drupal 函数无法识别它

 function get_value($value) {
       print urldecode($value);

例如,如果传递的字符串是 ABC/123 , get_value 只打印 ABC

我该如何解决这个问题,通过斜杠并从 PHP/Drupal 获取整个字符串?

4

7 回答 7

6

使用%2f而不是/

$.ajax({url: "index.php?q=get_value" + "%2f" + encodeURIComponent(value),  

[参考],见第 2.2 节

或者,一个更具可读性的替代方案:

$.ajax({url: "index.php?q=" + encodeURIComponent("get_value/"+value),
于 2012-05-22T09:58:25.303 回答
2

您的问题是 Drupal 将斜杠解释为路径分隔符,因此它将 get_value/val1/val2/val3 中的第一个参数提取为 $value ...您可以让 Drupal 拆分参数,但您需要重新组合它们。以下是 Drupal7 的示例。

在您的菜单系统中,您必须确保 drupal 将使用所有参数回调您的 get_value 函数:

function mymodule_menu {
   $items['get_value'] = array(
      'page callback' => 'mymodule_get_value',
   );
   return $items;
}

然后重新组合参数的动态数量:

function mymodule_get_value() {
   $args = func_get_args();
   $value = implode('/', $args);
   // do what you need with $value here
}

希望这可以帮助 !

于 2012-05-28T21:45:23.817 回答
1

也许我在这里遗漏了一些东西,但你不能只是连接你的查询字符串并将它传递给ajax函数吗?也许你可以使用parse_url()

你的get_value()可能是个问题。来自 PHP 的urdecode()手册:“超全局变量 $_GET 和 $_REQUEST 已经解码。在 $_GET 或 $_REQUEST 中的元素上使用 urldecode() 可能会产生意想不到的危险结果。”

于 2012-05-22T09:24:51.653 回答
1

如果那是您的确切代码,那么您有语法错误(额外的引号),第一行应该是:

$.ajax({url: "index.php?q=get_value/" + encodeURIComponent(value),  
于 2012-05-22T09:25:04.180 回答
1

您能否提供更多关于 PHP 函数在哪里的详细信息 - 它是否在 Drupal 自定义模块中?如果它在自定义模块中,您是否使用 menu_hook 作为 get_value 路径?另外,您使用的是哪个版本的 Drupal?另一件事是您可以将 encodeURIComponent 替换为 Drupal.encodeURIComponent (Drupal 6) 或 Drupal.encodePath (Drupal 7)。

于 2012-05-24T09:58:19.497 回答
1

了解您的路由系统在做什么会很有帮助,首先,您在调试时看到了什么?

 function get_value($value) {
   var_dump($value);
   print urldecode($value);

您可以尝试的另一种选择是传递带有双引号的变量,因此它们被解释为字符串。

$.ajax({url: "index.php?q=get_value/\"" + encodeURIComponent(value) + "\"", 
于 2012-05-27T04:29:16.300 回答
1

在 URL 解码之前,您应该检查 PHP 函数的 $value 参数是否有斜杠之后的部分。

解决此问题的一种方法是在对其进行编码之前替换字符串中的斜杠,然后在 PHP 中对其进行解码后将其替换回来。这是一个用回车符替换斜杠的示例:(您应该使用在字符串中找不到的字符)

$.ajax({url: "index.php?q=get_value/"+encodeURIComponent(value.replace("/", "\r")),

和 PHP 代码来扭转这一点:

function get_value($value) {
    print str_replace("\r", "/", urldecode($value));

您可能需要尝试一些其他字符(您也可以使用字符序列而不是单个字符)并查看哪些有效。去除 URL 编码斜杠的逻辑也可能去除其他字符。

于 2012-05-29T08:22:00.230 回答