Как получить идентификатор узла в jQuery / JavaScript

8

Есть ли определенный, универсальный способ сделать это? Например, используя некоторую переменную окружения, которая идет с Drupal.behaviours?

Я провел некоторое исследование, и, похоже, нет общего ответа.

therobyouknow
источник
Нет, такой переменной окружения нет ... что именно вы имеете в виду под «получить идентификатор узла drupal»? Что вы классифицируете как «идентификатор узла drupal» в этом контексте? Идентификатор узла, на полной странице которого вы находитесь?
Клайв
да, идентификатор узла, на полной странице которого я нахожусь, например, как на mysite.com/node/6, я хотел бы, чтобы jquery, который я выполняю на этой странице, мог получить идентификатор узла и поместить его в переменную, в примере это будет иметь значение 6.
therobyouknow
Если вам нужен надежный метод, вам придется вручную передавать идентификатор узла со стороны сервера drupal_add_js(); nid никогда не используется на стороне клиента ядром, поэтому нет необходимости добавлять его в качестве параметра обычно
Clive

Ответы:

13

Как уже упоминалось выше, ядро ​​Drupal не использует идентификатор узла на стороне клиента, поэтому оно не проходит через него. если вы хотите получить к нему доступ, вам нужно добавить его вручную:

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

Тогда на стороне клиента вы получите доступ к нему через Drupal.settings:

var currentNid = Drupal.settings.MYMODULE.currentNid;
Клайв
источник
Спасибо @Clive - очень доволен этим решением! Я это попробую. Это поможет мне исправить ошибку модуля pop_links : версия 7 Not Recording Links . Я буду признателен вам за помощь, не стесняйтесь скинуться тоже. Мои выводы, сделанные на данный момент в отношении этого модуля, заключаются в том, что предоставляемый ими javascript не является «запущенным», и коллега предоставил временное исправление, основанное на classатрибуте из темы начальной загрузки. В конечном итоге мы стремимся к решению, не зависящему от темы.
therobyouknow
Могу ли я упомянуть рабочую коррекцию кода: он должен прочитать: это постороннее. Это сделало свою работу - прикрепил ваш код к этой функции, которая уже существовала, и добавил ваш JavaScript . $setting = array('MYMODULE' => array('currentNid' => $node->nid));=pop_linkspop_links.js
therobyouknow
К сожалению, опечатка - извините за это :)
Клайв
1
+1 кстати за ваш ответ. Это работает и позволило мне предоставить временное исправление для проблемы pop_links здесь: drupal.org/node/1269290#comment-7625019
therobyouknow
1
PS зачислил вас на решение.
therobyouknow
5

Как упомянул MPD в своем ответе, работа с css-классами по умолчанию, сгенерированными Drupal для элемента, является простым решением, которое работает без специального PHP-кода.

Вот наша реализация:

(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
источник
это также работает в Drupal 8, если вы измените строку на var $body = $('body.path-node');(протестировано с zurb_foundation для 8.x-6.x)
HongPong,
3

По умолчанию template_preprocess_html()этот бит кода в

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

Это будет привязывать классы к <body>строке элемента page-node-123. Если вы не хотите использовать свой собственный код в пользовательском модуле, вы можете получить классы через jQuery , найти тот, который соответствует page-node-, и затем проанализировать nid.

mpdonadio
источник
+1 Спасибо за ваш вклад @MPD стоит знать. В моем случае добавление материала в модуль меня устраивает, так как я исправляю ошибку в модуле pop_links - см. Мой комментарий ниже ответа Клайва. Ваш ответ, без сомнения, будет полезен в других сценариях.
therobyouknow
1

Для меня сработало добавление следующей строки в мой page.tpl.phpшаблон. Это добавляет идентификатор узла, window.Drupal.settings.nidкоторый вы можете использовать по желанию в JavaScript.

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

Как предлагается в комментариях, вот код для добавления идентификатора узла из template.php:

function MYTHEME_preprocess_page(&$variables, $hook) {

  if ($node = menu_get_object()) {

    drupal_add_js(array('nid' => $node->nid),'setting'); 
  } 
}
Даниэль Лефевр
источник
Может быть, лучше добавить эту строку template_preprocess_pageвместо (если вам нужно на уровне страницы). Чтобы не путать вещи и держать шаблоны как можно более чистыми и читаемыми. Шаблоны должны быть использованы для разметки.
Leymannx
Я сделал это также на других сборках. Добавление его в page.tpl.php - довольно легкий «взлом» для людей, которых пугает тема. Хорошее предложение, спасибо :)
Даниэль Лефевр
Это опечатка там settingsи setting?
Leymannx
это не ... это бросило меня несколько раз ... но "установка" идет в drupal_add_js, и это создает окно. Drupal.settings.wh what
Daniel Lefebvre