パスエイリアスがticket/[node ID]
のように設定されているチケットシステムがあります。 http://example.com/ticket/1234 。
同じノードに複数のパスエイリアスを作成し、discussion/[node ID]
としてもアクセスできるようにします。 http://example.com/discussion/1234 。
パスに基づいて異なるノードテンプレートを使用します。
同じノードに複数のパスエイリアスを設定する方法はありますか?
ルーティングアプローチの実際のコード例を用意する。
最初のMYMODULE.routing.yml
書く:
ticket.view:
path: '/ticket/{node}'
defaults:
_controller: '\Drupal\node\Controller\NodeViewController::view'
requirements:
node: \d+
_entity_access: 'node.view'
discussion.view:
path: '/discussion/{node}'
defaults:
_controller: '\Drupal\node\Controller\NodeViewController::view'
requirements:
node: \d+
_entity_access: 'node.view'
次にMYMODULE.module
次のようなテンプレートの提案を追加します。
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function MYMODULE_theme_suggestions_node_alter(array &$suggestions, array $variables) {
if (\Drupal::routeMatch()->getRouteName() == 'ticket.view') {
$suggestions[] = 'ticket'; // Would take ticket.html.twig
}
if (\Drupal::routeMatch()->getRouteName() == 'discussion.view') {
$suggestions[] = 'discussion'; // Would take discussion.html.twig
}
}
あるいは、いくつかの異なるスタイルが必要な場合は、ルートに応じてボディクラスを追加するだけです。
/**
* Implements hook_preprocess_HOOK().
*/
function MYMODULE_preprocess_html(&$variables) {
if (\Drupal::routeMatch()->getRouteName() == 'ticket.view') {
$variables['attributes']['class'][] = 'ticket';
}
if (\Drupal::routeMatch()->getRouteName() == 'discussion.view') {
$variables['attributes']['class'][] = 'discussion';
}
}
最後に、この素晴らしい記事をチェックしてください https://thinkshout.com/blog/2016/07/drupal-8-routing-tricks-for-better-admin-urls/ 、いくつかありますあなたの中のより多くのルートグッズが好きかもしれません。
1つのノードに複数のパスエイリアスを設定できますが、これは問題ありません。 Pathautoでそれを実行できない場合は、ノードを保存するときにカスタムコードを使用することができます。
しかし、あなたの場合、/ticket/{node}
と/discussion/{node}
に異なるルートを設定する方が効率的かもしれません。固定ルートパラメータを設定するか、カスタムノードコントローラを使用してマーカーを設定できます。マーカーをテーマ名の提案で使用して、カスタムテンプレートを選択できます。
別の解決策は、ノードのコンテキストフィルターと異なるパスを持つ2つのディスプレイを使用してビューを設定することです。それぞれに異なる表示モードを選択して、異なるテンプレートを取得します。技術的にはほとんど同じですが、Viewsがルートを設定するため、カスタムモジュールは必要ありません。