Рейтинг:0

FieldItemList::getValue всегда возвращает строку, даже для логического поля.

флаг gr

Предположим, я добавил пользовательское логическое поле с кардинальностью 1 в тип контента. Я создаю узел этого типа контента, ввожу значение для этого поля (например, ПРАВДА) и сохраните узел.

Когда я получаю значение поля с $value = node->get('field_custom')->getValue(); $значение содержит следующий массив.

0 => массив (1)
  значение => строка (1) "1"

Есть ли способ получить значение поля, отражающее тип поля, в данном случае логическое?

0 => массив (1)
  значение => логическое значение true

Я вручную привожу значение, например, с кодом, подобным следующему.

// логическое значение
$значение = (логическое) $значение;

// Целое число
$значение = интервал($значение);

я тоже пробовал получить('x')->значение и используя __получать().

Drupal знает тип поля, которое возвращается из $field->getFieldDefinition()->getType(). Я полагаю, что есть способ правильно указать значение поля.

Kevin avatar
флаг in
Значения не приводятся при возврате Drupal.
Kevin avatar
флаг in
Вы можете использовать как `$value = (boolean) $value;`
Рейтинг:3
флаг cn

Обычно приведение типов не имеет значения: https://softwareengineering.stackexchange.com/questions/24378/type-casting-variables-in-php-what-is-the-practical-reason-for-doing-this.

Таким образом, получение значения поля сущности не требует приведения типов:

$узел->field_bool->значение

возвращает строку '0'/'1' или же НОЛЬ если поле пустое. Все три возможных значения работают, как и ожидалось, в PHP. '1' приводит к логическому истине, а два других значения к логическому ложному. Это отражает то, как он отображается в пользовательском интерфейсе, где флажок может иметь только два состояния. Пусто не отмечено, проверено сохраняется как '1' и когда он снова не отмечен, он сохраняется как '0'.

Однако система сущностей Drupal построена на типизированных данных, и если вы хотите писать ООП-код с приведением типов, вы можете:

$node->field_bool->first()->get('value')->getCastedValue()

возвращается ЛОЖНЫЙ/ПРАВДА.

Предостережение: это не работает на уровне поля. Вам нужно получить элемент поля, чтобы получить логические типизированные данные, и вам нужно поймать пустое поле, чтобы избежать get() на NULL.

john Smith avatar
флаг gr
Большое спасибо за ваш ответ, я полностью согласен, особенно с «нормально». Так что для моего случая это очень полезно и хорошо работает для примитивов, таких как целое число, логическое значение с плавающей запятой и строка, не будет отображать дату и время
4uk4 avatar
флаг cn
Чтобы *привести* объект даты, замените getCastedValue() на [DateTimeIso8601::getDateTime()](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21TypedData%21Type%21DateTimeInterface.php /function/DateTimeInterface%3A%3AgetDateTime/9.2.x).

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

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