web-dev-qa-db-ja.com

現在のノードIDを取得するにはどうすればよいですか?

Drupal 7の場合、現在表示されているノードのノードIDを取得したい場合(例:_node/145_)arg()関数で取得できます。この場合、arg(1)は145を返します。

Drupal 8で同じようにするにはどうすればよいですか?

53
dbj44

パラメータは、アクセスするまでにnidから完全なノードオブジェクトにアップキャストされます。

$node = \Drupal::routeMatch()->getParameter('node');
if ($node instanceof \Drupal\node\NodeInterface) {
  // You can get nid and anything else you need from the node object.
  $nid = $node->id();
}

詳細については、 変更レコード を参照してください。

109
Clive

\Drupal::routeMatch()->getParameter('node')を使用するのが正しいです。ノードIDだけが必要な場合は、\Drupal::routeMatch()->getRawParameter('node')を使用できます。

18
Maouna

ノードのプレビューページでは、以下は機能しません。

$node = \Drupal::routeMatch()->getParameter('node');
$nid = $node->id();

ノードのプレビューページでは、次のようにノードをロードする必要があります。

$node = \Drupal::routeMatch()->getParameter('node_preview');
$nid = $node->id();

ノードプレビューページにノードオブジェクトを読み込む方法

4
oknate

カスタムブロックを使用または作成している場合は、このコードに従って現在のURLノードIDを取得する必要があります。

// add libraries
use Drupal\Core\Cache\Cache;  

// code to get nid

$node = \Drupal::routeMatch()->getParameter('node');
  $node->id()  // get current node id (current url node id)


// for cache

public function getCacheTags() {
  //With this when your node change your block will rebuild
  if ($node = \Drupal::routeMatch()->getParameter('node')) {
  //if there is node add its cachetag
    return Cache::mergeTags(parent::getCacheTags(), array('node:' . $node->id()));
  } else {
    //Return default tags instead.
    return parent::getCacheTags();
  }
}

public function getCacheContexts() {
  //if you depends on \Drupal::routeMatch()
  //you must set context of this block with 'route' context tag.
  //Every new route this block will rebuild
  return Cache::mergeContexts(parent::getCacheContexts(), array('route'));
}
4
gauri shankar