Рейтинг:1

Пример hook_pathauto_pattern_alter

флаг cn

Я не понимаю хука. Я ожидал, что "pattern_alter" позволит мне "изменить" "шаблон". Но, похоже, это не так.

Я также пытался изменить псевдоним... который, похоже, также не имеет никакого эффекта.

Может ли кто-нибудь показать мне рабочий пример, пожалуйста?

function xxx_pathauto_pattern_alter(\Drupal\pathauto\PathautoPatternInterface &$pattern, массив $context) {

  /* //////////////////////////////////////////////// ///////////////////////////////////
  //// article_type - переопределить логику пути для *архивированных* узлов ('/archiv/[node::title]')
  /* //////////////////////////////////////////////// ///////////////////////////////////*/
  if( $context['op'] === "обновление" && $context['bundle'] === "новости") {

    $node = $context['данные']['узел'];
    $archived = $node->get('field_archived')->getString() === "1";
    если ($ в архиве) {

      $pattern->setPattern('/archive/[node::title]');
      дпм($шаблон); //РАБОТАЕТ !!! только в объекте. Шаблон не изменится в реальном мире.
    }
  }
}

function xxx_pathauto_alias_alter(&$alias, array &$context) {
  /* //////////////////////////////////////////////// ///////////////////////////////////
    //// article_type - переопределить логику пути для *архивированных* узлов ('/archive/[node::title]')
    /* //////////////////////////////////////////////// ///////////////////////////////////*/
  if ($context['op'] === "обновление" && $context['bundle'] === "новости") {

    $node = $context['данные']['узел'];
    $archived = $node->get('field_archived')->getString() === "1";
    если ($ в архиве) {
      $псевдоним = "/архив/нет";
      дпм($псевдоним); //РАБОТАЕТ !!! только в функции. Псевдоним не изменится в реальном мире.
    }
  }
Рейтинг:2
флаг us

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() для которых их реализация вызывается после реализации, показанной в вопросе, и это изменяет шаблон для того же объекта и того же пакета.

использованная литература

mogio avatar
флаг cn
Ападерно. Спасибо за ваш длинный и подробный ответ! .. вроде работает!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.