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?
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?
Respostas:
Não tenho muita certeza de qual é a diferença entre eles.
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. node_load
) a ser chamada para carregar um objeto correspondente a uma parte do caminho atualdrupal_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.
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.
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];
arg(1);
Não é uma maneira ruim de fazê-lo. arg () funciona no caminho interno, portanto não será afetado pelos aliases do caminho.
menu_get_object
(o que envolve apenas menu_get_item
isso é 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.
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();