我已将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()
运行标题,因此这里将是您插入自己的逻辑的地方。