Дата релиза: 2 декабря 2020
Активная поддержка до: 2 июня 2021
Поддержка безопасности до: ноябрь 2021
¶Cache::merge* методы теперь принимают неограниченное кол-во аргументов
Следующие методы теперь принимают неограниченное количество аргументов:
-
\Drupal\Core\Cache\Cache::mergeTags() -
\Drupal\Core\Cache\Cache::mergeMaxAges() -
\Drupal\Core\Cache\Cache::mergeContexts()
¶Пример
Имеем следующие кеш-теги:
$cache_tags_foo = ['foo'];
$cache_tags_bar = ['foo', 'bar'];
$cache_tags_baz = ['baz'];Как было ранее:
$merge_tags = \Drupal\Core\Cache\Cache::mergeTags(\Drupal\Core\Cache\Cache::mergeTags($cache_tags_foo, $cache_tags_bar), $cache_tags_baz);Новый вариант №1:
$merge_tags = \Drupal\Core\Cache\Cache::mergeTags($cache_tags_foo, $cache_tags_bar, $cache_tags_baz);Новый вариант №2:
$args = [$cache_tags_foo, $cache_tags_bar, $cache_tags_baz];
$merge_tags = \Drupal\Core\Cache\Cache::mergeTags(...$args);
¶Добавлен новый сервис user.flood_control и соответствующие события
Модуль User теперь будет отвечать со статусом HTTP 403 если попытка авторизации заблокирована flood control.
В дополнение, добавлен новый сервис user.flood_control, который построен поверх сервиса flood. Данный сервис вызывает новые события:
-
UserEvents::FLOOD_BLOCKED_IP: Событие вызывается когда авторизация заблокирована на уровне IP. -
UserEvents::FLOOD_BLOCKED_USER: Событие вызывается когда авторизация заблокирована по причине того что пользователь, под которым пытаются авторизоваться, заблокирован.
По умолчанию, данные события используются для добавления соответствующих записей в журнал системы.
¶Connection::prepareQuery и Connection::prepare помечены устаревшими
Connection::prepareQuery и Connection::prepare помечены устаревшими. Новые замены:
-
Connection::prepareQueryзаменён наConnection::prepareStatement. -
Connection::prepareзаменён на PDO::prepare.
Данное изменение задевает только разработчиков модулей, предоставляющих новые драйвера БД.
Раньше:
// $query is the query as a SQL string.
\Drupal\Core\Database\Connection->prepareQuery($query);
\Drupal\Core\Database\Connection->prepare($query);Теперь:
// $options are the query options.
\Drupal\Core\Database\Connection->prepareStatement($query, $options);
// For the possible $driver_options, see: https://www.php.net/manual/en/pdo.prepare.php
\PDO::prepare($query, $driver_options);
¶Глобальные константы bootstrap.inc, относящиеся к PHP, помечены устаревшими
Для минимизации подключения файлов с глобальными константами, четыре глобальные константы относящиеся к PHP перенесены в Drupal.
- Вместо
DRUPAL_MINIMUM_PHPиспользуйте\Drupal::MINIMUM_PHP. - Вместо
DRUPAL_MINIMUM_SUPPORTED_PHPиспользуйте\Drupal::MINIMUM_SUPPORTED_PHP. - Вместо
DRUPAL_RECOMMENDED_PHPиспользуйте\Drupal::RECOMMENDED_PHP. - Вместо
DRUPAL_MINIMUM_PHP_MEMORY_LIMITиспользуйте\Drupal::MINIMUM_PHP_MEMORY_LIMIT.
¶Зависимость ядра symfony-cmf/routing помечена устаревшей
Зависимость ядра symfony-cmf/routing помечена устаревшей. Следующие классы и интерфейсы заменены собственной реализацией в ядре:
-
\Symfony\Cmf\Component\Routing\RouteObjectInterfaceзаменён на\Drupal\Core\Routing\RouteObjectInterface. -
\Symfony\Cmf\Component\Routing\RouteProviderInterfaceзаменён на\Drupal\Core\Routing\RouteProviderInterface. -
\Symfony\Cmf\Component\Routing\LazyRouteCollectionзаменён на\Drupal\Core\Routing\LazyRouteCollection.
Обратите внимание на то, что константа RouteObjectInterface::ROUTE_NAME теперь предоставляется \Drupal\Core\Routing\RouteObjectInterface.
Методы getRoutesPaged() и getRoutesCount() предоставляемые \Drupal\Core\Routing\RouteProvider помечены устаревшими и будут удалены в Drupal 10.
¶Изменения в системе событий Symfony
- #3055194, #3055198, #3153803
- Simpler event dispatching (англ.), Symfony.
Сигнатура метода Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher::dispatch() была обновлена для соответствия Symfony\Component\EventDispatcher\EventDispatcherInterface::dispatch(). Это значит, что теперь для вызова события, первым аргументом передаётся объект события, а его название вторым.
Это позволяет вызывать событие без передачи названия события. Например:
// Было
$dispatcher->dispatch(MyEvents::EVENT_NAME, new MyEvent());
// Стало
$dispatcher->dispatch(new MyEvent());Из этого изменения также следует то, что теперь можно подписываться не на конкретные события, а также на объекты событий. Например:
public static function getSubscribedEvents() {
return [
// Было
MyEvents::EVENT_NAME => 'onMyEvent',
// Стало
MyEventName::class => 'onMyEvent',
];
}В связи с этим, класс события Symfony\Component\EventDispatcher\Event помечен устаревшим и вместо него используется Symfony\Contracts\EventDispatcher\Event при создании своих событий.
Для поддержки двух вариантов, в Drupal добавлен собственный класс Drupal\Component\EventDispatcher\Event. Его рекомендуется использовать вместо старого и нового от Symfony. В таком случае, чтобы обновить код, вам всего лишь потребуется заменить в use строке файла события Symfony на Drupal.
// Было
use Symfony\Component\EventDispatcher\Event;
// Стало
use Drupal\Component\EventDispatcher\Event;
¶Использование Drupal::theme() заменено на DI в ViewEditForm и HtmlRenderer
В классах ViewEditForm и HtmlRenderer использование \Drupal::theme() заменено на Dependency Injection, в связи с чем, в конструкторе появился новый аргумент.
¶Изменена сигнатура конструктора LayoutBuilder и добавлено новое событие LayoutBuilderEvents::PREPARE_LAYOUT
Класс LayoutBuilder теперь принимает EventDispatcherInterface $event_dispatcher вместо LayoutTempstoreRepositoryInterface $layout_tempstore_repository. Также удалено внедрение messenger сервиса.
Раньше:
public function __construct(array $configuration, $plugin_id, $plugin_definition, LayoutTempstoreRepositoryInterface $layout_tempstore_repository, MessengerInterface $messenger) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $layout_tempstore_repository, $messenger);
}Теперь:
public function __construct(array $configuration, $plugin_id, $plugin_definition, EventDispatcherInterface $event_dispatcher) {
parent::__construct($configuration, $plugin_id, $plugin_definition, $event_dispatcher);
}Также было добавлено новое событие LayoutBuilderEvents::PREPARE_LAYOUT которое вызывается в момент подготовки макета и передаёт Drupal\layout_builder\Event\PrepareLayoutEvent в качестве события. Это событие позволяет модулям взаимодействовать между собой в процессе #pre_render элемента.
¶Заголовок ответа теперь содержит X-Drupal-Cache-Max-Age
Теперь, при включении отладки для сайта, будет дополнительно добавляться заголовок X-Drupal-Cache-Max-Age к ответу. Данный заголовок будет содержать в качестве значения минимальное значение max-age среди всех рендер массивов отображаемых на странице.
¶Настройки ядра теперь могут быть помечены как устаревшие
Для того чтобы пометить настройку ядро устаревшей необходимо добавить информацию в массив Settings::$deprecatedSettings.
В качестве ключа должно быть название устаревшей настройки, а в качестве значения массив:
-
replacement: Название новой настройки, что заменяет устаревшую. -
message: Сообщение выводимое при использовании старой настройки.
Пример:
private static $deprecatedSettings = [
'old_setting' => [
'replacement' => 'new_setting',
'message' => 'The "old_setting" setting is deprecated in drupal:9.1.0 and is removed from drupal:10.0.0. Use "new_setting" instead. See https://www.drupal.org/node/CR-NID.',
],
];
¶Библиотекам теперь указывается прямой путь на файл лицензии
Все пути до лицензий в core.libraries.yml заменены на прямые адреса. Таким образом, по адресу будет открываться только содержание лицензии.
Ранее:
url: https://github.com/jquery/jquery-ui/blob/1.12.1/LICENSE.txtТеперь:
url: https://raw.githubusercontent.com/jquery/jquery-ui/1.12.1/LICENSE.txtКонтрибным и собственным решениям рекомендуется делать подобным образом.
¶Создание экземпляров Drupal\Core\Database\Query\Condition через new помечено устаревшим
Создание экземпляров Drupal\Core\Database\Query\Condition при помощи new помечено устаревшим. Экземпляр необходимо создавать через вызов метода Drupal\Core\Database\Connection::condition(). Это связано с тем что для различных типов БД, могут быть разные Condition объекты.
Ранее:
use Drupal\Core\Database\Query\Condition;
$condition = new Condition('OR');Теперь:
use Drupal\Core\Database\Database;
$condition = Database::getConnection()->condition('OR');
¶Функция user_password() заменена новым сервисом password_generator
Функция user_password() помечена устаревшей, взамен добавлен новый сервис passowrd_generator.
Ранее:
user_password()Теперь:
\Drupal::service('password_generator')->generate()
¶Добавлен новый класс Drupal\jsonapi\CacheableResourceResponse
В предыдущих версиях JSON:API возвращал объекты ResourceResponce на все запросы, при этом он реализует CacheableResponseInterface, даже для ответов которые не должны кешироваться. Это могло приводить к фатальным ошибкам при определённых условиях.
Сейчас JSON:API конкретизирует ответы что кешируются и не кешируются, в связи с этим представлен новый класс CacheableResourceResponse. Данный класс реализует CacheableResponseInterface. Таким образом ResourceResponce более не реализует CacheableResponseInterface.
ResourceResponce помечен для внутреннего использования и у вас не должно быть кода который может задеть данное изменение. Тем не менее, если по каким-то причинам ваш код полагается на данные классы, пожалуйста, произведите рефакторинг кода с использованием нового CacheableResourceResponse (это касается ответов HEAD, OPTIONS и GET).
¶Добавлено новое исключение \Drupal\Core\Queue\DelayedRequeueException
Новое исключение DelayedRequeueException позволяет обработчику очереди откладывать дальнейшую обработку элементов до следующего цикла или на определенный период пока не истечёт время блокировки элемента. Очереди, поддерживающие данную возможность должны реализовывать интерфейс DelayableQueueInterface.
Ранее было невозможно отложить обработку конкретного элемента очереди без выбрасывания исключения с последующим логированием или приостановкой всей очереди. Новый обработчик исключений работает «тихо» по умолчанию и позволяет отложить конкретный элемент для последующей обработки.
Для этого достаточно выбросить исключение \Drupal\Core\Queue\DelayedRequeueException в обработчике очереди.
// Delay processing of this item until the next queue worker cycle.
throw new DelayedRequeueException();
// Delay processing of this item for 10 seconds (if supported by the queue).
throw new DelayedRequeueException(10);Если очередь не поддерживает данную особенность, то исключение будет проигнорировано и элемент останется заблокированным на стандартный период.
\Drupal\Core\Queue\DatabaseQueue теперь реализует DelayableQueueInterface.
¶Добавлена возможность помечать конфигурационные схемы устаревшими
Для конфигурационных схем добавлена поддержка объявления схемы устаревшей при помощи ключи deprecated. Для этого в структуру добавляется новый ключ deprecated, а в качестве значения — его описание.
Пример как пометить схему complex_structure устаревшей:
complex_structure:
type: mapping
label: Complex
deprecated: "The 'complex_structure' config schema is deprecated in drupal:9.1.0 and and is removed from drupal:10.0.0. Use the 'complex' config schema instead. See http://drupal.org/node/the-change-notice-nid."
mapping:
key:
type: ...
...
¶Хук media_oembed_iframe() теперь получает объект Resource
Когда за рендер медиа отвечает источник oEmbed (например YouTube ролики), в целях безопасности медиа модуль рендерит данное содержимое внутри iframe.
Содержимое iframe генерируется на основе шаблона media-oembed-iframe.html.twig и соответствующего тем хука media_oembed_iframe. Начиная с Drupal 9.1 данный тем хук также получает связанный объект с oEmbed Resource, который может быть полезен для препроцесс функций и шаблонов, которые хотят внести изменения для iframe на основе данного ресурса.
Пример добавления rel=0 параметра к пути до YouTube ролика в iframe:
function mytheme_preprocess_media_oembed_iframe(array &$variables) {
/** @var \Drupal\media\OEmbed\Resource $resource */
$resource = $variables['resource'];
if ($resource->getProvider()->getName() === 'YouTube') {
// We are rendering a YouTube video, so modify the URL of the video so that it only shows related videos from the same channel.
// The video's markup is only available as a string, so we need to use str_replace() to modify the URL.
$variables['media'] = str_replace('?feature=oembed', '?feature=oembed&rel=0', (string) $variables['media']);
}
}
¶Множественные изменения в виджет подтверждения пароля
В JavaScript виджет подтверждения пароля внесены множественны изменения.
¶Drupal.evaluatePasswordStrength теперь возвращает объект
Drupal.evaluatePasswordStrength теперь возвращает объект содержащий в себе messageTips как замену для message. В нём содержатся все сообщения с проблемами вместо готовой HTML разметки.
¶Новые JavaScript theme функции для оформления виджета
Добавлены три новые функции темизации:
-
Drupal.theme.passwordConfirmMessage -
Drupal.theme.passwordStrength -
Drupal.theme.passwordSuggestions
При их помощи вы можете переопределить внешний вид виджета.
¶Селекторы по CSS классу заменены на data-drupal-selector аттрибуты
Некоторые классы с префиксом js-* заменены на data-drupal-selector аттрибуты.
-
js-password-strength__indicatorзаменён наpassword-strength-indicator. -
js-password-strength__textзаменён наpassword-strength-text. -
js-password-confirm-messageзаменён наpassword-confirm-message.
Для вывода статуса об идентичности паролей раньше использовался пустой <span>, теперь данный элемент ищется по data-drupal-selector="password-match-status-text".
Было:
Drupal.theme.passwordConfirmMessage = passwordSettings => {
const confirmTextWrapper =
'<span></span>';
return `<div aria-live="polite" aria-atomic="true" class="password-confirm-message js-password-confirm-message" data-drupal-selector="password-confirm-message">${passwordSettings.confirmTitle} ${confirmTextWrapper}</div>`;
};Стало:
Drupal.theme.passwordConfirmMessage = passwordSettings => {
const confirmTextWrapper =
'<span data-drupal-selector="password-match-status-text"></span>';
return `<div aria-live="polite" aria-atomic="true" class="password-confirm-message js-password-confirm-message" data-drupal-selector="password-confirm-message">${passwordSettings.confirmTitle} ${confirmTextWrapper}</div>`;
};
¶Включена ленивая загрузка картинок по умолчанию
Для изображений выводимых Drupal и которых заданы width и height аттрибуты включена ленивая загрузка. Требования наличия ширины и высоты обусловлено тем, что без данных аттрибутов ленивая загрузка приводит к проблемам CLS.
¶Добавлен новый компонент — FrontMatter
В ядро добавлен новый компонент Drupal\Component\FrontMatter\FrontMatter.
Данный компонент позволяет вам парсить Front Matter разметку из различных файлов.
Front Matter используется для того, чтобы добавить в исходный файл дополнительную статическую информацию.
Front Matter разметка должны быть самой первой в исходном файле, также она должна быть валидным YAML. Содержимое Front Matter задаётся между открывающей и закрывающей конструкцией, которая состоит из трёх тире подряд ---.
¶Пример
source.md
---
important: true
---
My contentexample.php
use Drupal\Component\FrontMatter\FrontMatter;
$frontMatter = FrontMatter::create(file_get_contents('source.md'));
$data = $frontMatter->getData(); // ['important' => TRUE]
$content = $frontMatter->getContent(); // 'My content'
$line => $frontMatter->getLine(); // 4, line where content actually starts.
¶Twig
Сервис twig был расширен для поддержки данной возможности в Twig шаблонах.
Пример:
$metadata = \Drupal::service('twig')->getTemplateMetadata('/path/to/template.html.twig');
¶PHPUnit обновлён до версии 9.
Друпал ядро обновлено для использования PHPUnit 9. Установки на PHP 7.3 продолжат использовать PHPUnit 8.4 в целях обратной совместимости.
Большинство тестов не должно задеть данное изменение, тем не менее, разработчикам модулей следует обратить внимание на следующее:
-
::assertContains()теперь производит строгое сравнение (===) что может привести к ошибкам. PHPUnit предоставляет более мягкий вариант данной проверки::assertContainsEquals(), благодаря которому, тесты продолжат работать на PHP 7.3. - В ядро добавлен новый трейт
Drupal\Tests\PhpUnitCompatibilityTraitдля всех базовых классов. Тесты contrib модулей всегда должны расширять базовые классы тестов из ядра вместо прямого подключения трейта.
¶Новая тема оформления Drupal — Olivero — добавлена в ядро
Текущая тема оформления — Bartik, была частью релиза Drupal 7, который состоялся в январе 2011 года. Спустя 9 лет, данная тема успела попасть в релизы Drupal 8 и Drupal 9. Веб двигается вперёд, это было отлично для 2011 года, но не годится сейчас.
Начиная с данной версии, в ядро добавлена новая тема — Olivero. На данный момент она находится в экспериментальном статусе и будет выключена по умолчанию, но со временем, она заменит Bartik.
Вы можете посмотреть как выглядит данная тема в живую на демо сайте: http://lb.cm/olivero
¶Composer шаблоны Drupal больше не задают значение minimum-stability равным dev
Начиная с Drupal 8.8 и до Drupal 9.0, включительно, Composer шаблоны для Drupal (drupal/recommended-project и drupal/legacy-project) указывали минимальную стабильную версию следующим образом:
"minimum-stability": "dev",
"prefer-stable": true,Это позволяет устанавливать пакеты в разработке вместе с шаблоном. Иногда данное поведение приводит к непредсказуемым результатам, например, обновление на новый нестабильный релиз, вместо того чтобы обновляться в пределах текущего стабильного релиза. Настройка Composer prefer stable должна рассматриваться как рекомендация, и не гарантирует, что будет выбран стабильный релиз.
Начиная с Drupal 9.1.0-alpha1, Composer шаблоны с Drupal будут указывать соответствующие уровни стабильности:
- Drupal 9.1.0-alpha1 будет указывать минимальную стабильность как "alpha"
- Drupal 9.1.0-beta1 будет указывать минимальную стабильность как "beta"
- Drupal 9.1.0-rc1 будет указывать минимальную стабильность как "RC"
- Drupal 9.1.0 будет указывать минимальную стабильность как "stable"
Данные изменения не окажут влияния на уже созданные ранее проекты управляемые Composer. Пользователи сайтов должны сами скорректировать это значение в composer.json файле, если это необходимо.
Используя минимальную стабильность в значении stable вы по-прежнему сможете загружать и устанавливать нестабильные зависимости, для этого достаточно запрашивать необходимые версии с «флагом стабильности», например:
composer require drupal/contrib:^1.0@betaДанная команда позволит проекту contrib быть загруженным в бета-версии и выше. Тем не менее, если другой модуль имеет зависимость на него, то приведенный пример выше приведёт к ошибке. Данная ситуация также может быть решена похожим способом, запросив оба проекта с нужными метками:
composer require drupal/contrib:^1.0-beta1 outside/library:@alpha
¶Добавлен новый класс StatementWrapper, Drupal\Core\Database\Connection::$statementClass помечен устаревшим
В ядро добавлен новый класс StatementWrapper, который является обёрткой для встроенного в PHP класса \PDOStatement. \PDOStatement изменён в PHP 8, в связи с чем \Drupal\Core\Database\StatementInterface становится несовместимым с ним. Данная обертка позволит использовать \Drupal\Core\Database\Statement с PHP 8.
Драйвера БД из ядра для MySQL и Postgres теперь используют \Drupal\Core\Database\StatementWrapper.
Если вы не используете сторонние драйвера баз данных, никаких действий не требуется.
Сторонние и собственные драйвера баз данных должны установить значение \Drupal\Core\Database\StatementWrapper для свойства \Drupal\Core\Database\Connection::$statementWrapperClass, а также установить значение NULL для \Drupal\Core\Database\Connection::$statementClass.
Пример:
/**
* {@inheritdoc}
*/
protected $statementClass = NULL;
/**
* {@inheritdoc}
*/
protected $statementWrapperClass = StatementWrapper::class;Свойство \Drupal\Core\Database\Connection::$statementClass помечено устаревшим.
¶Добавлен новый компонент — Reflection
В PHP 8 был удалён \ReflectionParameter::getClass(), для того чтобы сохранить обратную совместимость добавлен новый утилитарный компонент Reflection и соответствующий метод ::getParameterClassName().
Для того чтобы ваш код был совместимо с PHP 8, обновите код с использованием нового компонента.
Ранее:
function foo(Exception $a) { }
$functionReflection = new ReflectionFunction('foo');
$parameters = $functionReflection->getParameters();
$aParameter = $parameters[0];
echo $aParameter->getClass()->name;Теперь:
function foo(Exception $a) { }
$functionReflection = new ReflectionFunction('foo');
$parameters = $functionReflection->getParameters();
$aParameter = $parameters[0];
$param_class = \Drupal\Component\Utility\Reflection::getParameterClassName($aParameter);
echo $param_class;
// If you need the reflection class object.
$reflection = new \ReflectionClass($param_class);
echo $reflection->name;
¶Drupal ядро теперь использует composer/semver 3 версии
Drupal ядро теперь использует composer/semver 3 версии и все тесты используют Composer 2 для совместимости с PHP 8. Это не значит что Drupal теперь требует Composer 2 для управления зависимостями, релизы 8.8, 8.9, 9.0 и 9.1 могут по прежнему управляться Composer 1.
Если вы обновляетесь на Drupal 9.1+ при помощи Composer и видите следующее сообщение:
Problem 1
- Root composer.json requires my_project/my_package * -> satisfiable by my_project/my_package[...].
- my_project/my_package dev-master requires composer/composer ^1 -> satisfiable by composer/composer[1.0.0-alpha1, ..., 1.10.x-dev].Это означает что проблема с my_project/my_package, а не с Drupal ядром. Для решения проблемы, попробуйте обновить данные зависимости до актуальных версий. Если это не помогает, рекомендуется сообщить о проблеме разработчикам модуля (а не ядра).
¶Для проверки наличия обновлений теперь требуется OpenSSL или дополнительная конфигурация
Начиная с данного релиза, проверка обновлений для Drupal ядра и модулей будет производиться HTTPS протоколу. Для корректной проверки сертификата теперь потребуется OpenSSL расширение для PHP. Если данное расширение отсутствует, то проверка обновления будет недоступна, а на странице статуса системы будет выводиться соответствующая ошибка и как её решить.
Для проверки обновлений по HTTP добавлена новая настройка update_fetch_with_http_fallback. Это позволит работать в прежнем режиме и получать информацию об обновлениях. Включение данной настройки может привести к возможности для MITM атак на сайт.
В связи с введением новой настройки, классы \Drupal\update\UpdateFetcher и \Drupal\update\Controller\UpdateController ожидают в качестве аргумента конструктора сервис settings. Данный аргумент является опциональным для Drupal 9, но станет обязательным в Drupal 10.
¶Плагин источника данных миграций «variable» получил новую настройку
Плагин источника данных Variable (variable) получил новую настройку variables_no_row_if_missing. Данная настройка позволяет перечислить все обязательные значения для данного плагина. Если хотя бы одного из значений отсутствует, то плагин не вернёт никаких значений.
¶Примеры
При данной конфигурации, источник вернёт одну строку, даже если переменной filter_fallback_format не существует:
source:
plugin: variable
variables:
- filter_fallback_formatПри данной конфигурации, источник данных вернёт одну строку если доступна переменная file_public_path или ноль значений, если переменная отсутствует:
source:
plugin: variable
variables:
- file_private_path
- file_temporary_path
variables_no_row_if_missing:
- file_public_pathЗначения настройки variables_no_row_if_missing всегда объединяется с variables. Все следующие примеры делают одно и тоже и валидны:
source:
plugin: variable
variables:
- book_child_type
- book_block_mode
- book_allowed_types
variables_no_row_if_missing:
- book_child_type
- book_block_mode
- book_allowed_types
source:
plugin: variable
variables:
- book_child_type
- book_block_mode
variables_no_row_if_missing:
- book_allowed_types
source:
plugin: variable
variables_no_row_if_missing:
- book_child_type
- book_block_mode
- book_allowed_types
¶Action
-
#3174573 Исправлена грамматическая ошибка в документации
ActionUninstallTest.
¶Asset Library System
- #3163500 Сообщение об устаревшей библиотеке теперь также выводится при переопределении или расширении данной библиотеки темой.
-
#3095113 Свойства
IEи!IEдля библиотек помечены устаревшими, так как его поддержка в IE была удалена в 2016 году для версий IE10+.
¶Block
-
#3105976 В
BlockViewBuilder::buildPreRenderableBlock()для аргумента$entityдобавлен тайпхинт\Drupal\block\BlockInterface. - #2151001 Для административной страницы «Схема блоков» добавлен Tour.
- #2890758 Видимость блока по типу ноды теперь работает на маршрутах с предварительным просмотром и ревизии.
- #2918149 Теперь сообщение «This block is broken or missing…» будет отображаться только пользователям, у которых есть права на действия связанные с блоком.
- #2404105 Теперь при установке дистрибутивов блоки устанавливается только для конкретной темы, а не для всех активных.
¶Book
- #26552 Теперь редакторы могут редактировать или создавать неопубликованные страницы и подшивки.
¶CKeditor
-
#3099662
ckeditor_stylesheetsтеперь могут указывать путь относительно корня Drupal. -
#2911527 Добавлена возможность использовать
/при добавлении собственных вариантов стилей. - #3171952 CKEditor обновлён до 4.15.0.
¶Claro
-
#3060697 Claro теперь использует
#dropbutton_typeдля вариантовdropbuttonэлемента, вместо классов. - #3154425 Удалён комментарий «@todo Remove this after 8.6.x is out of support.» и код для него.
-
#3105575 HTML классы перенесены из
claro_preprocess_textarea()в шаблон. - #3164871 Исправлены отступы у радио кнопок.
-
#3057772 Улучшены иконки для элемента
details. - #3171727 Разделитель для хлебных крошек теперь более контрастный.
- #3066006 Оформление Views UI приведено в соответствие дизайну.
- #3085212 Новое оформление страницы «Сайт находится в режиме обслуживания».
- #3072772 Новое оформление страницы расширений.
- #3166068 Исправлен AJAX индикатор загрузки значений для автодополнения в инлайн формах.
- #3158854 Для форм создания и редактирования нод, основные элементы теперь центруются если ширина превышает 1200px.
- #3070493 Предоставлен механизм и начальная реализация оформления тулбара под стиль Claro.
- #3061042 Улучшено оформление страницы состояния системы.
- #3062751 Улучшено оформления для Media и Media Library элементов.
-
#3179768 Улучшено оформление каретки для
<details>элемента. - #3183425 Добавлено решение для бага Google Chrome 87 при котором fieldset отрисовывался с артефактами.
¶Comment
- #2984243 Кнопка фильтрации в представлении для вывода комментариев теперь содержит значение «Filter» вместо «Apply».
-
#3163685 Удалена неиспользуемая переменная
$blockвCommentBlockTest. -
#3163686 Удалена неиспользуемая переменная
$commentвCommentLinksAlterTest. -
#3163425 Удалена неиспользуемая переменная
$fieldsвCommentViewsData. -
#3059719 Использование
#markupзаменено на#context.
¶Composer
- #3156558 Обновлены зависимости.
-
#3133903 Добавлены проверка, что все пакеты из
composer.lockфайла ядра имеются и имеют конкретные версии. -
#3121847 В шаблоны проектов drupal/recommended-project и drupal/legacy-project теперь добавляется новый путь установки
drupal-custom-profile(profiles/custom/{$name}/). -
#3164349
symfony/var-dumperтеперь указан как dev зависимость в корневом composer.json Drupal. - #3157296 Обновлены зависимости ядра.
- #3168514 Удалены неиспользуемые полифилы.
- #3176504 Обновлены зависимости ядра.
- #3178046 Обновлены зависимости ядра.
- #3179284 Обновлены зависимости ядра.
-
#3180092 Зависимость
fabpot/goutteобновлена до версии 3.3.1. -
#3151118 Файл
bootstrap.incдобавлен в автозагрузчик Composer. Это позволит использовать функции, напримерt(), в тестах без проблем. -
#3181240 Зависимость
typo3/phar-stream-wrapperобновлена до версии 3.1.6. -
#3182959 Drupal пакеты теперь явно зависят от текущей минорной версии ядра, вместо мажорной. Например
^9.1вместо^9. Это позволяет исправить неполадку, когда предрелизные версии при обновлении даунгрейдились до предыдущей минорной версии: 9.1.0-alpha1 > 9.0.7. - #3183825 При генерации фикстуры с вендорами теперь используется абсолютный путь, вместо относительного.
-
#3098281 Теперь в
composer.jsonдля ядра явно указана версия PHP в разделеplatform. -
#3180207 Для совместимости с PHP 8 обновлены следующие зависимости:
laminas/laminas-diactoros,laminas/laminas-feed,laminas/laminas-escaper.
¶Contact
-
#3150227 Удалены неиспользуемые переменные
$contact_formи$recipients_str.
¶Content Moderation
-
#3044292 (откачено) Добавлен новый метод
::isModeratedEntityдля хендлеров moderation сущностей. -
#3164498 Удалена неиспользуемая переменная
$entity_type_idsвcontent_moderation.module. -
#3155022 Изменена сигнатура
EntityModerationForm::__construct(). Параметр$timeтеперь имеет более слабые требования и вместоTimeобъекта ожидает экземплярTimeInterface. -
#3167811 Улучшена документация для конструктора
EntityModerationForm.
¶Content Translation
-
#2972308 Добавлено новое разрешение
translate editable entitiesпозволяющее переводить сущности, которые пользователь может редактировать. - #2796399 Улучшены hreflang метатеги для сущности что используется в качестве главной страницы.
-
#3178338 Исправлены стандарты кодирования для
d7_menu_links_localized.yml.
¶CSS
-
#3170864
postcss-custom-propertiesзаменёнpostcss-preset-env.
¶Database System
-
#2278971
Connection::supportsTransactionsпомечен устаревшим. Таким образом настройка подключения к БДtransactionsтакже становится устаревшей. -
#3143618 Обычные пробелы (
U+0020) теперь заменяются на неделимые пробелы (U+00A0), для минимизации ложных срабатываний. -
#3151990 Запросы к БД переписаны на EntityQuery в
NodeRevisionPermissionsTest. -
#3151981 Запросы к БД переписаны на EntityQuery в
NodeRevisionsAllTest. -
#3152001 Запросы к БД переписаны на EntityQuery в
NodeAccessBaseTableTest. -
#3151959 Запросы к БД переписаны на EntityQuery в
PathTaxonomyTermTest. -
#3151990 Запросы к БД переписаны на EntityQuery в
NodeRevisionPermissionsTest. -
#3151968 Запросы к БД переписаны на EntityQuery в
NodeTranslationUITest. -
#3128616
Drupal\Core\Database\Connection::destroyпомечен устаревшим. Вместо него используется нативный__destruct(). -
#3152415 Ключевые имена в статичных запросах
core/lib/Drupal/Coreтеперь обёрнуты в квадратные скобки для избежания проблем с зарезервированными именами баз данных. -
#3151981 В
NodeRevisionsAllTestиспользование статических запросов заменено на Entity Query. -
#3152398 Статические запросы в
core/tests/Drupalпереписаны на динамические. -
#3123461 Возможность располагать драйвера баз данных в
DRUPAL_ROOT/driversпомечена устаревшей и будет удалена в Drupal 10. -
#2999569 Теперь, при попытке вставить (
INSERT) запись в несуществующую колонку и без указания значения по умолчанию в схеме, драйвер MySQL будет выбрасывать исключениеIntegrityConstraintViolationExceptionв дополнение к текущемуDatabaseExceptionWrapper. -
#3120892 Для драйвера SQL Lite добавлена поддержка функции
LEAST(). -
#3174848 Исправлена опечатка в сообщении о депрекации метода
Connection::prepare. - #2736777 Теперь при работе с транзакциями на PHP 8 не будет вызываться исключение.
-
#3089902 При создании БД Drupal больше не задаёт
NO_AUTO_CREATE_USER.
¶Entity System
-
#3033986 Удалено перезаписывание
$limitв некоторых классах расширяющихEntityListBuilder. Оно было без значения. -
#2927077
Entity::toUrlтеперь передает параметр ревизии на все маршруты, чьё название начинается сrevision. Таким образом, это автоматизирует передачу параметров для кастомных маршрутов типаrevision_revertиrevision_delete. -
#2656570
DraggableListBuilderтеперь рендерит метку через#plain_text. -
#2955442 Добавлен новый метод
TableMappingInterface::getAllFieldTableNames()который возвращает название всех таблиц в которых хранится информация для конкретного поля.
¶Extension System
-
#3150726 Функция
update_check_incompatibility()помечена устаревшей.
¶Field System
-
#2893789
WidgetBaseтеперь использует свой собственный метод::getFilteredDescription()для получения описания. -
#3165188 Удалена неиспользуемая переменная
$iизFieldOptionTranslation. -
#3165191 Удалена неиспользуемая переменная
$field_idsизFieldAttachStorageTest. -
#2918290 Исправлен некорректно указанный возвращаемый типа для
FieldStorageConfig::loadByName. -
#3177545 Внесены улучшения в
\Drupal\field\Entity\FieldStorageConfig::getCardinality()для совместимости с PHP 8. - #3158651 Настройка сортировки теперь видна только если выбрано хотя бы одно поле для сортировки.
¶File
-
#3070902 Для исключения вызываемого в
prepareDestination()улучшено описание лога. -
#2991219
template_preprocess_file_link()больше не добавляетlengthпараметр после MIME вtypeаттрибуте. -
#3157370 Исправлен комментарий ссылающийся на
file_directory_temp().
¶Filter
- #3151101 Употребление слов «whitelist» и «blacklist» в Filter модуле заменено на более подходящие.
¶Forum
-
#3067622 Справка из
hook_help()конвертирована в Help Topics. -
#2828680 Добавлена отсутствующая обёртка
<ul>для действий на форуме.
¶JSON:API
-
#3165794 Удалена неиспользуемая переменная
$account_bundleвResourceTestBase. -
#3093757 Убраны вызовы
testRelated()из тестов так как проблемы (issues) решены. -
#3112229 JSON:API больше не упрощает результаты для типов полей, которые возвращают
NULLили имя основного свойства не соответствует тому, что возвращает значение. - #2996114 Улучшено сообщение об ошибке если ресурс был изменён.
- #3175884 Исправлена теоретическая ошибка которая могла привести к одинаковым ссылкам в ответе при разных метаданных для этих самых ссылок.
¶Help Topic
- #3087879 Для поиска по Help Topic теперь используется административная тема оформления.
-
#3095740 Справка для
menu_link_contentиmenu_uiмодулей конвертирована в Help Topic. -
#3164965 Удалена неиспользуемая переменная
$sourceвHelpTopicTwigLoaderTest. -
#3166763 Исправлены двойные пробелы в
help.help_topic_search.html.twig. -
#3047703 Справки модулей
basic_auth,hal,jsonapi,rdf,restиserializationконвертированы в Help Topic. -
#3085972
Drupal\help_topics\FrontMatterзаменён наDrupal\Component\Utility\FrontMatter.
¶Image
- #3153009 Добавлен новый стиль изображения устанавливаемый с модулем — «Wide (1090)». Он будет использоваться как Hero стиль в будущей теме Olivero.
-
#3097797 Улучшена документация для функции
image_filter_keyword(). -
#3165350 Удалена неиспользуемая переменная
$keyвMigrateImageCacheTest. - #2630230 Исправлена неполадка из-за которой мог не генерироваться стиль изображения из корня публичной файловой директории при конвертации типов.
-
#3174913 Исправлена ошибка в конструкторе
ImageStyleDownloadControllerдля соответствияStreamWrapperManagerInterface.
¶Install System
-
#3157895 Обновление состояния
install_timeперенесено вinstalled_finished(). - #3086307 Производительность установки увеличена примерно на ~20%, путем сброса кеша маршрутов после установки всех модулей, а не после каждого.
¶JavaScript
- #3145930 Размер «липкого» заголовка теперь пересчитывается после сворачивания и разворачивания тулбара.
-
#3096516 В
domreadyвнесены улучшения, которые решают проблему с race condition. - #3152473 Улучшена работа обратного вызова domready.
-
#3078501 Функция
Drupal.AjaxCommands.prototype.alertтеперь вызываетwindow.alertс одним параметром, так как второй ни на что не влияет. - #1936708 Улучшено отображение вертикальных вкладок. Теперь они корректно отображают и обновляют сводку по выбранным значениям.
-
#3143465 😑 Добавлен полифил
NodeList.forEachдля совместимости с IE11. - #3174884 Обновлены зависимости Yarn.
- #3181057 Underscore.js обновлён до 1.11.0.
- #3181059 Popper.js обновлён до 2.5.4.
¶Install system
-
#2691389 Строка «Save and continue» в
InstallerTestBase::setUpLanguageбольше не является переводимой так как на данном этапе только английский язык.
¶Layout Builder
- #3053887 В код добавлена документация почему блоки требуют создание новой ревизии при изменении.
- #3069578 Исправлена неполадка из-за которой псевдо-поля не рендерились.
¶Locale
-
#2925318 Для таблицы
locales_locationудалён индексsidтак как он покрыт вstring_type. -
#3167600 Удалена неиспользуемая переменная
$configвlocale.bulk.inc. -
#3167599 Удалена неиспользуемая переменная
$frequencyвlocale.module. -
#3168261 Удалена неиспользуемая переменная
$language_listвlocale.module. - #3179258 Теперь, при поиске строки для перевода в интерфейсе, удаляются начальные и конечные пробелы в поисковой фразе.
¶Media
-
#3142818 Из ссылок удалён аттрибут
target=_blank. - #3159793 Исправлена опечатка в форме настройки Media Library.
- #3146492 Удалены неиспользуемые переменные в модуле.
-
#3169866 Удалены неиспользуемые переменные
$targetи$buttonвCKEditorIntegrationTest.
¶Mail System
-
#3094783 Для AJAX запросов отключение рефокусировки перенесено из
data-disable-refocusкнопки отправки, непосредственно в#ajaxопциюdisable-refocus.
¶Menu UI
- #3158562 Теперь в интерфейсе всегда ссылка меню упоминается как «menu link», вместо «menu item».
-
#3153394 Добавлена документация что меню поддерживает маршрут типа
route:<button>.
¶Migration System
- #3024682 На странице со списком миграций теперь показываются человеко-понятные названия, вместо машинных.
-
#3143719 В
MigrateUpgradeTestBaseдобавлен новый методgetCredentials(). - #2993367 Добавлена миграция из Drupal 7 Picture (contrib модуль) в Responsive Image.
-
#3133139 Удалена
is_arrayпроверка вgetProcessPlugins. -
#3134300 Упрощена разметка и код в
ReviewForm::buildForm(). -
#3154398 Миграции теперь могут указывать требуемые плагины для своей работы: при помощи нового метода
getRequirements(). - #3110669 Добавлена поддержка миграции мультиязычных меню из Drupal 7.
-
#2845485 Улучшена документация для плагина
MenuLinkParent. -
#3160323 Название переменных в исключениях
Rowтеперь обёрнуты в одинарные кавычки. -
#3143717 Добавлены новые хелперы
MigrateUpgradeTestBase::assertIdConflictForm()иMigrateUpgradeTestBase::assertReviewForm(). -
#3164120 Исправлен пример кода в документации плагина
MenuLinkParent. -
#2447727 Добавлен абстрактный
ReferenceBaseдля миграции связующих полей. -
#3112249 Добавлена новая миграция
d7_menu_translationдля миграции переводов меню из Drupal 7. -
#3164652 Для плагина обработчика
Substrвключено исключение cspell для игнорированияskÅ‚odowska. -
#3158277 Удалена неиспользуемая переменная в
EntityLinkTest. -
#3172592 Удалена неиспользуемая переменная
$field_typeвEntityContentBase. -
#3172332 Удалена неиспользуемая переменная
$process_plugin_managerвMigrationLookupTest. -
#3170972 Удалена неиспользуемая переменная
$iteratorвMigrateExecutableTest. -
#3010951 Исправлена неполадка из-за которой метод
::createInstancesByTagменеджера миграций создавал экземпляры для всех найденных плагинов если нет плагинов с метками. -
#2960170 Для плагина обработчика
Flatterдобавлена валидация входных данных. -
#3152789 Для плагина источника
variableдобавлена новая настройкаvariables_required. -
#3171755 Удалена неиспользуемая переменная
$rowвRowTest. -
#3143676 Исправлена неполадка в миграции
d7_term_localized_translationиз-за недостаточного количества проверок. -
#3143720 Добавлен новый тест
CredentialFormTest. - #3008028 Добавлены миграции ссылок меню i18n из Drupal 7.
-
#3172116 Удалена неиспользуемая переменная
$parent_link_path.
¶Node System
-
#2830504 Исправлена неполадка из-за которой
Drupal\node\Plugin\Action\AssignOwnerNodeпозволяла выбрать гостя в качестве владельца ноды. -
#3165950 Из
NodeTypeFormудалено упоминание что нижние подчёркивания будут конвертированы в дефисы, так как для путей форм сущностей уже используются нижние подчёркивания. -
#2586013 Функция
node_views_analyze()перенесена из файлаnode.views.incвnode.views_execution.inc.
¶QuickEdit
-
#3174574 Исправлена опечатка в документации к
QuickEditLoadingTest.
¶Help Topics
- #3047723 Документация модулей views, views_ui конвертирована в Help Topics.
- #3067614 Документация модулей filter, ckeditor, editor конвертирована в Help Topics.
¶Olivero
- #3177345 Улучшен контраст текста для блока «Powered by Drupal».
-
#3161010 Исправлена синтаксическая ошибка в
layout-builder-twocol-section.css. -
#3173905 Исправлены ошибки в JavaScript связанные с некорректным использованием
classList.remove(). -
#3157308 Стили неопубликованного материала теперь объявлены непосредственно в теме и больше не подключается библиотека
classy/node. -
#3176908 Улучшена документация для
fieldset.html.twig. - #3179157 Исправлено отображение уменьшенных элементов форм в RTL формате.
-
#3178806 Класс
text-contentудалён изnode--teaser.html.twig. - #3173018 Классы для форм элементов скорректированы для соответствия БЭМ.
-
#3177318 В
MAINTAINERS.txtдобавлена информация о мейнтейнерах Olivero. -
#3176910 Для
preload.twigдобавлена документация. -
#3176919 Добавлена документация для шаблона
node--article--full.html.twig. -
#3179150 Теперь используется шрифт Metropolis
h1внутри контента. -
#3176913 Добавлена документация для шаблона
block--system-powered-by-block.html.twig. - #3177231 Улучшена проверка на наличие заголовка страницы.
-
#3174088 Удалён комментарий с
@todoдля scripts.es6.js. -
#3176912 Добавлена недостающая документация в шаблоне
block--secondary-menu--plugin-id--search-form-block.html.twig. -
#3176914 Добавлен класс для «неопубликованных» мультимедиа-сущностей в
media.html.twig. -
#3180726 Добавлен отсутствующий знак точки в документации к
html.html.twig. - #3176906 Исправлена документация во множестве различных шаблонов.
-
#3176911 Добавлена документация для переменной
noscript_stylesвhtml.html.twig. - #3180280 Уменьшен трекинг для навигационного меню.
- #3180756 Исправлена высота для встроенных аудио мультимедиа.
¶Plugin System
-
#2273381
ContextAwarePluginBaseзаменён трейтомContextAwarePluginTraitи помечен устаревшим.
¶PostgreSQL драйвер
¶RDF
-
#3110972 Библиотека
easyrdf/easyrdfобновлена до версии 1.0.0.
¶Render System
-
#3172410 Класс
HtmlResponseподкорректирован для совместимости с Symfony 5.
¶REST
-
#3152848 Код связанный с
bc_entity_resource_permissionsнастройкой удалён, так как она больше не используется. - #3169578 Удалён неиспользуемый код.
-
#3173076 Удалена неиспользуемая переменная
$parseable_valid_request_body_2вEntityResourceTestBase. -
#3172846 Удалена неиспользуемая переменная
$supported_formatsвResourceRoutes.
¶Routing System
-
#3158708 Возвращено поведение, что
RouteProvider::getAllRoutes()возвращаетiterableрезультат, которое было изменено в #2917331. -
#3173958 В
EntityResolverManager::getContro#llerClassдобавлена проверка что$controllerнеNULL. -
#3074201 Методы
RouteCompiler::getDefaults(),RouteCompiler::getRequirements()иRouteCompiler::getRequirements()признаны устаревшими.
¶Search
- #3086794 Плагины результатов поиска теперь могут указывать, какую тему использовать для отрисовки страниц.
- #3086795 «Search help» на странице поиска заменён на «About searching» для избежания двусмысленности.
- #3155221 Удален устаревший «@todo».
-
#3075703 Функции для обработки поискового запроса
search_index_split(),search_simplify()иsearch_expand_cjk()перенесены в сервисsearch.text_processor. -
#3173595 Удалена неиспользуемая переменная
$emailвSearchBlockTest. -
#3177377 Удалены неиспользуемые переменные
$charcodesи$node2.
¶Serialization
-
#3135304 Удалён слой обратной совместимости с Symfony 3 из
JsonEncoder.
¶Seven
- #3054196 Исправлена проблема с белым фоном у кнопки в таблице.
¶Simpletest
-
#3112432 Добавлена реализация
hook_requirements()которая будет постоянно блокировать включение данного модуля на новых сайтах. -
#3178037 Исправлена опечатка «is has» в
SimpleTest.
¶System
-
#3077938 Добавлена функция
tableDragHandleдляDrupal.theme. Теперь темы могут менять разметку управления сортировкой таблицы. -
#3174378 Удалена неиспользуемая переменная
$filesystem_configвsystem.installиUpdateScriptTest. -
#3156887 Для совместимости с PHP 8
\Drupal\system\Plugin\ImageToolkit\GDToolkitтеперь поддерживает объекты\GdImage.
¶Taxonomy
- #3122511 На странице редактирования добавлен пункт удаления во вкладки.
-
#3151953 В тесте
TermTranslationUITestиспользование прямого запроса заменено на Entity Query.
¶Update
-
#2303323
update_delete_file_if_stale()теперь возвращает логическое значение.
¶User
- #3082006 Поле пароля больше нельзя использовать в Views для вывода. Ранее он не показывал ничего, сейчас отключена возможность выбора данного значения.
-
#3150070 Видимость свойств в новых тестах изменена с
publicнаprotected. -
#2847808 Метка для прав доступа
administer permissionsизменена на «Administer roles and permissions». - #2193803 Переход по невалидной ссылке выхода из аккаунта больше не выдаёт 403, а редиректит на главную страницу сайта.
¶Views
-
#3139353 Добавлен новый публичный метод
Drupal\views\Plugin\views\query\Sql::getConnection(). -
#3150490 Улучшено именование переменных в
Drupal\views\ViewExecutableFactory::get. - #2838555 Views больше не позволит добавлять связи на данные у которых нет базовой таблицы для join (например, конфигурационные сущности).
- #2780869 Исправлена неполадка, при которой невозможно было сохранить представление, если в значении опции для фильтра была точка.
-
#2625136 Раскрытые фильтры для
numericиdateполей теперь имеют обертку, для того чтобы поля были на одном уровне. - #2846485 Улучшена производительность при рендере множественного поля, где каждый элемент поля создаёт свою строку с выводом.
-
#3013216 Упрощены селекторы в
views-admin.es6.js. -
#2336569 Улучшено добавление
<span>в#field_prefixи#field_suffix. -
#3175081 Удалена неиспользуемая переменная
$exposedвEquality. -
#3175564 Удалена неиспользуемая переменная
$rendererвAreaOrderTest. -
#3175571 Удалена неиспользуемая переменная
$nodesвSortTranslationTest. -
#3175665 Удалена неиспользуемая переменная
$viewвFilterTest. -
#3177546 Исправлено неправильное использование
in_array()в\Drupal\views\Plugin\views\PluginBase::listLanguages()что приводило к выводу дополнительных языков. -
#3177590 Внесены улучшения для
ViewsFormBase::getForm()для совместимости с PHP 8. -
#3175666 Удалена неиспользуемая переменная
$admin_userвFieldEntityOperationsTest.
¶Workspaces
-
#3174418 Удалены неиспользуемые переменные
$revision_metadata_keysи$active_workspace_id.
¶Тестирование
-
#3131820 Использование
is_string()заменено на нативные методы::assertIsString(),::assertIsNotString(). -
#3130341 Удалён
UpdateKernel::fixSerializedExtensionObjects(). -
#3114617 Методы
Drupal\FunctionalTests\AssertLegacyTraitиDrupal\KernelTests\AssertLegacyTraitпомечены устаревшими. -
#3138652 Удалён тест
StableDecoupledTest. -
#3139412 Использование
::assertTitle()заменено на$this->assertSession()->titleEquals(). -
#3077785
DrupalMinkClientудалён и весь код отрефакторен для использования MinkClient. -
#3139437 Использование устаревшего
AssertLegacyTrait::assertCacheTagзаменено на$this->assertSession()->responseHeaderContains(). -
#3144732 Удалены вызовы
t()в связке с$this->assertSession()->optionExists(). -
#3135538 Заменены оставшиеся
assert*вызовы использующиеcount(). -
#3000762 Для
WebAssertдобавлен новый методpageContainsNoDuplicateId(). -
#3082859
AssertMailTrait::assertMailPattern()теперь преобразует значение$regex_foundв логический тип. -
#3155761 В
BlockFormMessagesTestиспользованиеassertTrue()сstristr()заменено наassertStringContainsString(). -
#3139440 Использование устаревшего
AssertLegacyTrait::buildXPathQuery()заменено на$this->assertSession()->buildXPathQuery(). -
#3139426 Использование устаревшего
AssertLegacyTrait::assertOptionSelected()заменено на$this->assertSession()->optionExists(). -
#3123120 Использование устаревшего
AssertLegacyTrait::pass()заменено на новые решения. -
#3155760 Использование
array_key_exists()заменено наassertArrayHasKey(). -
#3139428 Использование устаревших
AssertLegacyTrait::assertFieldChecked()иAssertLegacyTrait::assertNoFieldChecked()заменено на$this->assertSession()->checkboxChecked(). -
#3158286 Удалены неиспользуемые локальные переменные из
BubbleableMetadataTest. -
#3156998
symfony/phpunit-bridgeобновлён с версии 4.4.10 до 5.1.2. Добавлены тесты для@requiresаннотаций с использованием новой версии пакета. -
#3142755 Прекращена передача устаревшего аргумента
$messageвAssertLegacyTrait::assertField()иAssertLegacyTrait::assertNoField(). -
#3158266 Удалены неиспользуемые переменные в
TranslationTest. -
#2664322 Вызов
KernelTestBase::installSchema()для установки таблицkey_valueиkey_value_expireпомечен устаревшим. Данные таблицы создаются лениво. -
#3164161 Аннотация
@runInSeparateProcessперенесена вSettingsTestчтобы покрывало все тесты. -
#3157434 Вместо
\Drupal\Tests\Traits\ExpectDeprecationTraitтеперь используется\Symfony\Bridge\PhpUnit\ExpectDeprecationTrait. -
#3139408 Использование устаревших
AssertLegacyTrait::assertField()иAssertLegacyTrait::assertNoField()заменено на$this->assertSession()->fieldExists(). -
#3139433 Использование устаревших
AssertLegacyTrait::assertEscaped()иAssertLegacyTrait::assertNoEscaped()заменено на$this->assertSession()->assertEscaped(). -
#3139436 Использование устаревшего
AssertLegacyTrait::assertPattern()заменено на$this->assertSession()->responseMatches(). -
#3133355 Добавлены новые методы
WebAssert::responseHeaderExists()иWebAssert::responseHeaderDoesNotExist(). -
#3164589 Использование
assertSame()для заголовков ответов заменено на$this->assertSession()->responseHeaderEquals(). -
#3158280 Удалена неиспользуемая переменная в
DefaultLazyPluginCollectionTest. -
#3158291 Удалены неиспользуемые переменные из
ContainerTest. -
#3164686
WebAssert::addressEquals()иAssertLegacyTrait::assertUrl()теперь учитывают query строку. -
#3163924 Изменена сигнатура
EntityViewTrait::buildEntityView(). Больше он не принимает параметр$reset. -
#3158278 Удалены неиспользуемые переменные из
LocalTaskManagerTest. -
#3143870 Исправлены некорректные вызовы
AssertLegacyTrait::assertUrl(). -
#3160405 Удалена перегрузка аргументами при вызове методов
WebAssertв тестах, которые были конвертированы из Simpletest. -
#3153150 Удалено использование
t()в вызовах::assertTrue()и::assertFalse(). -
#3153143 Удалено использование
t()в вызовах::linkExists()и::linkNotExists(). -
#3166349 Удалено использование
t()в вызовах::assertNoText(). -
#3131186 Сравнения с использованием
::drupalGetHeader()заменены на$this->assertSession()->responseHeaderEquals(). -
#3158290 Удалены неиспользуемые переменные в
ActiveLinkResponseFilterTest. -
#3139442 Использование устаревшего
AssertLegacyTrait::constructFieldXpath()заменено на$this->getSession()->getPage()->findField(). -
#3101247 Использование устаревшего
AssertHelperTrait::castSafeStrings()заменено на$this->assertEquals(). -
#3129002 Использование устаревшего
AssertLegacyTrait::assert()заменено на$this->assertTrue(). -
#3168107 Зависимость
symfony/phpunit-bridgeобновлена до версии^5.1.4. -
#3165588 Добавлена проверка что свойство
$moduleявляется `protected. -
#3139405 Использование устаревших
AssertLegacyTrait::assertUniqueText()иAssertLegacyTrait::assertNoUniqueText()заменено на$this->getSession()->getPage()->getText(). -
#3139419 Использование устаревшего
AssertLegacyTrait::assertUrl()заменено на$this->assertSession()->addressEquals(). -
#3139418 Использование устаревших
AssertLegacyTrait::assertLinkByHrefиAssertLegacyTrait::assertNoLinkByHrefзаменено на$this->assertSession()->linkByHrefExists(). -
#3159230 Исправлены оставшиеся вызовы с передачей
$messageвAssertLegacyTrait::assertRawиAssertLegacyTrait::assertNoRaw. -
#3168946 Использование устаревшего
AssertLegacyTrait::assertTextHelperзаменено на$this->assertSession()->pageTextContains()и$this->assertSession()->pageTextNotContains(). -
#3139407 Использование устаревших
AssertLegacyTrait::assertFieldByIdиAssertLegacyTrait::assertNoFieldByIdзаменено на$this->assertSession()->fieldExists(),$this->assertSession()->buttonExists()и$this->assertSession()->fieldValueEquals(). -
#3139406 Использование устаревших
AssertLegacyTrait::assertFieldByNameиAssertLegacyTrait::assertNoFieldByName. -
#3166543
UiHelperTrait::drupalPostFormтеперь помечен устаревшим по всем стандартам. - #3168788 Использование xpath заменено на WebAssert.
-
#2802401 Передача
NULLв качестве параметра для$editв::drupalPostFormпомечена устаревшей. -
#3171920 В
AssertLegacyTraitпоправлено сообщение об устаревшем коде. -
#3162403
symfony/phpunit-bridgeобновлён до 5.1.6, чтобы решить проблему с некорректным сообщением об устаревшем коде. -
#3142267 Использование трейта
PHPUnit8WarningsзамененоPhpUnitWarnings. -
#3173888 У функции
_drupal_error_handler_real()удалён параметр$contextи код обновлён в соответствии с данным изменением. -
#3135027 Использование
UnitTestCase::assertArrayEqualsзаменено на$this->assertEquals(). -
#3174038
DrupalSelenium2Driverтеперь открывает архив с флагом\ZipArchive::CREATEвместо\ZipArchive::OVERWRITE. -
#3162008
SectionComponentTest::testToRenderArrayтеперь возвращает объект события, чтобы соответствовать возвращаемому типуEventDispatcherInterface::dispatchиз Symfony 5. - #3174158 Тест предупреждений обновлён для соответствия PHP 8, так как используемый вариант «деления на ноль» теперь не предупреждение, а фатальная ошибка.
-
#3172438 Использование аннотации
@expectedDeprecationзаменено наExpectDeprecationTrait::expectDeprecation(). -
#2858646 Исправлены вызовы метода
::setUp()с некорректным регистром. - #3174928 Внесены улучшения в JS тесты ядра.
-
#3166450 Использование условий с
&&в аргументе для::assertTrue()разбито на несколько вызовов. -
#3139429 Использование
AssertLegacyTrait::assertFieldByXPathиAssertLegacyTrait::assertNoFieldByXPathзаменено на$this->xpath(). -
#3145418 Удалены вызовы
t()в аргументах для::assertText(). -
#3145005 Удалены вызовы
t()в вызовах::drupalPostForm(). -
#3183420 Для класса
DrupalSelenium2Driverдобавлен новый метод::attachFile(). -
#3168375 Некоторые вызовы
::drupalPostForm()заменены на::submitForm(). -
#3176200 Удалены вызовы
t()в аргументах для::assertNoText(). -
#3184324 Вызовы
::drupalPostForm(), которые записывают результат в переменную, заменены на::submitForm(). -
#3128815 Вызовы
::assert*()методов, которые содержали операторы сравнения больше/меньше, заменены на::assert(Greater|Less)Than(OrEqual)().
¶Прочие изменения
-
#3123472 Последовательный вызов методов
StorageComparerбольше не используется в условиях. - #2488350 При установке Drupal теперь используется кеш-бэкенд в памяти. Это позволяет ускорить установку.
-
#3127255 Из проверки системных требований удалены проверки
mbstring.http_inputиmbstring.http_output. Данные параметры, начиная с PHP 5.6 являются устаревшими и ничего не возвращают. -
#2778917 Вместо тернарного оператора при вызове
\Drupal::state()->get()теперь используется второй параметр. -
#3021788 Функции
template_preprocess_menu_local_task()иtemplate_preprocess_menu_local_action()перенесены вcore/includes/theme.inc. -
#3112328 Классы расширяющие
FormatterBaseбольше не реализуютContainerFactoryPluginInterface, так как это объявлено вFormatterBase. - #3033734 На странице списка модулей исправлена горизонтальная прокрутка при больших описаниях.
- #3112790 Исправлена неполадка, из-за которой «установка» модулей User и System происходила дважды.
-
#3143605 Удалена функция
update_replace_permissions(). -
#2972224 В ядро добавлен
.cspell.jsonдля автоматической проверки правописания в ядре Drupal. - #2256367 Использование «web site» в документации и UI заменено на «website».
- #3143724 «dont» заменён на «do_not» в якоре ссылки на документацию.
-
#3153790 Исправлена опечатка в сервисе
user.flood_subscriber. - #3055189 Маппинг ключей в несколько строк помечен устаревшим в Symfony 4.3, соответствующие изменения внесены в ядро.
-
#3143713 Функция
drupal_get_schema_versions()теперь всегда возвращает целые числа. -
#3154594
composer.jsonиcomposer.lockбудут пропускаться CSpell. - #3154665 Из словаря CSpell удалены названия модулей и плагинов.
-
#2807743 Триггеры ошибок для
FormattableMarkup::placeholderFormat()приведены к единому стилю. -
#2619482 Использование
get_called_class()иget_class($this)заменены наstatic::class. - #2928960 Длина слогана сайта увеличена со 128 символов до 255.
-
#3155770 Удалены избыточные указания реализации
ContainerFactoryPluginInterfaceкогда класс расширял уже класс реализующий интерфейс. - #3154914 Исправлены грамматически ошибки при употреблении множественного и единственного числа.
-
#3157546 В
MAINTAINERS.txtдобавлен mondrake в качестве мейнтейнера тест фреймворка. - #3157954 Из тестов удалены избыточные ребилды маршрутов.
-
#2989262 В генератор
.htaccessфайла добавлены экранирования для точек и запятых. -
#3116858
ExtensionDiscoveryтеперь кеширует не объект расширения целиком, а только информацию о нём. - #2836194 Для ajax throbber увеличен паддинг, чтобы не обрезало край анимации.
- #3138781 Стандартизовано употребление слов «ORed» и «ANDed» в ядре.
- #3022551 Исправлен артикль в документации после притяжательного местоимения.
-
#3151092 Слова «whitelist» и «blacklist» в
Drupal\Core\Extensionзаменены на$skippedFolderи$allowedExtensionTypes, соответственно. -
#3143087 В
ModulesListFormтеперь явно объявлено свойствоaccessManager. -
#3162045 Для совместимости с Symfony 5 вместо
new Process()используется\Symfony\Component\Process\Process::fromShellCommandline(). - #3120222 Ссылки ведущие на документацию Drupal 7 заменены на актуальные.
-
#3151095 Употребление «whitelist» и «blacklist» в
\Drupal\Core\Utility\Errorзаменены на более подходящие. -
#3008140 Добавлен новый тест
ShutdownFunctionsTestдля тестирования функции отключения Drupal. -
#3151094 Слова «whitelist» и «blacklist» в классах
\Drupal\Core\Templateи их тестах заменены на более подходящие. -
#3142934 Метод
\Drupal\Component\Utility\Bytes::toInt()помечен устаревшим в пользу\Drupal\Component\Utility\Bytes::toNumber(). -
#3164211 Удалены 8 исправленных опечаток из
misc/cspell/dictionary.txt. -
#3084441 У ссылки на главную страницу сайта в блоке брендирования удалён тег
title. - #3085245 Добавлен PostCSS плагин postcss-url который автоматически делает все использования SVG в качестве фона инлайн строкой с оптимизацией.
-
#3123285 В
robots.txtисправлены некорректные правила для страниц регистрации, авторизации, выхода и восстановления пароля. -
#3151093 Употребление «whitelist» и «blacklist» в
\Drupal\Core\Security\RequestSanitizerи его тесте заменены на более подходящие. - #3166317 Удалены оставшиеся отсылки к XCache.
- #2819245 «Javascript» теперь упоминается в коде как «JavaScript».
-
#3083044 (откачено) Первая колонка для таблиц с сортировкой теперь имеет стиль
display: flex;. -
#3168074 Исправлены комментарии для
FeedStorageиItemStorage. - #3154909 Употребление «not existing» заменено на «non-existent».
- #3162972 Исправлены опечатки в 32 словах для XSS тестов.
- #3169306 Исправлены дубли «the» в документации.
- #3169286 Исправлены дубли «more» в документации.
- #3169543 Из cspell словаря удалены исправленные опечатки.
-
#3170675 Адрес
http://cgit.drupalcode.orgзаменён наhttps://git.drupalcode.org/project/drupal. -
#3055193 Использование
Symfony\Component\HttpFoundation\File\MimeType\MimeTypeGuesserзаменено наSymfony\Component\Mime\MimeTypes. -
#3156944 Добавлена поддержка
nullableтайпхинта вProxyBuilder. -
#3170626 Удалено дублирование «on» в
SystemTestController. -
#3170627 Удалено дублирование «list» в
InstallHelper. - #3170629 Удалено дублирование «from» в комментариях к коду.
- #3171872 Удалено дублирование «for» в комментариях к коду.
-
#3156880
CsrfTokenGenerator::validateтеперь проверяет, является ли$tokenстрокой перед вызовомhash_equals(). -
#3173991 Передача аргументов в анонимные функции при использовании
array_*функций теперь производится без ссылки. - #3173440 Удалено дублирование «will» в комментариях к коду.
-
#3172537 Создание экземпляра
Symfony\Component\Process\Processтеперь происходит через метод::fromShellCommandline. -
#3174022 Теперь при вызове
call_user_func_array(), там где это возможно, значения аргументов передаются используяarray_values(). - #3176990 cspell теперь также проверяет файлы начинающиеся с точки.
- #3172582 Ссылка на форматы дат в PHP обновлена на новую.
- #3171267 bnjmnm добавлен в список мейнтейнеров в качестве временного мейнтейнера a11y.
-
#2607116 Удалена неиспользуемая переменная
$languageвhook_tokens_alter(). -
#3177557 Внесены улучшения в
\Drupal\error_test\Controller\ErrorTestController::generateWarnings()для совместимости с PHP 8. -
#3179013 Из теста
EntityRouteEnhancerTestудалено ненужное сравнение, которое также приводило к ошибке на PHP 8. - #3178998 Внесены улучшения в типы ошибок и сообщений об ошибках для поддержки PHP 8.
-
#3177541 Внесены улучшения в
LocalStreamдля совместимости с PHP 8. -
#3156260 Добавлена документация о
titleпеременной во всех шаблонахfeed-icon.html.twig. - #3138746 Множественные улучшения в коде где должен быть CamelCase.
-
#2987980 Произведён рефакторинг
UncaughtExceptionTest. - #3178581 Из словаря проекта удалены слова с ошибками.
- #2851394 Некорректные употребления «a» заменены на «an».
-
#3183712 Добавлена документация параметра
$operationдляhook_entity_access(). -
#3165065 Улучшена документация для методов
PluginWithFormsTrait. -
#3053897 Модулям
jsonapiиmigrate_drupal_multilingualдобавлен параметрversionв *.info.yml. -
#3183673 Применены автофиксы для стандарта
Drupal.Commenting.DocComment.ShortFullStop.
¶Ссылки
- Drupal 9.1.0 (англ.), drupal.org, 2 декабря 2020