代码之家  ›  专栏  ›  技术社区  ›  Phill Pafford

jQuery/Drupal将字符串附加到网站上的所有HREF(任何页面)

  •  0
  • Phill Pafford  · 技术社区  · 14 年前

    所以我有一个网站,上面有十几页使用Drupal作为CMS。想知道如何在任何带有动态属性的页面上设置/附加所有的href链接吗?

    下面是一个URL示例:

    http://www.site.com/?q=node/4
    

    我想在URL中附加如下内容:

    http://www.site.com/?q=node/4&attr=1234
    

    我认为jQuery是一个很好的选择,但是Drupal也有任何功能吗?

    问题是我正在学习Drupal的方法,对jQuery的经验很少,但对两者都有了更好的了解。我看到jQuery可以替换a-HREF,但是看起来它们硬编码了这个HREF,jQuery能在一个页面上找到所有的HREF并将字符串附加到它吗?Drupal也有这个功能,什么是最好的方法?

    还需要这个来处理干净或标准的URL格式,所以我想Apache会处理这个问题,我只是想确定一下。

    谢谢你的帮助

    编辑:

    看起来一般的共识是Drupal应该处理这种类型的请求。只是在寻找最好的实现。简单的函数调用是最好的,但我希望它能动态地将它添加到所有现有的href中,因为我希望它是动态的,而不是硬编码任何url/href调用。所以我可以随时添加/删除页面,而无需重新配置/重新编码任何内容。

    不过,还是谢谢你的好建议

    编辑2:

    好吧,也许我在问这个问题。这是我需要的,为什么还不适合我。

    我需要在url中传递一个值,该值可以更改网站的一些外观。我需要它在页面上的每一个href标签上传递,而不是在用户注销或管理页面上。

    现在我看到底部导航链接使用这个Drupal函数:menu.inc中的menu_navigation_links(),但是顶部导航使用一个自定义函数。

    template.php脚本中的这个函数看起来是创建链接的函数

    function lplus($text, $path, $options = array()) {
      global $language;
    
      // Merge in defaults.
      $options += array(
          'attributes' => array(),
          'html' => FALSE,
        );
    
      // Append active class.
      if (($path == $_GET['q'] || ($path == '<front>' && drupal_is_front_page())) &&
          (empty($options['language']) || $options['language']->language == $language->language)) {
        if (isset($options['attributes']['class'])) {
          $options['attributes']['class'] .= ' active';
        }
        else {
          $options['attributes']['class'] = 'active';
        }
      }
    
      // Remove all HTML and PHP tags from a tooltip. For best performance, we act only
      // if a quick strpos() pre-check gave a suspicion (because strip_tags() is expensive).
      if (isset($options['attributes']['title']) && strpos($options['attributes']['title'], '<') !== FALSE) {
        $options['attributes']['title'] = strip_tags($options['attributes']['title']);
      }
    
      return '<a href="'. check_url(url($path, $options)) .'"'. drupal_attributes($options['attributes']) .'><b>'. ($options['html'] ? $text : check_plain($text)) .'</b></a>';
    }
    

    不知道如何将我所需要的整合到这个函数中。

    那么在主页上呢?q=node/丢失,如果我附加了与号,它就会抛出一个错误。

    http://www.site.com/&attr=1234 // throws error
    

    但如果我把它改成正确的格式它就可以工作了

    http://www.site.com/?attr=1234
    
    5 回复  |  直到 7 年前
        1
  •  2
  •   Andrew Sledge    14 年前

    假设您指的是页面,您指的是页面的内容类型(只要是真正的内容,而不是块或视图中的内容,就可以用于任何其他内容类型)。

    您可以通过运行str_replace或使用正则表达式轻松替换即将查看的任何节点的内容。例如,使用str_replace:

    function module_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
      switch($op) {
        case "view":
          $node->body = str_replace($expected_link, $desired_link);
          break;
      }
    }
    

    在其他地方定义所需的链接。不是一个最佳的解决方案,但是非Javascript浏览器(是的,它们仍然存在!)如果您试图用Javascript更改强制的、所需的url,则无法绕过它。

        2
  •  1
  •   Detect    14 年前

    我认为用Drupal/PHP来做会更干净。查看Pathauto模块: http://drupal.org/node/17345

        3
  •  1
  •   Ted    14 年前

    这里有一个关于相关主题的很好的讨论: http://drupal.org/node/249864

    这不会使用jquery(相反,您将使用PHP覆盖一个函数),但是您可以得到相同的结果。但是,这假设您正在使用菜单链接。

        4
  •  1
  •   Sid Kshatriya    14 年前

    我觉得你应该考虑探索一下( http://drupal.org/project/purl )以及一些模块,例如空间和上下文。

        5
  •  1
  •   FR6    14 年前

    您可以将链接动态覆盖到 预处理页 功能。

    关于你的 模板.php

    function *yourtheme*_preprocess_page(&$vars, $hook){
      //You can do it for the region that you need
      $vars['content'] = preg_replace('/<a href="(.*?)"/i', '<a href="$1&attr=1234"', $vars['content']);
    }
    

    注:

    • 我没有试过,这只是个暗示。