Cách lấy ID nút trong jQuery / JavaScript


8

Có một cách dứt khoát, phổ quát để làm điều này? Ví dụ sử dụng một số biến môi trường đi kèm Drupal.behaviours?

Tôi đã thực hiện một số nghiên cứu và dường như không có câu trả lời chung.


Không có biến môi trường nào như vậy ... chính xác ý bạn là gì khi 'lấy id nút drupal'? Bạn đang phân loại là 'id nút drupal' trong ngữ cảnh này là gì? ID của một nút có trang đầy đủ bạn đang ở trên?
Clive

vâng, ID của một nút có trang đầy đủ Tôi đang trên, ví dụ như trong mysite.com/node/6 Tôi muốn các jquery tôi thực hiện từ trang này để có thể có được id nút và đặt nó vào một biến, trong ví dụ này, giá trị này sẽ có giá trị là 6.
trị liệu

Nếu bạn muốn một phương thức mạnh mẽ, bạn sẽ phải truyền ID nút từ phía máy chủ theo cách thủ công drupal_add_js(); nid không bao giờ được sử dụng ở phía máy khách bởi vì vậy không cần thêm nó vào cài đặt như thường lệ
Clive

Câu trả lời:


13

Như đã đề cập ở trên, lõi Drupal không được sử dụng cho ID nút ở phía máy khách nên nó không vượt qua được. nếu bạn muốn truy cập vào nó, bạn sẽ cần thêm nó bằng tay:

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

Sau đó, về phía khách hàng, bạn sẽ có quyền truy cập thông qua Drupal.settings:

var currentNid = Drupal.settings.MYMODULE.currentNid;

Cảm ơn @Clive - rất hài lòng với giải pháp này! Tôi sẽ thử nó. Nó sẽ giúp tôi với nỗ lực khắc phục sự cố mô-đun pop_links : Phiên bản 7 Không liên kết ghi . Tôi sẽ tín dụng cho bạn với sự giúp đỡ, cảm thấy thoải mái để chip quá. Phát hiện của tôi cho đến nay với mô-đun này là javascript mà họ cung cấp không "khai hỏa" và một đồng nghiệp đã cung cấp bản sửa lỗi tạm thời dựa trên một classthuộc tính từ chủ đề bootstrap. Cuối cùng, chúng tôi đang hướng tới một giải pháp độc lập chủ đề.
trị liệu

Tôi có thể đề cập đến một sự điều chỉnh làm việc để mã của bạn: nó nên đọc: $setting = array('MYMODULE' => array('currentNid' => $node->nid));sự =là không liên quan. Điều đó đã thực hiện công việc - đã xử lý mã của bạn vào chức năng này đã tồn tại pop_linksvà thêm javascript của bạn vào pop_links.js.
trị liệu

Rất tiếc, lỗi đánh máy - xin lỗi về điều đó :)
Clive

1
+1 bằng cách cho câu trả lời của bạn. Nó hoạt động và đã cho phép tôi cung cấp bản sửa lỗi tạm thời cho sự cố pop_links tại đây: drupal.org/node/1269290#comment-7625019
trị liệu

1
PS ghi có cho bạn giải pháp.
trị liệu

5

Như MPD đã đề cập trong câu trả lời của mình, làm việc với các lớp css mặc định mà Drupal tạo cho phần tử là một giải pháp dễ dàng hoạt động mà không cần mã PHP tùy chỉnh.

Đây là cách thực hiện của chúng tôi:

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

điều này cũng hoạt động trên Drupal 8 nếu bạn thay đổi một dòng thành var $body = $('body.path-node');(được thử nghiệm với zurb_foundation cho 8.x-6.x)
HongPong

3

Mặc định template_preprocess_html()có bit mã này trong

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

Điều này sẽ dính vào các lớp cho <body>dòng phần tử page-node-123. Nếu bạn không muốn sử dụng mã của riêng mình trong một mô-đun tùy chỉnh, bạn có thể lấy các lớp thông qua jQuery , tìm mã phù hợp page-node-và sau đó phân tích cú pháp.


+1 Cảm ơn bạn đã biết @MPD. Trong trường hợp của tôi, việc thêm công cụ vào một mô-đun phù hợp với tôi khi tôi đang sửa một lỗi trong mô-đun pop_links - xem nhận xét của tôi bên dưới câu trả lời của Clive. Câu trả lời của bạn sẽ, không nghi ngờ gì, sẽ hữu ích trong các tình huống khác.
trị liệu

1

Những gì đã làm việc cho tôi là thêm dòng sau vào page.tpl.phpmẫu của tôi . Điều này thêm ID nút window.Drupal.settings.nidmà bạn có thể sử dụng theo ý muốn trong JavaScript.

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

Như được đề xuất trong các bình luận, đây là mã để thêm ID nút từ template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

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

Có thể tốt hơn là thêm dòng template_preprocess_pageđó vào thay thế (nếu bạn cần nó ở cấp độ trang). Để không trộn lẫn mọi thứ và giữ cho các mẫu càng sạch và dễ đọc càng tốt. Mẫu nên được sử dụng để đánh dấu.
leymannx

Tôi đã làm điều đó cũng như trên các bản dựng khác. Thêm nó vào page.tpl.php là một "hack" khá dễ dàng cho những người bị đe dọa bởi chủ đề này. Đề nghị tốt, cảm ơn bạn :)
Daniel Lefebvre

Đó có phải là một lỗi đánh máy ở đó settingssetting?
leymannx

nó không ... nó đã ném tôi vài lần ... nhưng "thiết lập" đi vào drupal_add_js và nó tạo ra cửa sổ.Drupal.sinstall.whthing
Daniel Lefebvre
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.