Como obtenho o ID do nó da URL?

47

Até agora, deparei-me com essas três funções no Drupal 7, mas não tenho muita certeza de qual é a diferença entre elas e qual é mais apropriada para obter o ID do nó em uma função de pré-processo de bloco.

Você pode me dar alguma ideia?

silkAdmin
fonte
Você está fazendo isso no node.tpl.php ou algo assim? Se sim, você pode usar $ node-> nid.
Bart
Não, estou fazendo isso em uma função de pré-processamento de bloco, embora o bloco seja impresso na página do nó.
silkAdmin

Respostas:

63

Não tenho muita certeza de qual é a diferença entre eles.

  • menu_get_object () retorna o objeto associado à página atualmente exibida. Se o código for executado quando o Drupal estiver mostrando a página example.com/node/1, menu_get_object()retornará o objeto do nó cujo ID é 1; se a página exibida for example.com/user/1, menu_get_object('user')retornará o objeto de usuário para o usuário cujo ID é 1.
  • menu_get_item () retorna uma matriz que contém um índice para cada campo contido na tabela "menu_router". Isso inclui:
    • path: o caminho atual do retorno de chamada do menu
    • load_functions: uma matriz de nomes de funções (como node_load) a ser chamada para carregar um objeto correspondente a uma parte do caminho atual
    • access_callback: o retorno de chamada que verifica se o usuário conectado no momento tem acesso ao item de menu
    • page_callback: o nome da função que renderiza a página
    • title: o título da página associada ao item de menu
  • drupal_lookup_path () é a função que retorna o caminho interno associado ao alias passado como argumento. Se "homepage" for o alias associado a example.com/node/1, ele drupal_lookup_path("homepage")retornará "node/1". Os aliases de caminho podem ser associados a qualquer caminho interno, não apenas aos caminhos do nó.

e qual é mais apropriado para obter o ID do nó em uma função de pré-processo do bloco.

Se tudo o que você deseja obter é o ID do nó mostrado atualmente, basta usar o seguinte código:

if (arg(0) == 'node') {
  $nid = arg(1);
}

Se você precisar obter o objeto nó, poderá usar o seguinte código:

if ($node = menu_get_object()) {
  // Use the node object.
}

Desses fragmentos, o segundo é melhor, pois retorna o objeto de nó correto para caminhos internos, como node / 1 / revisions / 3 / view.

Lembre-se de que algumas funções de pré-processamento, como as da página ou do nó, já possuem um $variables['node']. Isso significa que, nesses casos, você só precisa usar o seguinte snippet na sua função de pré-processo, sem se preocupar com qual função usar.

if (isset($variables['node'])) {
  // Check the node ID or other properties.
}

Para outras funções de pré-processo, verifique a documentação para ver se há alguma variável que contenha o objeto nó. Por exemplo, esse é o caso para o template_preprocess_comment()qual $variables['node']disponibiliza as funções de pré-processo para comentários.

kiamlaluno
fonte
7

Como isso é feito na template_preprocess_page do Drupal Core :

Linha 2267 do theme.inc e seguintes:

if ($node = menu_get_object()) {
    $variables['node'] = $node;
}

template_preprocess_page usa menu_get_object . Depois disso, basta verificar se o nó está definido e obter $ node-> nid.

Bart
fonte
4

Uma coisa que você deve ter cuidado é o alias do caminho.

drupal_get_normal_path($path)

para obter o caminho atual, use a variável do sistema $_SERVER["REQUEST_URI"]

(Se você estiver na página do nó para a qual você pode ligar $node->uri['path'], isso retornará um caminho sem alias. Então, novamente, se você estiver na página do nó, poderá usar apenas $node->nid.)

isso retornará o nó / XXXX

então tente algo como

  $node_path = explode('/', drupal_get_normal_path($path));
  $nid = $node_path[1];
iStryker
fonte
3
arg(1);

Não é uma maneira ruim de fazê-lo. arg () funciona no caminho interno, portanto não será afetado pelos aliases do caminho.

Jeremy French
fonte
Isso é verdade, não será afetado por aliases de caminho. Mas se você estiver no nó / XXXXX, poderá usar apenas $ node-> nid. @ Francês, onde mais você usaria arg (1) e retornaria o que deseja?
IStryker
se você estiver em um gancho de módulo, não terá acesso ao nó. Os argumentos de visualizações também podem ser um exemplo.
Jeremy French
graças Jeremy e istryker, eu atualizei a minha pergunta que poderia ser mais clara .. Embora eu vou tentar ambas as soluções, graças
silkAdmin
1
É uma péssima idéia usar arg (), você está se vinculando a um caminho, use menu_get_object(o que envolve apenas menu_get_itemisso é igualmente bom).
if (arg(0) == 'node' && is_numeric(arg(1)))então arg(1), para quase 99%, você retornará um ID do nó. Mas um único arg(1)também pode retornar muitos outros IDs.
Leymannx # 6/17
2

No Drupal 8, você pode obter argumentos de URL com base no conteúdo do roteamento.

Para obter o ID sozinho:

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

Se você planeja carregar o objeto nó, você pode simplesmente obtê-lo desta maneira:

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

Para encontrar os nomes dos parâmetros, você pode usar:

$possible_parameters = \Drupal::routeMatch()->getParameters();
oknate
fonte