📜  drupal 8 从路径别名获取节点 - Javascript (1)

📅  最后修改于: 2023-12-03 15:14:48.183000             🧑  作者: Mango

Drupal 8:从路径别名获取节点 - JavaScript 主题

当在 Drupal 8 中使用路径别名设置时,我们需要通过 pathauto 模块来为节点创建路径别名。这种方式可以极大地提高网站的用户体验和 SEO。

但有时候我们需要在自定义模块或者主题中获取节点,我们需要知道这个节点的节点 ID。那么该如何从一个路径别名中获取节点 ID 呢?在本文中,我们将介绍如何在 Drupal 8 主题中使用 JavaScript 从路径别名中获取节点。

步骤一:通过 Drupal.behaviors 实现 JavaScript 代码的执行

首先,我们需要在 your_theme_name.libraries.yml 文件中定义我们的 JavaScript 库。

my-theme-libraries:
  version: 1.x
  js:
    js/custom.js: {}
  dependencies:
    - core/jquery

然后我们在 your_theme_name.info.yml 文件中包含刚刚定义的 JS 库。

libraries:
  - 'your_theme_name/my-theme-libraries'

接下来,我们需要编写一个 JavaScript 代码,用于获取路径别名并获取对应节点的节点 ID。我们可以通过在 Drupal.behaviors 对象上定义方法来实现代码的执行。这样我们就可以确保这个代码将在页面加载后执行。

(function ($, Drupal) {
  'use strict';

  Drupal.behaviors.nodeFromPathAlias = {
    attach: function (context, settings) {
      // 获取当前路径别名
      var pathAlias = window.location.pathname.replace(/^\//,"");

      // 使用 Drupal.ajax 方法发送 GET 请求,获取节点 ID
      var response = Drupal.ajax({ 
        url: '/system/path/ajax/' + pathAlias,
        method: 'get',
        async: false,
        dataType: 'json',
      }).execute().responseText;

      // 提取节点 ID,如果是数字,则表示存在对应节点
      var nodeId = parseInt(response);
      if ( !isNaN(nodeId) ) {
        console.log("节点 ID 为", nodeId);
      } else {
        console.log("找不到路径别名对应的节点");
      }
    }
  };

})(jQuery, Drupal);
步骤二:在页面中加载 JavaScript 代码

最后,我们需要确保该 JavaScript 代码在页面中被加载。我们可以通过将 JavaScript 代码插入到 HTML 的 head 标签中来实现该目的。我们可以使用 Drupal 8 的 hook_preprocess_html 钩子来实现该操作。

function your_theme_name_preprocess_html(&$variables) {
  // 添加 JS 代码到 $head 栏位
  $variables['head_elements']['my_custom_script'] = [
    '#tag' => 'script',
    '#attributes' => [
      'src' => sprintf('%s/js/custom.js', $variables['base_path']),
      'type' => 'text/javascript'
    ]
  ];
}

现在,我们就可以在页面中获取当前路径别名对应的节点 ID 了。

我们可以将代码片段总结为以下步骤:

  1. your_theme_name.libraries.yml 文件定义 JavaScript 库
  2. your_theme_name.info.yml 文件打包刚刚定义的 JS 库
  3. 编写 JavaScript 代码,通过 Drupal.ajax 方法获取路径别名对应的节点 ID。
  4. hook_preprocess_html 钩子中,将 JavaScript 代码插入到 HTML 的 head 标签中
  5. 执行 JavaScript 代码,获取节点 ID

这样我们就完成了通过 JavaScript 从路径别名获取节点的教程。