hook_pathauto_pattern_alter()
вызывается только тогда, когда:
- У объекта есть дорожка поле
- Автоматическая обработка пути включена
- Для сущностей, которые поддерживают ревизии, сущность использует ревизию по умолчанию.
- Для этого объекта был установлен шаблон по умолчанию.
$entity->toUrl()->getInternalPath()
не бросает EntityMalformedException
, UndefinedLinkTemplateException
, или же UnexpectedValueException
исключение
Показанный хук также вызывается только при обновлении объекта, а не при его создании.
Когда модуль Pathauto настроен так, чтобы не изменять существующий псевдоним пути, даже если hook_pathauto_pattern_alter()
были вызваны, псевдоним пути не будет изменен.
Как примечание, хук должен сначала проверить сущность, для которой вызывается хук, является узлом, что и является примером хука в путьauto.api.php делает.
/**
* Измените шаблон, который будет использоваться до того, как Pathauto сгенерирует псевдоним.
*
* Этот хук будет вызываться только в том случае, если настроен шаблон по умолчанию (на
* admin/config/search/path/patterns).
*
* @param \Drupal\pathauto\PathautoPatternInterface $pattern
* Шаблон Pathauto, который будет использоваться.
* массив @param $контекст
* Ассоциативный массив дополнительных опций со следующими элементами:
* - 'module': Псевдоним модуля или типа сущности.
* - 'op': строка с операцией, выполняемой над объектом,
* псевдоним. Может быть «вставка», «обновление», «возврат» или «массовое обновление».
* - 'source': строка исходного пути для псевдонима (например, 'node/1').
* - 'data': массив объектов с ключами для передачи token_replace().
* - 'bundle': подтип или комплект объекта, для которого используется псевдоним.
* - 'language': строка кода языка для псевдонима (например, 'en').
* Это может быть изменено по ссылке.
*/
function hook_pathauto_pattern_alter(\Drupal\pathauto\PathautoPatternInterface $pattern, array $context) {
// Переключить любые токены [node:created:*] с [node:updated:*] при обновлении.
if ($context['module'] == 'узел' && ($context['op'] == 'обновление')) {
$pattern->setPattern(preg_replace('/\[node:created(\:[^]]*)?\]/', '[node:updated$1]', $pattern->getPattern()));
}
}
Код показанного хука будет похож на следующий.
используйте Drupal\pathauto\PathautoPatternInterface;
function mymodule_pathauto_pattern_alter (PathautoPatternInterface $pattern, массив $context) {
if ($context['module'] == 'node' && $context['op'] === "update" && $context['bundle'] === "news") {
$node = $context['данные']['узел'];
$archived = $node->get('field_archived')->getString() === "1";
если ($ в архиве) {
$pattern->setPattern('/archive/[node::title]');
}
}
}
Объекты уже передаются по ссылке; нет необходимости определять первый параметр как &$шаблон
.
Я также хотел бы убедиться, что другие модули не реализуют hook_pathauto_pattern_alter()
для которых их реализация вызывается после реализации, показанной в вопросе, и это изменяет шаблон для того же объекта и того же пакета.
использованная литература