У меня есть собственный модуль, который создает тип поля. Это обычное текстовое поле, и я добавил его к типу контента с помощью пользовательского интерфейса Drupal. Мощность этого поля "Не ограничена".
Вот как я создаю поле в коде:
класс MyItem расширяет FieldItemBase {
/**
* {@inheritdoc}
*/
схема общедоступной статической функции (FieldStorageDefinitionInterface $field_definition) {
возвращаться [
'столбцы' => [
'значение' => [
'тип' => 'текст',
'размер' => 'крошечный',
'не нуль' => ЛОЖЬ,
],
'безопасное значение' => [
'тип' => 'текст',
'размер' => 'крошечный',
'не нуль' => ЛОЖЬ,
],
],
];
}
/**
* {@inheritdoc}
*/
общедоступная статическая функция propertyDefinitions (FieldStorageDefinitionInterface $field_definition) {
$properties['значение'] = DataDefinition::create('строка')
->setLabel(t('Значение'));
$properties['safevalue'] = DataDefinition::create('string')
->setLabel(t('Безопасное значение'))
->setComputed(ИСТИНА);
вернуть $свойства;
}
}
Как видите, есть две колонки: стоимость
предполагается хранить необработанный пользовательский ввод. безопасная стоимость
предполагается хранить очищенную версию данных.
Для проверки этого. Я просто делаю это внутри hook_node_presave()
:
функция mymodule_node_presave(\Drupal\Core\Entity\EntityInterface $entity) {
переключатель ($entity->getBundle()) {
случай 'мой бандл':
$entity->field_myfield = ['один', 'два', 'три'];
$entity->field_myfield->safevalue = ['один', 'два', 'три'];
сломать;
}
}
Если поле имеет кардинальность 1 (т. е. вставленные значения являются скалярами), это работает нормально.
Однако, если я вставляю массивы, когда я просматриваю базу данных и смотрю на таблицу node__field_myfield
, я вижу, что столбцы field_myfield_value
и field_myfield_safevalue
оба существуют с идентичными конфигурациями.
Если я создаю узел с помощью пользовательского интерфейса, я наблюдаю это:
field_myfield_value
столбец содержит три строки со строками «один», «два» и «три». Правильно.
field_myfield_safevalue
иметь строку «Массив» в первой строке и NULL в двух других. Это неверно.
Я предполагаю, что все идет не так, потому что это поле с несколькими значениями, и мне нужно использовать какое-то другое действие, чтобы правильно вставить значения.
Как я могу правильно вставить многозначное поле в безопасная стоимость
столбец?