创建节点时以编程方式创建路径别名


8

我有一个由模块创建的自定义内容类型。创建节点时,是否可以使用钩子来设置自定义内容类型的路径别名?

我的一个字段是字母数字代码,我想在路径中使用它。例如:“ event / myc0d3”

我注意到该函数(path_set_alias)存在于6中,但我找不到7的等效函数。也不知道在哪里调用它。

Answers:


10

代替使用钩子,应该使用Pathauto模块,您可以在其中定义特定的模式(如何在每种内容类型上生成别名/admin/config/search/path/patterns)(位于)。您可以在其中使用替换模式或自己编写代码。这是一种更清洁的方法。

否则,您可以尝试hook_node_presave($node)直接更改别名:

$node->path['pathauto'] = 0; // Required only if Pathauto is enabled.
$node->path['alias'] = "foo/bar";

path_save(&$path)直接使用以下功能:

$path = array('source' => "node/$node->nid", 'alias' => 'foo/bar');
path_save($path);

对我来说,只有两者结合才能起作用,因此最后在别名文本字段内写入正确的别名。仅执行path_save()可行,但是随后在节点编辑时别名文本字段中使用了错误的别名,因此简单的重新保存将再次使我获得错误的别名。
leymannx 2015年


9

hook_node_insert()在我的情况下不起作用,通过一些搜索,我想到了此博客文章。我以相同的方式并预先实现了hook_insert()

/**
 * Implements hook_insert().
 */
function mymodule_insert($node) {
    // Set the URL alias
    if (empty($node->path['alias'])) {
        $node->path['alias'] = 'slug/' . $node->nid;
    }
}

2
注意hook_insert()仅在实现模块的模块定义内容类型时使用;对于从另一个模块定义的内容类型,该挂钩不能用于对节点执行操作。
kiamlaluno

这就是为什么不建议仅链接到文章,而是扩大答案并从那些文章中提取主要有用信息的原因-“博客帖子”链接不再有效,并导致404
Titi

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.