Drupal10升级:如何升级Drupal中的自定义模块和自定义主题

这完全取决于我们,我们编写了Drupal10的自定义代码,这使我们有责任维护Drupal10。

upgrade status模块为我们提供了一份关于每个自定义项目的漂亮报告,以及它认为需要进行哪些更改才能使代码更新以使用Drupal 10

我们没有太多的自定义模块代码,而且我们拥有的代码非常简单、标准,这使得我们开发的Drupal系统的升级更加容易。

然而,我们在Drupal10中的自定义主题是另一回事:我们有一些jQuery的用法需要删除一次,而且我们有很多自定义的Twig PHP类正在扩展不推荐使用的类。没有什么能停止,但有几件事值得做,值得更详细地介绍。

1、jQuery once

jQueryonce插件在Drupal10中已经不再是核心,所以我们需要升级正在使用它的javascript,以使用Drupal9中提供替代品:jQuery once。这很简单,我们可以这样重写代码:

(function($) {
  Drupal.behaviors.smoothScroll = {
    attach: function (context, settings) {
      $('a[href*="#"]:not([href="#"])').once('smoothscroll').click(function() {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
          var target = $(this.hash);
          target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
          if (target.length) {
            var offset_height = target.offset().top;
            $('html, body').stop().animate({
              scrollTop: offset_height ,
            }, 1000);
            return false;
          }
        }
      });
    }
  };
})(jQuery);

替换为这样的代码:

(function($, Drupal, once) {
  Drupal.behaviors.smoothScroll = {
    attach: function (context, settings) {
      var elements = once('smoothscroll', 'a[href*="#"]:not([href="#"])', context);
      $(elements).click(function() {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') && location.hostname == this.hostname) {
          var target = $(this.hash);
          target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
          if (target.length) {
            var offset_height = target.offset().top;
            $('html, body').stop().animate({
              scrollTop: offset_height ,
            }, 1000);
            return false;
          }
        }
      });
    }
  };
})(jQuery, Drupal, once);

然后,我们需要在相应的.libraries.yml文件中调整库的定义,以删除对core/jquery.once的依赖,并添加core/one。

2、Twig变化

如前所述,该网站最初是在Drupal 8中构建的,这意味着使用Twig1,因此要为Drupal 10准备好代码库,需要注意大量的弃用。

这在很大程度上是因为我们有一个稍微奇怪的设置,即我们使用Emulsify的早期版本来构建我们的主题。对于本文来说,最重要的是,这意味着我们的主题包含了相当多的类似于这样的函数:

<?php
/**
 * @file
 * Add "getUniqueId" function for Pattern Lab.
 *
 * Brings the useful Drupal Html::getUniqueId function in.
 */

use Drupal\Component\Utility\Html;

/**
 * Create the function we want to be able to call.
 *
 * Our function will be passed $context and then any other values provided.
 */
$function = new Twig_SimpleFunction('getUniqueId', function ($context, $string) {
  if (is_string($string)) {
    // Must cover the Drupal context AND the PatternLab context.
    if (class_exists('Drupal')) {
      return Html::getUniqueId($string);
    }
    else {
      return $string;
    }
  }
  else {
    return $string;
  }
}, ['needs_context' => TRUE, 'is_safe' => ['html']]);

这很容易变成(更改扩展的基类):

<?php
/**
 * @file
 * Add "getUniqueId" function for Pattern Lab.
 *
 * Brings the useful Drupal Html::getUniqueId function in.
 */

use Drupal\Component\Utility\Html;

/**
 * Create the function we want to be able to call.
 *
 * Our function will be passed $context and then any other values provided.
 */
$function = new \Twig\TwigFunction('getUniqueId', function ($context, $string) {
  if (is_string($string)) {
    // Must cover the Drupal context AND the PatternLab context.
    if (class_exists('Drupal')) {
      return Html::getUniqueId($string);
    }
    else {
      return $string;
    }
  }
  else {
    return $string;
  }
}, ['needs_context' => TRUE, 'is_safe' => ['html']]);

代码库中有大约20种不推荐使用的Twig类,但任务看起来足够简单,这里没有什么特别棘手的事情要做,只需根据旧类中的不推荐消息调整使用的类即可。有一些自动化工具可以为您做出这些更改,但说实话,没有那么多更改可做,我很想更全面地了解代码库,并了解其中的内容!

3、Drupal10升级全部完成了

自定义代码和主题就是这样。事实上,我们非常擅长:

1、除非迫不得已,否则不会编写自定义代码。

2、如果我们确实编写了自定义代码,而不是使用已经弃用的代码。

3、定期返回并修复新的折旧。

这使得这些改变变得非常简单。

Drupal10升级心得:我只需要注意,我们的代码库中有很多jQuery风格的JavaScript。。。。主要是因为我们已经使用jQuery学习了一段时间的JavaScript,所以我们仍然很容易在任何地方使用jQuery进行编写。然而,我们知道我们需要到达一个不需要jQuery的地方,我们会到达那里,但我们需要进行一些内部培训,然后在没有jQuery的情况下重新编写代码。也许有一天我也会写一篇关于这方面的文章!