Может ли Pathauto вернуться к другому шаблону, если первый шаблон дает пустой путь?
Я хочу, чтобы страницы имели автоматически сгенерированный путь, если они находятся в меню, и другой, если их нет в меню; а не пустой путь, как в настоящее время генерирует Pathauto, если страницы нет в меню.
Как я могу это сделать?
Подробности: Я использую этот шаблон для своего типа контента страниц, который отлично работает, когда страница находится в меню.
[node:menu-link:parents:join-path]/[node:menu-link]
Проблема в том, что когда страницы нет в меню, она получает пустой путь. Я хочу дать ему другой путь на основе "заголовка" страницы, например.
3 answers
К сожалению, условные токены запрашивались много раз и никогда не реализовывались, поэтому запасной вариант, о котором вы просите, невозможен.
Вместо этого вы можете использовать Правила . Описание на Drupal.org утверждает, что это просто - вместо pathauto настройте правило создания/обновления узлов и создайте необходимые псевдонимы. Правила поддерживают условия, как вы можете видеть в Примерах правил проекта, поэтому вы можете создавать псевдонимы условно.
Теперь вы можете добиться этого с помощью функции hook_pathauto_pattern_alter(). Что-то вроде:
<?php
/**
* Implements hook_pathauto_pattern_alter().
*/
function mymodule_pathauto_pattern_alter(&$pattern, array $context) {
// Alter any node entity path patterns we need to
if (isset($context['data']['node'])) {
$node = $context['data']['node'];
switch ($node->type) {
case 'page':
// Check condition, and change the pattern when appropriate
$pattern = '[node:title]';
break;
}
}
?>
Я взял то, что написал m4olivei, и заставил его работать для возврата к заголовку узла, если пункт меню не создан:
/**
* Implements hook_pathauto_pattern_alter().
*/
function mymodule_pathauto_pattern_alter(&$pattern, array $context) {
// Set up pathauto fallback to node title if no menu item is generated
if (isset($context['data']) && isset($context['data']['node'])) {
if (isset($context['data']['node']->menu) && isset($context['data']['node']->menu['enabled'])) {
if (!$context['data']['node']->menu['enabled']) {
$pattern = '[node:title]';
}
}
}
}