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.

therobyouknow
fonte
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;
Clive
fonte
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);
gue
fonte
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.

mpdonadio
fonte
+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'); 
  } 
}
Daniel Lefebvre
fonte
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