現在のページがノードかどうかを確認する方法はありますか?


7

URLをチェックせずに、現在のページがノードページであるかどうかを知りたいのですが。URLエイリアスの使用を計画しているため、「/ node / *」構造に依存しないようにします。

ノードページを示すページ変数または何かがありますか?

回答:


14
\Drupal::request()->attributes->get('node');

ここから取得:https ://api.drupal.org/api/drupal/core!lib!Drupal.php/function/Drupal%3A%3Arequest /8

今、ドキュメントはこの関数を決して使用しないと言っていますが、私はこれを使用して、自分がどのようなページにいるかを判断しました。

別の関数がありますが、それがあなたの場合に適用されるかどうかはわかりません:

https://api.drupal.org/api/drupal/core%21modules%21node%21node.module/function/node_is_page/8

少なくとも、エンティティがない場合は、コードでそれを模倣できます。

  $route_match = \Drupal::routeMatch();

  if ($route_match->getRouteName() == 'entity.node.canonical') {
    return true;
  }

1
ルート名のチェックは問題ありませんが、node属性を使用しないでください。これは、ノード編集フォーム、リビジョンの概要など、他の多くのページにも表示されます。誰かがあなたの頭を
いじって

$route_match->getRouteName() == 'entity.node.revision'リビジョンの作業にもこのプラスが必要でした。
leymannx 2018年

6

あなた自身のモジュールでは、推奨される方法は

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  // It's a node!
}

5

ページテンプレートでは、ノードの変数が既に利用可能であり、twigで使用できます。

現在のページがノードであるかどうかを確認するには、node存在するかどうかを確認できます。

page.html.twig

{% if node %}
  <h1>This is a node</h1>
{% endif %}

このコードはコアにあるため、これは可能です。

core/includes/theme.inc:
function template_preprocess_page(&$variables) {
  ...
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
    $variables['node'] = $node;
  }
}

これは/ node / [id]とurlエイリアスで機能します。


バルティックで見たことがないので、これはどのテーマにありますか?
BrandenB171 2016

これはテーマのフックではなく、コアの前処理の一部ですcore/includes/theme.inc。を参照してください。
2016

0

現在の回答は、プレビューまたはリビジョンでは機能しません。しかし、通常は、そのロジックの一部をプレビューまたはリビジョンでも起動する必要があります。特に、保存または公開された後のノードがどのように見えるかをよく理解する必要があるテーマレベルで。

したがって、次のスニペットは、ノード全体、そのプレビュー、またはそのリビジョンを表示しても、現在のノードを取得します。これは、ヘルパー関数内に配置して、MYMODULE/src/Utilsそのままアクセスするか、サービスにすることができます。

$node = FALSE;
$route_match = \Drupal::routeMatch();

if ($route_match->getRouteName() == 'entity.node.canonical') {
  $node = $route_match->getParameter('node');
}
elseif ($route_match->getRouteName() == 'entity.node.revision') {
  $revision_id = $route_match->getParameter('node_revision');
  $node = node_revision_load($revision_id);
}
elseif ($route_match->getRouteName() == 'entity.node.preview') {
  $node = $route_match->getParameter('node_preview');
}

return $node;

ところで、同じnode_is_page()ことが現在リビジョンやプレビューで機能しない機能にも当てはまります。私はすでに問題を開いており、https://www.drupal.org/project/drupal/issues/3005029にパッチを提供しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.