Hasta ahora, me encontré con estas 3 funciones en Drupal 7, pero no estoy realmente seguro de cuál es la diferencia entre ellas, y cuál es más apropiado para obtener la ID de nodo en una función de preproceso de bloque.
¿Me puede dar alguna idea?
Hasta ahora, me encontré con estas 3 funciones en Drupal 7, pero no estoy realmente seguro de cuál es la diferencia entre ellas, y cuál es más apropiado para obtener la ID de nodo en una función de preproceso de bloque.
¿Me puede dar alguna idea?
Respuestas:
No estoy realmente seguro de cuál es la diferencia entre ellos
menu_get_object()
devolverá el objeto de nodo para el nodo cuya ID es 1; si la página que se muestra es example.com/user/1, menu_get_object('user')
devolverá el objeto de usuario para el usuario cuyo ID es 1. node_load
) a los que se llamará para cargar un objeto correspondiente a una parte de la ruta actualdrupal_lookup_path("homepage")
regresará "node/1"
. Los alias de ruta se pueden asociar a cualquier ruta interna, no solo a rutas de nodo.y que es más apropiado para obtener la ID de nodo en una función de preproceso de bloque.
Si todo lo que desea obtener es el ID de nodo del nodo que se muestra actualmente, entonces solo necesita usar el siguiente código:
if (arg(0) == 'node') {
$nid = arg(1);
}
Si necesita obtener el objeto de nodo, puede usar el siguiente código:
if ($node = menu_get_object()) {
// Use the node object.
}
De esos fragmentos, el segundo es mejor, ya que devuelve el objeto de nodo correcto para rutas internas como node / 1 / revisiones / 3 / view.
Tenga en cuenta que algunas funciones de preproceso, como las de la página o el nodo, ya tienen a $variables['node']
. Esto significa que en esos casos, solo necesita usar el siguiente fragmento de código en su función de preproceso, sin preocuparse de qué función usar.
if (isset($variables['node'])) {
// Check the node ID or other properties.
}
Para otras funciones de preproceso, verifique la documentación para ver si hay alguna variable que contenga el objeto nodo. Por ejemplo, ese es el caso para el template_preprocess_comment()
que se $variables['node']
ponen a disposición las funciones de preproceso para comentarios.
Cómo se hace en la página template_preprocess_page de Drupal Core :
Línea 2267 de theme.inc y en adelante:
if ($node = menu_get_object()) {
$variables['node'] = $node;
}
template_preprocess_page usa menu_get_object . Después de eso, solo es cuestión de verificar si el nodo está definido y obtener $ node-> nid.
Una cosa que debes tener cuidado es el alias de ruta.
drupal_get_normal_path($path)
para obtener la ruta actual use la variable del sistema $_SERVER["REQUEST_URI"]
(Si está en la página de nodo a la que puede llamar $node->uri['path']
, esto devolverá una ruta sin alias. Por otra parte, si está en la página de nodo, simplemente puede usar $node->nid
).
esto devolverá el nodo / XXXX
así que intenta algo como
$node_path = explode('/', drupal_get_normal_path($path));
$nid = $node_path[1];
arg(1);
No es una mala forma de hacerlo. arg () funciona en la ruta interna, por lo que no se verá afectado por los alias de ruta.
menu_get_object
(que simplemente se envuelve, menu_get_item
así que eso es igualmente bueno).
if (arg(0) == 'node' && is_numeric(arg(1)))
luego arg(1)
, casi al 99% le devolverá una ID de nodo. Pero un solo arg(1)
también podría devolverle muchas otras identificaciones.
En Drupal 8, puede obtener argumentos de URL basados en lo que está en el enrutamiento.
Para obtener la identificación solo:
$nid = \Drupal::routeMatch()->getRawParameter('node');
Si planea cargar el objeto de nodo, simplemente puede obtenerlo de esta manera:
$node = \Drupal::routeMatch()->getParameter('node');
Para encontrar los nombres de los parámetros, puede usar:
$possible_parameters = \Drupal::routeMatch()->getParameters();