Рейтинг:0

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

флаг kz

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

  1. Точное строковое значение, введенное пользователем.
  2. Безопасное значение той же строки.

Вот как я создаю поле:

класс MyItem расширяет FieldItemBase {

  /**
   * {@inheritdoc}
   */
  схема общедоступной статической функции (FieldStorageDefinitionInterface $field_definition) {
    возвращаться [
      'столбцы' => [
        'значение' => [
          'тип' => 'текст',
          'размер' => 'крошечный',
          'не нуль' => ЛОЖЬ,
        ],
        'безопасное значение' => [
          'тип' => 'текст',
          'размер' => 'крошечный',
          'не нуль' => ЛОЖЬ,
        ],
      ],
    ];
  }
¦

}

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

У меня нет проблем с получением строкового значения, введенного пользователем, и вычислением безопасного значения:

$value = $entity->field_myfield->getString();
$safevalue = makeSafe($value);

Но я не знаю, как получить $безопасное значение хранится в базе данных.

Редактировать

Я вижу, что у этого есть два почти идентичных ответа. Оба работают нормально, если мощность поля равна единице, поэтому я проголосовал за оба. Поскольку я не могу принять оба, я принял тот, что от apaderno, для дополнительной информации о определения свойств ().

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

Рейтинг:2
флаг us

Если safeValue был определен как свойство поля в определения свойств (), к нему можно получить доступ как $entity->field_myfield->safeValue, либо прочитать его, либо написать.

В ядре Drupal примером поля, в котором хранится обработанная копия значения поля, является TextItem класс, чьи определения свойств () метод содержит следующий код.

$properties['значение'] = DataDefinition::create('строка')
  ->setLabel(t('Текст'))
  -> установитьТребуется(ИСТИНА);
$properties['format'] = DataDefinition::create('filter_format')->setLabel(t('Формат текста'));
$properties['обработано'] = DataDefinition::create('строка')
  ->setLabel(t('Обработанный текст'))
  ->setDescription(t('Текст с примененным текстовым форматом.'))
  ->setComputed(ИСТИНА)
  ->setClass('\Drupal\text\TextProcessed')
  ->setSetting('источник текста', 'значение')
  -> setInternal (ЛОЖЬ);

Этот класс определяет свойство как вычисляемое. Вот почему его схема() метод не включает это свойство.

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

Для сохранения:

$value = $entity->field_myfield->getString();
$entity->field_myfield->safevalue = makeSafe($value);

Для загрузки:

$safe_value = $entity->field_myfield->safevalue;

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

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