Обновляю в Drupal 9 модуль Metatag на версию 1.25. Для 2.0 тоже подойдёт, только там номера строк другие.
Применяю обновление базы. Должен выполниться скрипт "Remove 'noydir', 'noodp' ROBOTS options from meta tag entity fields."
Подучаю ошибку.
Возникла AJAX HTTP ошибка.
Полученный код HTTP: 200
Следует отладочная информация.
Путь: /update.php/start?id=270&op=do_nojs&op=do
Текст Состояния: OK
Текст Ответа: Error: Call to undefined method Drupal\Core\Entity\ContentEntityNullStorage::getTableMapping() in metatag_post_update_remove_robots_noydir_noodp() (line 259 of C:\drupal\example.com\docs\modules\metatag\metatag.post_update.php).
Косяк в функции metatag_post_update_remove_robots_noydir_noodp(). Вычитал на форуме, что похожую ошибку поправили в версии 1.26, пробую обновиться на неё.
Warning: Undefined array key 1 in Drupal\system\Controller\DbUpdateController->results() (line 423 of core\modules\system\src\Controller\DbUpdateController.php).
Drupal\system\Controller\DbUpdateController->results(Object) (Line: 179)
Drupal\system\Controller\DbUpdateController->handle('results', Object)
call_user_func_array(Array, Array) (Line: 115)
Drupal\Core\Update\UpdateKernel->handleRaw(Object) (Line: 76)
Drupal\Core\Update\UpdateKernel->handle(Object) (Line: 27)
Ошибка немного другая.
Возникла AJAX HTTP ошибка.
Полученный код HTTP: 200
Следует отладочная информация.
Путь: /update.php/start?id=273&op=do_nojs&op=do
Текст Состояния: OK
Текст Ответа: Error: Call to undefined method Drupal\Core\Entity\ContentEntityNullStorage::getTableMapping() in _metatag_list_entity_field_tables() (line 65 of C:\drupal\example.com\docs\modules\metatag\metatag.post_update.php).
Теперь ошибка в функции _metatag_list_entity_field_tables(). Залез в код и понял, что кусок кода один и тот же, просто перемещён.
Не стал делать патч, просто поправил ручками (версия 1.26) файл metatag.post_update.php. Сделал проверку на ContentEntityNullStorage.
-
Функция _metatag_list_entity_field_tables()
/** * Get a list of all metatag field tables. * * @return array * A list of meta tag field tables with the table name as the key and the * field value column as the value, e.g.: * - node__field_meta_tags: field_meta_tags_value * - node_revision__field_meta_tags: field_meta_tags_value */ function _metatag_list_entity_field_tables(): array { static $drupal_static_fast; if (!isset($drupal_static_fast)) { $drupal_static_fast[__FUNCTION__] = &drupal_static(__FUNCTION__); } $tables = &$drupal_static_fast[__FUNCTION__]; if (is_null($tables)) { $tables = []; $entity_type_manager = \Drupal::entityTypeManager(); $database = \Drupal::database(); // Get all of the field storage entities of type metatag. /** @var \Drupal\field\FieldStorageConfigInterface[] $field_storage_configs */ $field_storage_configs = $entity_type_manager ->getStorage('field_storage_config') ->loadByProperties(['type' => 'metatag']); foreach ($field_storage_configs as $field_storage) { $field_name = $field_storage->getName(); // Get the individual fields (field instances) associated with bundles. // This query can result in an exception if a field configuration is // faulty. // @see https://www.drupal.org/project/metatag/issues/3366933 try { $fields = $entity_type_manager ->getStorage('field_config') ->loadByProperties([ 'field_name' => $field_name, 'entity_type' => $field_storage->getTargetEntityTypeId(), ]); } catch (PluginNotFoundException $e) { throw new \Exception("There is a problem in the field configuration, see https://www.drupal.org/node/3366933 for discussion on how to resolve it.\nOriginal message: " . $e->getMessage()); } $tables = []; foreach ($fields as $field) { $entity_type_id = $field->getTargetEntityTypeId(); $entity_type = $entity_type_manager->getDefinition($entity_type_id); // Determine the table and "value" field names. $table_mapping_storage = $entity_type_manager->getStorage($entity_type_id); if ($table_mapping_storage->hasData()) { $table_mapping = $table_mapping_storage->getTableMapping(); $field_table = $table_mapping->getFieldTableName($field_name); $field_value_field = $table_mapping->getFieldColumnName($field_storage, 'value'); $tables[$field_table] = $field_value_field; if ($entity_type->isRevisionable() && $field_storage->isRevisionable()) { if ($table_mapping->requiresDedicatedTableStorage($field_storage)) { $revision_table = $table_mapping->getDedicatedRevisionTableName($field_storage); if ($database->schema()->tableExists($revision_table)) { $tables[$revision_table] = $field_value_field; } } elseif ($table_mapping->allowsSharedTableStorage($field_storage)) { $revision_table = $entity_type->getRevisionDataTable() ?: $entity_type->getRevisionTable(); if ($database->schema()->tableExists($revision_table)) { $tables[$revision_table] = $field_value_field; } } } } } } } return $tables; }
Обновляю.