Como obter o ID do nó em jQuery / JavaScript


8

Existe uma maneira definitiva e universal de fazer isso? Por exemplo, usando alguma variável de ambiente que acompanha Drupal.behaviours?

Eu fiz algumas pesquisas e parece não haver uma resposta comum.


Não, não há variável de ambiente como essa ... o que exatamente você quer dizer com 'obter o ID do nó drupal'? O que você está classificando como 'o ID do nó drupal' neste contexto? O ID de um nó em que página inteira você está?
— Clive

sim, o ID de um nó cuja página inteira eu estou, por exemplo, como em mysite.com/node/6 Eu gostaria que o jquery que eu executei nesta página fosse capaz de obter o ID do nó e colocá-lo em uma variável, no exemplo, isso teria o valor 6.
— therobyouknow

Se você deseja um método robusto, precisará passar o ID do nó do lado do servidor manualmente usando drupal_add_js(); o nid não é sempre utilizada no lado do cliente por núcleo por isso não há necessidade para que possa ser adicionado como uma definição geralmente
— Clive

Respostas:


13

Como mencionado acima, o núcleo do Drupal não usa o ID do nó no lado do cliente, para que ele não seja transmitido. se você quiser acessar, precisará adicioná-lo manualmente:

function MYMODULE_node_view($node, $view_mode, $langcode) {
  if ($view_mode == 'full') {
    $setting = array('MYMODULE' => array('currentNid' => $node->nid));
    $node->content['#attached']['js'][] = array(
      'data' => $setting,
      'type' => 'setting',
    );
  }
} 

Em seguida, no lado do cliente, você terá acesso a ele através de Drupal.settings:

var currentNid = Drupal.settings.MYMODULE.currentNid;

Obrigado @Clive - muito feliz com esta solução! Vou experimentar. Isso me ajudará na minha tentativa de corrigir o problema do módulo pop_links : Versão 7 Não está gravando links . Vou lhe creditar a ajuda, fique à vontade para participar também. Minhas descobertas até agora com este módulo são que o javascript que eles fornecem não está "disparando" e um colega forneceu uma correção temporária com base em um classatributo do tema de inicialização. Por fim, estamos buscando uma solução independente de tema.
— Therobyouknow

Posso mencionar uma correção de trabalho no seu código: ele deve ler: $setting = array('MYMODULE' => array('currentNid' => $node->nid));o =é estranho. Isso fez o trabalho - inseriu seu código nessa função que já existia pop_linkse adicionou seu javascript pop_links.js.
— Therobyouknow

Oops, erro tipográfico - desculpe sobre isso :)
— Clive

11
+1 a propósito de sua resposta. Ele funciona e permitiu-me para fornecer uma correção temporária para pop_links emitir aqui: drupal.org/node/1269290#comment-7625019
— therobyouknow

11
PS creditou você na solução.
— Therobyouknow

5

Conforme mencionado pelo MPD em sua resposta, trabalhar com as classes css padrão que o Drupal gera para o elemento é uma solução fácil que funciona sem o código PHP personalizado.

Aqui está a nossa implementação:

(function($) {

  /**
   * Find Drupal Node ID based on <body> element classes.
   *
   * @return Node ID or false
   **/
  function getCurrentNodeId() {
    var $body = $('body.page-node');
    if ( ! $body.length )
      return false;
    var bodyClasses = $body.attr('class').split(/\s+/);
    for ( i in bodyClasses ) {
      var c = bodyClasses[i];
      if ( c.length > 10 && c.substring(0, 10) === "page-node-" )
        return parseInt(c.substring(10), 10);
    }
    return false;
  }


  /**
   * Example usage...
   *
   **/
  Drupal.behaviors.yourModuleNameHere = {
    var nodeId = getCurrentNodeId();
    if ( nodeId ) {
      // Node ID found.
      // ...do something with it.
    } else {
      // Node ID not found. Guess we are not on a node page
      // ...handle this case with care too. 
    }
  }

}(jQuery);

Isso também funciona em Drupal 8 se você mudar uma linha para var $body = $('body.path-node');(testado com zurb_foundation para 8.x-6.x)
— HongPong

3

O padrão template_preprocess_html()tem esse bit de código em

if ($suggestions = theme_get_suggestions(arg(), 'page', '-')) {
  foreach ($suggestions as $suggestion) {
    if ($suggestion != 'page-front') {
      // Add current suggestion to page classes to make it possible to theme
      // the page depending on the current page type (e.g. node, admin, user,
      // etc.) as well as more specific data like node-12 or node-edit.
      $variables['classes_array'][] = drupal_html_class($suggestion);
    }
  }
}

Isso permanecerá nas classes na <body>linha do elemento page-node-123. Se você não quiser usar seu próprio código em um módulo personalizado, poderá obter as classes via jQuery , encontrar o que corresponde page-node-e analisar o nid.


+1 Obrigado pela sua contribuição @MPD que vale a pena conhecer. No meu caso, adicionar coisas a um módulo combina comigo, pois estou corrigindo um bug no módulo pop_links - veja meu comentário abaixo da resposta de Clive. Sua resposta será, sem dúvida, útil em outros cenários.
— Therobyouknow

1

O que funcionou para mim foi adicionar a seguinte linha ao meu page.tpl.phpmodelo. Isso inclui o ID do nó no window.Drupal.settings.nidqual você pode usar à vontade em JavaScript.

drupal_add_js(array('nid' => $node->nid), 'setting');

Conforme sugerido nos comentários, aqui está o código para adicionar o ID do nó de template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

    drupal_add_js(array('nid' => $node->nid),'setting'); 
  } 
}

Talvez seja melhor adicionar essa linha template_preprocess_page(se você precisar no nível da página). Para não confundir as coisas e manter os modelos o mais limpos e legíveis possível. Modelos devem ser usados ​​para marcação.
— Leymannx

Eu fiz isso também em outras versões. Adicioná-lo ao page.tpl.php é um "hack" bastante fácil para as pessoas que são intimidadas pelo tema. Boa sugestão, obrigado :)
— Daniel Lefebvre

Isso é um erro de digitação settingse setting?
— Leymannx #

não é ... ele me jogou algumas vezes ... mas "configuração" vai nos drupal_add_js e cria window.Drupal.settings.whatever
— Daniel Lefebvre
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.