对从JS到Drupal的字符串进行编码的URL

URL encoding a string from JS to Drupal

本文关键字:编码 URL 字符串 Drupal 对从 JS      更新时间:2023-09-26
我有一个使用 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 获取整个字符串?

使用 %2f 而不是 /

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

[参考],见第2.2节

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

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

您的问题是Drupal将斜杠解释为路径分隔符,因此它将get_value$value/val1/val2/val3中的第一个参数提取...你可以让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
}

希望这有帮助!

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

您的get_value()可能有问题。来自 PHP 的 urdecode(( 手册:"超全局 $_GET 和 $_REQUEST 已经被解码了。在 $_GET 或 $_REQUEST 中的元素上使用 urldecode(( 可能会产生意想不到的危险结果。

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

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

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

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

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

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

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

在 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 编码斜杠的逻辑也可能去除其他字符。