Cara mendapatkan ID simpul di jQuery / JavaScript

8

Apakah ada cara universal dan pasti untuk melakukan ini? Misalnya menggunakan beberapa variabel lingkungan yang disertakan Drupal.behaviours?

Saya telah melakukan riset dan sepertinya tidak ada jawaban umum.

therobyouknow
sumber
Tidak ada variabel lingkungan seperti itu ... apa yang sebenarnya Anda maksud dengan 'get the idup drupal node'? Apa yang Anda klasifikasikan sebagai 'id simpul drupal' dalam konteks ini? ID node yang halaman lengkapnya Anda kunjungi?
Clive
ya, ID dari node yang halaman penuhnya saya aktifkan , misalnya seperti di mysite.com/node/6 Saya ingin jquery yang saya jalankan dari halaman ini untuk bisa mendapatkan id node dan memasukkannya ke dalam variabel, dalam contoh, ini akan memiliki nilai 6.
therobyouknow
Jika Anda menginginkan metode yang kuat, Anda harus melewati ID node dari sisi server secara manual menggunakan drupal_add_js(); nid tidak pernah digunakan pada sisi klien oleh inti sehingga tidak perlu ditambahkan sebagai pengaturan biasanya
Clive

Jawaban:

13

Seperti disebutkan di atas, inti Drupal tidak menggunakan ID node di sisi klien sehingga tidak melewatinya. jika Anda ingin akses ke sana, Anda harus menambahkannya secara manual:

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',
    );
  }
} 

Kemudian di sisi klien Anda akan memiliki akses ke sana melalui Drupal.settings:

var currentNid = Drupal.settings.MYMODULE.currentNid;
Clive
sumber
Terima kasih @Clive - sangat senang dengan solusi ini! Saya akan mencobanya. Ini akan membantu saya dengan upaya saya untuk memperbaiki masalah modul pop_links : Versi 7 Tidak Merekam Tautan . Saya akan menghargai Anda dengan bantuannya, jangan ragu untuk ikut campur. Temuan saya sejauh ini dengan modul ini adalah bahwa javascript yang mereka berikan tidak "memecat" dan seorang kolega telah memberikan perbaikan sementara berdasarkan classatribut dari tema bootstrap. Pada akhirnya kami bertujuan menuju solusi independen tema.
therobyouknow
Mungkin saya menyebutkan koreksi bekerja untuk kode Anda: harus baca: $setting = array('MYMODULE' => array('currentNid' => $node->nid));yang =adalah asing. Itu berhasil - menyematkan kode Anda ke fungsi ini yang sudah ada pop_linksdan menambahkan javascript Anda di pop_links.js.
therobyouknow
Ups, salah ketik - maaf soal itu :)
Clive
1
Memberi +1 pada jawaban Anda. Ini berfungsi dan telah memungkinkan saya untuk menyediakan perbaikan sementara untuk masalah pop_links di sini: drupal.org/node/1269290#comment-7625019
therobyouknow
1
PS memberi Anda solusi.
therobyouknow
5

Seperti yang disebutkan oleh MPD dalam jawabannya, bekerja dengan css-class default yang dihasilkan Drupal untuk elemen adalah solusi mudah yang berfungsi tanpa kode PHP khusus.

Inilah implementasi kami:

(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
sumber
ini juga berfungsi pada Drupal 8 jika Anda mengubah jalur ke var $body = $('body.path-node');(diuji dengan zurb_foundation untuk 8.x-6.x)
HongPong
3

Default template_preprocess_html()memiliki sedikit kode ini di

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);
    }
  }
}

Ini akan menempel pada kelas ke <body>garis elemen page-node-123. Jika Anda tidak ingin menggunakan kode Anda sendiri dalam modul khusus, Anda bisa mendapatkan kelas melalui jQuery , menemukan yang cocok page-node-, dan kemudian menguraikan nid.

mpdonadio
sumber
+1 Terima kasih atas masukan Anda @MPD yang perlu diketahui. Dalam kasus saya menambahkan hal-hal ke modul cocok untuk saya karena saya memperbaiki bug di modul pop_links - lihat komentar saya di bawah jawaban Clive. Jawaban Anda pasti akan berguna dalam skenario lain.
therobyouknow
1

Apa yang berhasil bagi saya adalah menambahkan baris berikut ke page.tpl.phptemplat saya . Ini menambahkan ID simpul window.Drupal.settings.nidyang dapat Anda gunakan sesuka hati dalam JavaScript.

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

Seperti yang disarankan dalam komentar, inilah kode untuk menambahkan ID simpul dari template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

    drupal_add_js(array('nid' => $node->nid),'setting'); 
  } 
}
Daniel Lefebvre
sumber
Mungkin lebih baik tambahkan baris itu template_preprocess_pagesebagai gantinya (jika Anda membutuhkannya di tingkat halaman). Untuk tidak mencampuradukkan dan menjaga template tetap bersih dan mudah dibaca. Templat harus digunakan untuk markup.
leymannx
Saya sudah melakukan itu juga pada build lain. Menambahkannya ke page.tpl.php adalah "retasan" yang cukup mudah bagi orang-orang yang terintimidasi oleh tema tersebut. Saran bagus, terima kasih :)
Daniel Lefebvre
Apakah itu kesalahan ketik di sana settingsdan setting?
leymannx
itu bukan ... itu melempar saya beberapa kali ... tapi "pengaturan" masuk drupal_add_js dan itu menciptakan window.Drupal.settings.whthing
Daniel Lefebvre