Am un modul personalizat care creează un tip de câmp. Este un câmp text simplu și l-am adăugat la un tip de conținut folosind interfața de utilizare Drupal. Cardinalitatea acestui câmp este „Nelimitat”.
Iată cum creez câmpul în cod:
clasa MyItem extinde FieldItemBase {
/**
* {@inheritdoc}
*/
schema funcției statice publice (FieldStorageDefinitionInterface $field_definition) {
întoarcere [
'coloane' => [
„valoare” => [
'type' => 'text',
'dimensiune' => 'minuscul',
„nu nul” => FALSE,
],
'safevalue' => [
'type' => 'text',
'dimensiune' => 'minuscul',
„nu nul” => FALSE,
],
],
];
}
/**
* {@inheritdoc}
*/
funcția publică statică propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
$properties['value'] = DataDefinition::create('șir')
->setLabel(t('Valoare'));
$properties['safevalue'] = DataDefinition::create('șir')
->setLabel(t('Valoare sigură'))
->setComputed(TRUE);
returnează $proprietăți;
}
}
După cum puteți vedea, există două coloane: valoare
ar trebui să stocheze intrarea brută a utilizatorului. valoare de siguranță
ar trebui să stocheze o versiune igienizată a datelor.
Pentru testarea asta. Fac asta doar în interior hook_node_presave()
:
function mymodule_node_presave(\Drupal\Core\Entity\EntityInterface $entity) {
comutați ($entity->getBundle()) {
caz „mybundle”:
$entity->field_myfield = ['unu', 'două', 'trei'];
$entity->field_myfield->safevalue = ['unu', 'două', 'trei'];
pauză;
}
}
Dacă câmpul are cardinalitatea 1 (adică valorile introduse sunt scalare), aceasta funcționează bine.
Cu toate acestea, dacă inserez matrice, când examinez baza de date și mă uit la tabel node__câmp_câmpul meu
, văd că coloanele field_myfield_value
și field_myfield_safevalue
ambele există cu configurații identice.
Dacă creez un nod folosind UI, observ asta:
field_myfield_value
coloana conține trei rânduri cu șirurile „unu”, „două” și „trei”. Este corect.
field_myfield_safevalue
au șirul „Matrice” în primul rând și NULL în celelalte două. Este gresit.
Bănuiesc că ceea ce face ca lucrurile să meargă prost este că acesta este un câmp cu mai multe valori și că trebuie să folosesc o altă acțiune pentru a introduce valorile corect.
Cum pot obține un câmp cu mai multe valori inserat corect în valoare de siguranță
coloană?