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


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.