รุ่นล่าสุดของโมดูลที่มีอยู่ของเราจำเป็นต้องกำหนดฟิลด์ใหม่จำนวนมากที่แนบกับผู้ใช้ drupal สำหรับแต่ละฟิลด์ ใน {module}/config/optional จะมีฟิลด์ config และฟิลด์ storage config จากนั้นฉันใช้ hook_update_n ใน {module}/{module}.install เพื่อตรวจหารายการกำหนดค่าใหม่ และเพิ่มเข้าไปหากไม่มีอยู่ การรันโค้ดจะติดตั้งการกำหนดค่า (ฉันสามารถเห็นได้ด้วย drush cget) แต่ไม่ได้สร้างตาราง DB ที่สอดคล้องกันสำหรับฟิลด์ใหม่
ถ้าฉันไปที่หน้าส่วนใหญ่เช่น /admin/config/people/accounts/fields
ฉันได้รับ "เว็บไซต์พบข้อผิดพลาดที่ไม่คาดคิด โปรดลองอีกครั้งในภายหลัง"
ถ้าฉันล้างแคช (ดรัช cr
) ฉันได้รับข้อผิดพลาดที่ระบุว่า
ใน ExceptionHandler.php บรรทัดที่ 53:
SQLSTATE[42S02]: ไม่พบตารางฐานหรือมุมมอง: 1146 ไม่มีตาราง 'intranet.user__field_s_uid': SELECT "t".*
จาก
"ผู้ใช้__field_s_uid" "t"
WHERE ("entity_id" IN (:db_condition_placeholder_0)) และ ("deleted" = :db_condition_placeholder_1) และ ("langcode" IN (:db_condition_placeholder_2, :db_c
ondition_placeholder_3, :db_condition_placeholder_4))
สั่งซื้อโดย "เดลต้า" ASC; อาร์เรย์
(
[:db_condition_placeholder_0] => 0
[:db_condition_placeholder_1] => 0
[:db_condition_placeholder_2] => th
[:db_condition_placeholder_3] => และ
[:db_condition_placeholder_4] => zxx
)
ใน StatementWrapper.php บรรทัดที่ 116:
SQLSTATE[42S02]: ไม่พบตารางฐานหรือมุมมอง: 1146 ไม่มีตาราง 'intranet.user__field_s_uid'
เพื่อให้ไซต์ทำงานได้อีกครั้ง ฉันต้องลบการกำหนดค่า (drush cdel...)
ฉันพลาดอะไรไปที่ทำให้ไม่สามารถสร้างที่เก็บข้อมูล db ได้ ฉันจำเป็นต้องสร้างตาราง db โดยทางโปรแกรมเพื่อให้ฟิลด์ใช้หรือไม่ (ถ้าเป็นเช่นนั้นได้อย่างไร)
ไฟล์: {module}.install
<?php
ใช้ Drupal\Component\Serialization\Yaml;
ใช้ Drupal\Component\Utility\NestedArray;
ใช้ Drupal\field\Entity\FieldStorageConfig;
ใช้ Drupal\field\Entity\FieldConfig;
ฟังก์ชัน {โมดูล}_update_9001(&$sandbox = NULL){
$modulePath = \Drupal::service('extension.list.module')
->getPath('{โมดูล}');
$config_factory = \Drupal::configFactory();
$configPathObjects = \Drupal::service('file_system')
->scanDirectory($modulePath.'/config/ทางเลือก','~field.*~');
foreach ($configPathObjects เป็น $configPath){
$config = $config_factory->getEditable($configPath->ชื่อ);
ถ้า($config->isNew()){
$configSettings = NestedArray::mergeDeep(
Yaml::ถอดรหัส(
file_get_contents(
"$modulePath/config/ทางเลือก/{$configPath->ชื่อไฟล์}"
)
),$การกำหนดค่า
);
$config->setdata($configSettings);
$config->save(จริง);
}
}
}
ไฟล์: config/ทางเลือก/field.field.user.user.field_s_uid.yml
รหัสภาษา: th
สถานะ: จริง
การพึ่งพา:
การกำหนดค่า:
- field.storage.user.field_s_uid
โมดูล:
- ผู้ใช้
รหัส: user.user.field_s_uid
field_name: field_s_uid
entity_type: ผู้ใช้
กลุ่ม: ผู้ใช้
ป้ายกำกับ: s_uid
คำอธิบาย: 'ID เฉพาะสำหรับผู้ใช้นี้ ซึ่งตั้งค่าโดยอัตโนมัติโดย DB ไม่ควรแก้ไขโดยผู้ใช้/ผู้ดูแลระบบ'
จำเป็น: เท็จ
แปลได้: เท็จ
default_value: { }
default_value_callback: ''
การตั้งค่า:
นาที: เป็นโมฆะ
สูงสุด: null
คำนำหน้า: ''
คำต่อท้าย: ''
field_type: จำนวนเต็ม
ไฟล์: config/ทางเลือก/field.storage.user.field_s_uid.yml
รหัสภาษา: th
สถานะ: จริง
การพึ่งพา:
โมดูล:
- ผู้ใช้
รหัส: user.field_s_uid
field_name: field_s_uid
entity_type: ผู้ใช้
ประเภท: จำนวนเต็ม
การตั้งค่า:
ไม่ได้ลงนาม: เท็จ
ขนาด: ปกติ
โมดูล: แกน
ล็อค: เท็จ
จำนวนสมาชิก: 1
แปลได้: จริง
ดัชนี: { }
Persis_with_no_fields: เท็จ
custom_storage: เท็จ