¿Cómo obtengo el ID de nodo actual?

51

En Drupal 7, si quisiera obtener la identificación del nodo del nodo que se muestra actualmente (por ejemplo node/145), podría obtenerlo con la arg()función. En este caso, arg(1)devolvería 145.

¿Cómo puedo lograr lo mismo en Drupal 8?

24ma13wg
fuente

Respuestas:

103

El parámetro habrá sido subido de nid a objeto de nodo completo para cuando tenga acceso a él, por lo tanto:

$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();
}

Vea el registro de cambios para más información.

Clive
fuente
44
Solo quiero agregar que debes tener cuidado con esto: me acabo de picar donde \ Drupal :: routeMatch () -> getParameter ('node'); devolverá una matriz de 1 elemento (la identificación del nodo) en las páginas de eliminación de revisión de nodo, por lo que si llama a un método en lo que supone que es un objeto, obtendrá un error fatal como "Error fatal: Llame a una función miembro getType ( ) en cadena ".
Jeff Burnz
¿Cómo puedo obtener el parámetro, si lo visité /taxonomy/term/{tid}?
AshwinP
¿Es este un reemplazo funcional para menu_get_object?
Frank Robert Anderson
Bastante sí, @Frank. Por supuesto, es un poco diferente, pero si se cae en un contexto que no sabe en qué página de entidad (si la hay) está, esta es la forma recomendada de averiguarlo
Clive
1
@AshwinP El parámetro es lo que escriba dentro {}de su ruta. Para términos de taxonomía, el parámetro de ruta se llama taxonomy_termdefinición de ruta /taxonomy/term/{taxonomy_term}. Aquí se puede conseguir de esta manera, \Drupal::routeMatch()->getParameter('taxonomy_term').
Jdrupal
17

Es correcto de usar \Drupal::routeMatch()->getParameter('node'). Si solo necesita la ID del nodo, puede usarla \Drupal::routeMatch()->getRawParameter('node').

Maouna
fuente
4

si está utilizando o creando un bloque personalizado, debe seguir este código para obtener la identificación del nodo de URL actual.

// 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'));
}
Gauri Shankar
fuente
Esta publicación no tiene sentido. No hay forma de que nadie sepa a dónde va este código.
Lester Peabody
2

Tenga en cuenta que en la página de vista previa del nodo, lo siguiente no funciona:

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

Para la página de vista previa del nodo, debe cargar el nodo de esta manera:

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

¿Cómo cargar un objeto de nodo en la página de vista previa de nodo?

oknate
fuente