Создание псевдонима пути программно при создании узла


8

У меня есть пользовательский тип контента, который создается модулем. Есть ли ловушка, которую я могу использовать для установки псевдонима пути моего пользовательского типа контента при создании узла?

Одним из моих полей является буквенно-цифровой код, и я хочу использовать его в пути. например: 'event / myc0d3'

Я заметил, что эта функция ( path_set_alias ) существовала в 6, но я не могу найти эквивалент для 7. И не знаю, где бы я ее назвал.

Ответы:


10

Вместо использования ловушки следует использовать модуль Pathauto, где вы можете определить конкретный шаблон, как генерируются псевдонимы для типа контента (at /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

9

Функция теперь называется path_save () , см. Пример для path_taxonomy_term_insert () .


4
Вы должны действительно расширить этот ответ, чтобы не просто ссылаться на внешние ресурсы, но ссылки, пока они остаются действительными, были полезны.
DrCord

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
Тити

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.