web-dev-qa-db-ja.com

ノードごとに複数のパスエイリアス

パスエイリアスがticket/[node ID]のように設定されているチケットシステムがあります。 http://example.com/ticket/1234

同じノードに複数のパスエイリアスを作成し、discussion/[node ID]としてもアクセスできるようにします。 http://example.com/discussion/1234

パスに基づいて異なるノードテンプレートを使用します。

同じノードに複数のパスエイリアスを設定する方法はありますか?

5
Pramod Sivadas

ルーティングアプローチの実際のコード例を用意する。

最初の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
leymannx

1つのノードに複数のパスエイリアスを設定できますが、これは問題ありません。 Pathautoでそれを実行できない場合は、ノードを保存するときにカスタムコードを使用することができます。

しかし、あなたの場合、/ticket/{node}/discussion/{node}に異なるルートを設定する方が効率的かもしれません。固定ルートパラメータを設定するか、カスタムノードコントローラを使用してマーカーを設定できます。マーカーをテーマ名の提案で使用して、カスタムテンプレートを選択できます。

別の解決策は、ノードのコンテキストフィルターと異なるパスを持つ2つのディスプレイを使用してビューを設定することです。それぞれに異なる表示モードを選択して、異なるテンプレートを取得します。技術的にはほとんど同じですが、Viewsがルートを設定するため、カスタムモジュールは必要ありません。

2
4k4