В последнем выпуске нашего существующего модуля необходимо определить МНОЖЕСТВО новых полей, привязанных к пользователю drupal. Для каждого поля в {module}/config/Optional есть конфигурация поля и конфигурация хранения поля. Затем я реализую hook_update_n в {module}/{module}.install, чтобы обнаруживать новые записи конфигурации и добавлять их, если они не существуют. Запуск кода устанавливает конфиг (я его вижу с помощью drush cget), но не создает соответствующие таблицы БД для новых полей.
Если я перейду на большинство страниц, таких как /admin/config/люди/аккаунты/поля
, я получаю сообщение "На веб-сайте произошла непредвиденная ошибка. Повторите попытку позже".
Если я очистил кеш (драш кр
), я получаю сообщение об ошибке,
В строке 53 ExceptionHandler.php:
SQLSTATE[42S02]: базовая таблица или представление не найдены: 1146 Таблица «intranet.user__field_s_uid» не существует: SELECT «t».*
ОТ
"user__field_s_uid" "т"
ГДЕ ("entity_id" В (:db_condition_placeholder_0)) И ("удалено" = :db_condition_placeholder_1) И ("langcode" В (:db_condition_placeholder_2, :db_c
ondition_placeholder_3, :db_condition_placeholder_4))
ЗАКАЗ ПО "ДЕЛЬТА" АСЦ; Множество
(
[:db_condition_placeholder_0] => 0
[:db_condition_placeholder_1] => 0
[:db_condition_placeholder_2] => ru
[:db_condition_placeholder_3] => и
[:db_condition_placeholder_4] => zxx
)
В StatementWrapper.php строка 116:
SQLSTATE [42S02]: базовая таблица или представление не найдены: 1146 Таблица «intranet.user__field_s_uid» не существует
Чтобы сайт снова заработал, мне нужно удалить конфигурацию (drush cdel...).
Что мне не хватает, что мешает созданию хранилища БД? Нужно ли мне программно создавать таблицу БД для использования поля? (если да, то как?)
файл: {модуль}.install
<?php
используйте Drupal\Component\Serialization\Yaml;
используйте Drupal\Component\Utility\NestedArray;
используйте Drupal\field\Entity\FieldStorageConfig;
используйте Drupal\field\Entity\FieldConfig;
функция {модуль}_update_9001(&$песочница = NULL){
$modulePath = \Drupal::service('extension.list.module')
->getPath('{модуль}');
$config_factory = \Drupal::configFactory();
$configPathObjects = \Drupal::service('file_system')
->scanDirectory($modulePath.'/config/Optional','~поле.*~');
foreach ($configPathObjects как $configPath){
$config = $config_factory->getEditable($configPath->имя);
если($config->isNew()){
$configSettings = NestedArray::mergeDeep(
Ямл:: декодировать (
file_get_contents(
"$modulePath/config/необязательный/{$configPath->имя файла}"
)
),$config
);
$config->setdata($configSettings);
$config->сохранить(ИСТИНА);
}
}
}
файл: config/необязательный/field.field.user.user.field_s_uid.yml
код языка: en
статус: правда
зависимости:
конфигурация:
- field.storage.user.field_s_uid
модуль:
- пользователь
идентификатор: user.user.field_s_uid
имя_поля: field_s_uid
тип_объекта: пользователь
пакет: пользователь
метка: s_uid
описание: «Уникальный идентификатор этого пользователя, автоматически устанавливаемый БД, не должен изменяться пользователями/администраторами».
требуется: ложь
переводимый: ложный
значение по умолчанию: { }
default_value_callback: ''
настройки:
мин: ноль
максимум: ноль
префикс: ''
суффикс: ''
field_type: целое число
файл: config/необязательный/field.storage.user.field_s_uid.yml
код языка: en
статус: правда
зависимости:
модуль:
- пользователь
идентификатор: user.field_s_uid
имя_поля: field_s_uid
тип_объекта: пользователь
тип: целое число
настройки:
без знака: ложь
Размер: нормальный
модуль: ядро
заблокировано: ложь
кардинальность: 1
переводимый: правда
индексы: { }
persist_with_no_fields: ложь
custom_storage: ложь