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

this post中的第一条注释建议使用hook_token_values,但是即使阅读了docs,我也无法真正理解如何使用它。在我的测试中,当我实现此挂钩时,生成的别名始终为“数组”,这意味着我丢失了一些东西。

有什么帮助吗?谢谢。

最佳答案

可能是您也错过了实现hook_token_list的机会。提供新令牌是一个两步过程:


实现hook_token_list声明要提供的令牌。这将只是令牌的名称以及简短说明,以及令牌将应用哪种对象的信息(例如,节点,用户,分类法等)。
实现hook_token_value以实际生成令牌的内容。当将令牌替换为它们应代表的内容时,将调用此方法。


因为您只想提供令牌模块已经提供的标题令牌的替代版本,所以最好只从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将是'user',而$object将是user对象,对于其他类型,依此类推)。它所做的是创建一个由令牌名称作为键的值数组,并用该令牌的替换值作为值。来自token_node.inc的原始代码仅通过check_plain()运行标题,因此这里将是您插入自己的逻辑的地方。

10-06 03:43