【问题标题】:URL encoding a string from JS to DrupalURL 编码从 JS 到 Drupal 的字符串
【发布时间】:2012-05-25 02:47:11
【问题描述】:

我有一个使用 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 获取整个字符串?

【问题讨论】:

  • 我已经添加了 php 和 js 标签。因为这是更多的 php 和 js 相关的。希望有人能回答这个问题。
  • url的构造看起来有点奇怪,真的生成正确的url吗?

标签: javascript drupal uri url-encoding


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      使用%2f 代替/:

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

      [reference],见第 2.2 节

      或者,一个更易读的替代方案:

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

      【讨论】:

      • 更易读的等价物:$.ajax({url: "index.php?q=" + encodeURIComponent("get_value/"+value),
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

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

        【讨论】:

          【解决方案6】:

          您的问题是 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
          }
          

          希望这会有所帮助!

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 2022-11-20
              • 1970-01-01
              • 2013-06-26
              • 2011-05-15
              • 2019-08-20
              • 1970-01-01
              • 2014-02-19
              相关资源
              最近更新 更多