Cea mai recentă versiune a modulului nostru existent trebuie să definească MULTE câmpuri noi care sunt atașate utilizatorului drupal. Pentru fiecare câmp, în {module}/config/optional există o configurație de câmp și o configurare de stocare a câmpului. Apoi implementez hook_update_n în {module}/{module}.install pentru a detecta noile intrări de configurare și pentru a le adăuga dacă nu există. Rularea codului instalează configurația (o pot vedea cu drush cget), dar nu creează tabelele DB corespunzătoare pentru noile câmpuri.
Dacă merg la majoritatea paginilor, cum ar fi /admin/config/people/accounts/fields
, primesc „Site-ul web a întâmpinat o eroare neașteptată. Vă rugăm să încercați din nou mai târziu.”
Dacă șterg memoria cache (drush cr
), primesc o eroare care spune:
În linia 53 ExceptionHandler.php:
SQLSTATE[42S02]: Tabelul de bază sau vizualizarea nu a fost găsită: 1146 Tabelul „intranet.user__field_s_uid” nu există: SELECT „t”.*
DIN
„user__field_s_uid” „t”
WHERE ("entity_id" IN (:db_condition_placeholder_0)) AND ("deleted" = :db_condition_placeholder_1) AND ("langcode" IN (:db_condition_placeholder_2, :db_c
ondition_placeholder_3, :db_condition_placeholder_4))
COMANDA PENTRU „delta” ASC; Matrice
(
[:db_condition_placeholder_0] => 0
[:db_condition_placeholder_1] => 0
[:db_condition_placeholder_2] => ro
[:db_condition_placeholder_3] => und
[:db_condition_placeholder_4] => zxx
)
În linia 116 StatementWrapper.php:
SQLSTATE[42S02]: Tabelul de bază sau vizualizarea nu a fost găsită: 1146 Tabelul „intranet.user__field_s_uid” nu există
Pentru ca site-ul să funcționeze din nou, trebuie să șterg configurația (drush cdel...).
Ce îmi lipsește care împiedică crearea stocării db? Trebuie să creez în mod programatic tabelul db pentru ca câmpul să fie utilizat? (dacă da, cum?)
fișier: {modul}.install
<?php
utilizați Drupal\Component\Serialization\Yaml;
utilizați Drupal\Component\Utility\NestedArray;
utilizați Drupal\field\Entity\FieldStorageConfig;
utilizați Drupal\field\Entity\FieldConfig;
funcția {module}_update_9001(&$sandbox = NULL){
$modulePath = \Drupal::service('extension.list.module')
->getPath('{modul}');
$config_factory = \Drupal::configFactory();
$configPathObjects = \Drupal::service('sistem_fișier')
->scanDirectory($modulePath.'/config/optional','~field.*~');
foreach ($configPathObjects ca $configPath){
$config = $config_factory->getEditable($configPath->name);
if($config->isNew()){
$configSettings = NestedArray::mergeDeep(
Yaml::decode(
file_get_contents(
„$modulePath/config/optional/{$configPath->filename}”
)
),$config
);
$config->setdata($configSettings);
$config->salvare(ADEVĂRAT);
}
}
}
fișier: config/optional/field.field.user.user.field_s_uid.yml
langcode: en
stare: adevărat
dependențe:
config:
- field.storage.user.field_s_uid
modul:
- utilizator
id: user.user.field_s_uid
field_name: field_s_uid
entity_type: utilizator
pachet: utilizator
etichetă: s_uid
descriere: „ID-ul unic pentru acest utilizator, setat automat de DB, nu ar trebui să fie modificat de utilizatori/administratori”.
cerut: fals
traducabil: fals
valoare implicită: { }
default_value_callback: ''
setari:
min: nul
max: nul
prefix: ''
sufix: ''
tip_câmp: întreg
fișier: config/optional/field.storage.user.field_s_uid.yml
langcode: en
stare: adevărat
dependențe:
modul:
- utilizator
id: user.field_s_uid
field_name: field_s_uid
entity_type: utilizator
tip: întreg
setari:
nesemnat: fals
dimensiune: normală
modul: nucleu
blocat: fals
cardinalitate: 1
traducebil: adevărat
indexuri: { }
persist_with_no_fields: false
stocare_personalizată: fals