Bản phát hành mới nhất của mô-đun hiện có của chúng tôi cần xác định NHIỀU trường mới được đính kèm với người dùng drupal. Đối với mỗi trường, trong {module}/config/tùy chọn có cấu hình trường và cấu hình lưu trữ trường. Sau đó, tôi triển khai hook_update_n trong {module}/{module}.install để phát hiện các mục cấu hình mới và thêm chúng nếu chúng không tồn tại. Chạy mã sẽ cài đặt cấu hình (tôi có thể thấy nó bằng drush cget), nhưng không tạo các bảng DB tương ứng cho các trường mới.
Nếu tôi đi đến hầu hết các trang, chẳng hạn như /admin/config/người/tài khoản/trường
, tôi nhận được "Trang web gặp phải lỗi không mong muốn. Vui lòng thử lại sau."
Nếu tôi xóa bộ nhớ cache (drush cr
), tôi gặp lỗi cho biết,
Trong ExceptionHandler.php dòng 53:
SQLSTATE[42S02]: Không tìm thấy bảng cơ sở hoặc dạng xem: 1146 Bảng 'intranet.user__field_s_uid' không tồn tại: CHỌN "t".*
TỪ
"user__field_s_uid" "t"
WHERE ("entity_id" IN (:db_condition_placeholder_0)) AND ("đã xóa" = :db_condition_placeholder_1) AND ("langcode" IN (:db_condition_placeholder_2, :db_c
ondition_placeholder_3, :db_condition_placeholder_4))
ĐẶT HÀNG BẰNG ASC "delta"; Mảng
(
[:db_condition_placeholder_0] => 0
[:db_condition_placeholder_1] => 0
[:db_condition_placeholder_2] => vi
[:db_condition_placeholder_3] => không
[:db_condition_placeholder_4] => zxx
)
Trong StatementWrapper.php dòng 116:
SQLSTATE [42S02]: Không tìm thấy bảng cơ sở hoặc dạng xem: 1146 Bảng 'intranet.user__field_s_uid' không tồn tại
Để trang web hoạt động trở lại, tôi phải xóa cấu hình (drush cdel ...).
Tôi đang thiếu điều gì khiến bộ lưu trữ db không được tạo? Tôi có cần tạo bảng db theo chương trình cho trường để sử dụng không? (nếu vậy, làm thế nào?)
tệp: {module}.install
<?php
sử dụng Drupal\Component\Serialization\Yaml;
sử dụng Drupal\Thành phần\Tiện ích\NestedArray;
sử dụng Drupal\field\Entity\FieldStorageConfig;
sử dụng Drupal\field\Entity\FieldConfig;
hàm {module}_update_9001(&$sandbox = NULL){
$modulePath = \Drupal::service('extension.list.module')
->getPath('{module}');
$config_factory = \Drupal::configFactory();
$configPathObjects = \Drupal::service('file_system')
->scanDirectory($modulePath.'/config/tuỳ chọn','~field.*~');
foreach ($configPathObjects dưới dạng $configPath){
$config = $config_factory->getEditable($configPath->name);
if($config->isNew()){
$configSettings = NestedArray::mergeDeep(
Yaml::giải mã(
file_get_contents(
"$modulePath/config/tùy chọn/{$configPath->tên tệp}"
)
),$config
);
$config->setdata($configSettings);
$config->save(TRUE);
}
}
}
tệp: config/tùy chọn/field.field.user.user.field_s_uid.yml
mã ngôn ngữ: en
trạng thái: đúng
phụ thuộc:
cấu hình:
- trường.storage.user.field_s_uid
mô-đun:
- người dùng
id: user.user.field_s_uid
tên_trường: field_s_uid
entity_type: người dùng
gói: người dùng
nhãn: s_uid
description: 'ID duy nhất cho người dùng này, được đặt tự động bởi DB, không được sửa đổi bởi người dùng/quản trị viên.'
bắt buộc: sai
có thể dịch: sai
giá trị mặc định: { }
default_value_callback: ''
cài đặt:
tối thiểu: không
tối đa: không
tiếp đầu ngữ: ''
hậu tố: ''
field_type: số nguyên
tệp: config/tùy chọn/field.storage.user.field_s_uid.yml
mã ngôn ngữ: en
trạng thái: đúng
phụ thuộc:
mô-đun:
- người dùng
id: user.field_s_uid
tên_trường: field_s_uid
entity_type: người dùng
loại: số nguyên
cài đặt:
không dấu: sai
kích thước: bình thường
mô-đun: lõi
bị khóa: sai
quân số: 1
có thể dịch: đúng
chỉ mục: { }
kiên trì_with_no_fields: sai
custom_storage: sai