Рейтинг:0

Как я могу правильно вставить многозначное поле?

флаг kz

У меня есть собственный модуль, который создает тип поля. Это обычное текстовое поле, и я добавил его к типу контента с помощью пользовательского интерфейса 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 в двух других. Это неверно.

Я предполагаю, что все идет не так, потому что это поле с несколькими значениями, и мне нужно использовать какое-то другое действие, чтобы правильно вставить значения.

Как я могу правильно вставить многозначное поле в безопасная стоимость столбец?

Рейтинг:3
флаг cn

Дельты полей на один уровень выше, чем свойства.

$entity->field_myfield = [
  0 => [
    'значение' => 'один',
    'безопасное значение' => 'один',
  ],
  1 => [
    'значение' => 'два',
    'безопасное значение' => 'два',
  ],
  2 => [
    'значение' => 'три',
    'безопасное значение' => 'три',
  ],
];

Кстати, когда вы сохраняете свойство поля, не указывайте >setComputed(TRUE). Это только при вычислении значения поля в плагине типизированных данных.

Free Radical avatar
флаг kz
Я не уверен, что понимаю ваше "кстати". Цель состоит в том, чтобы *вычислить* безопасные значения, пропустив необработанные значения через некоторую функцию очистки. В примере я этого не делал, чтобы упростить пример. Если я вычисляю безопасные значения, как описано, не должен ли я использовать `->setComputed(TRUE)`?
4uk4 avatar
флаг cn
Вычисленные значения рассчитываются в памяти, а не сохраняются в базе данных. Обычно это делается в плагине типизированных данных (указанном в `DataDefinition::create()` или переопределенном в `->setClass()`. Тогда у вас не будет проблем с дельтами полей, потому что типизированные данные более гранулированы. .
Free Radical avatar
флаг kz
Хорошо, спасибо за дополнительное объяснение. Я удалил свойство.
Рейтинг:1
флаг cn

Когда вы получаете доступ

$entity->field_myfield->безопасное значение

Это неявно первый элемент в списке полей safevalue. Вы не устанавливаете безопасное значение для всех дельт в этом поле.

Для этого вам нужно установить каждое значение отдельно. Вот так:

$значения = [
  ['value' => 'foo', 'safevalue' => 'bar'],
  ['значение' => 'foo2', 'безопасное значение' => 'bar2'],
];
$entity->field_myfield = $values;

Обратите внимание, что есть несколько различных перестановок вышеперечисленного, это только одна из них, если ваш обычный стиль кода для установки свойств объекта отличается, вы можете использовать его вместо этого.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.