Перейти к основному содержанию

Drupal 9 — патч для обновления модуля Metatag

Drupal 9

Обновляю в Drupal 9 модуль Metatag на версию 1.25. Для 2.0 тоже подойдёт, только там номера строк другие.

drupal

Применяю обновление базы. Должен выполниться скрипт "Remove 'noydir', 'noodp' ROBOTS options from meta tag entity fields."

drupal

Подучаю ошибку.

Возникла 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, пробую обновиться на неё.

drupal

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.

  • /**
     * 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;
    }

drupal

Обновляю.

drupal

Теги

 

Похожие материалы

Обновление Drupal 9 до Drupal 10 в Windows

Пока не закончились новогодние праздники нужно успеть сделать одно хорошее дело. А именно, обновить движок сайта с Drupal 9 на Drupal 10. Посетителей не много, все отдыхают. Так что самое время.

Drupal — добавляем виджет комментариев "В контакте"

Раньше у меня на сайте стояла система комментариев Disqus. В какой-то момент времени она стала отображать назойливую рекламу. Было принято решение поставить на Drupal 8 виджет комментариев "В контакте".

Теги

Drupal — размещение блока в произвольном месте статьи

Многие владельцы сайтов сталкиваются с необходимостью размещения дополнительных блоков в своих статьях. Это может быть рекламный блок или какое-то объявление. Или просто какое-то декоративное праздничное оформление сайта.

Теги