在Drupal中,如何更改传递给Pathauto的值?

时间:2010-05-10 17:14:54

标签: drupal token pathauto

我让Pathauto配置为根据节点的标题为特定内容类型生成别名。问题是我想在Pathauto使用它来生成别名之前对此标题进行小的更改。

this post中的第一条评论建议使用hook_token_values,但即使在阅读docs后我也无法理解如何使用它。在我的测试中,当我实现这个钩子时,生成的别名总是“数组”,这意味着我遗漏了一些东西。

有任何帮助吗?感谢。

2 个答案:

答案 0 :(得分:5)

您可能也错过了实施hook_token_list。提供新令牌需要两个步骤:

  1. 实施hook_token_list以声明您要提供的令牌。这只是令牌的名称,以及简短的解释,以及令牌将应用于什么类型的对象的信息(例如节点,用户,分类法......)
  2. 实施hook_token_value以实际生成令牌的内容。当令牌替换为他们应该代表的内容时,将调用此方法。
  3. 由于您只想提供令牌模块已经提供的标题令牌的替代版本,因此最好只复制token_node.inc中的相关部分,将其拆分为相关案例并进行调整以用于另一个模块:

    /**
     * Implementation of hook_token_list().
     */
    function yourModule_token_list($type = 'all') {
      if ($type == 'node' || $type == 'all') {
        $tokens['node']['yourModule-title'] = t('Node title (customized version by yourModule)');
    
        return $tokens;
      }
    }
    

    这简单地说yourModule为名为yourModule-title的节点对象提供了一个标记,并附有简短描述。主要工作在另一个钩子中完成:

    /**
     * Implementation of hook_token_values().
     */
    function yourModule_token_values($type, $object = NULL, $options = array()) {
      $values = array();
      switch ($type) {
        case 'node':
          $node = $object;
          // TODO: Replace the check_plain() call with your own token value creation logic!
          $values['yourModule-title'] = check_plain($node->title);  
          break;
      }
    
      return $values;
    }
    

    只要需要节点对象的标记,就会调用此方法,并将有问题的节点作为$object参数传递(对于用户标记,$type将是'用户',并且$object将是用户对象,依此类推其他类型)。它的作用是创建一个由标记名称键入的值数组,并将该标记替换为值。来自token_node.inc的原始代码只通过check_plain()运行标题,因此这将是插入您自己的逻辑的地方。

答案 1 :(得分:1)

在Drupal 7中,令牌功能已移至核心。令牌由hook_tokenshook_token_info方法实现。有关用法示例,请按照提供的链接,查找实现hook_tokens和hook_token_info的函数的链接...我发现statistics_tokensstatistics_token_info函数有助于理解此挂钩的工作原理。

可能还值得注意的是,这个钩子需要由一个模块实现......我的第一次尝试是将我的测试函数放到主题的template.php中,只是没有任何事情发生:-p