Điểm:0

FieldItemList::getValue luôn trả về một chuỗi, ngay cả đối với trường Boolean

lá cờ gr

Giả sử tôi đã thêm một trường Boolean tùy chỉnh, có số lượng thẻ là 1, vào một loại nội dung. Tôi tạo một nút của loại nội dung đó, nhập giá trị cho trường đó (ví dụ: THẬT) và lưu nút.

Khi tôi nhận được giá trị trường với $value = nút->get('field_custom')->getValue(); giá trị $ chứa mảng sau.

0 => mảng (1)
  giá trị => chuỗi (1) "1"

Có cách nào để lấy giá trị trường phản ánh loại trường, Boolean trong trường hợp này không?

0 => mảng (1)
  giá trị => boolean đúng

Tôi truyền giá trị theo cách thủ công, chẳng hạn với mã tương tự như mã sau.

// Boolean
$value = (boolean) $value;

// Số nguyên
$value = intval($value);

tôi cũng đã thử nhận ('x') -> giá trị và sử dụng __được().

Drupal biết loại trường, được trả về từ $field->getFieldDefinition()->getType(). Tôi cho rằng có một cách để truyền giá trị trường một cách chính xác.

Kevin avatar
lá cờ in
Các giá trị không được Drupal trả về.
Kevin avatar
lá cờ in
Bạn có thể truyền dưới dạng `$value = (boolean) $value;`
Điểm:3
lá cờ cn

Thông thường, việc truyền kiểu không thành vấn đề: https://softwareengineering.stackexchange.com/questions/24378/type-casting-variables-in-php-what-is-the-practical-reason-for-doing-this.

Vì vậy, việc truy xuất một giá trị trường thực thể không cần phải nhập kiểu:

$node->field_bool->value

trả về một chuỗi '0'/'1' hoặc VÔ GIÁ TRỊ nếu trường trống. Tất cả ba giá trị có thể hoạt động như mong đợi trong PHP. '1' kết quả là logic đúng và hai giá trị còn lại là sai logic. Điều này phản ánh cách nó hiển thị trong giao diện người dùng nơi hộp kiểm chỉ có thể có hai trạng thái. Trống không được chọn, đã chọn được lưu dưới dạng '1' và khi bỏ chọn lại nó được lưu dưới dạng '0'.

Tuy nhiên, hệ thống thực thể Drupal được xây dựng trên dữ liệu đã nhập và nếu bạn muốn viết mã OOP bằng cách truyền kiểu, bạn có thể:

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

lợi nhuận SAI/THẬT.

Hãy cẩn thận: Điều này không hoạt động ở cấp độ trường. Bạn cần lấy một mục trường để lấy dữ liệu đã nhập boolean và bạn phải bắt một trường trống để tránh get() trên NULL.

john Smith avatar
lá cờ gr
Cảm ơn bạn rất nhiều vì câu trả lời của bạn, tôi hoàn toàn đồng ý, đặc biệt là với "thông thường". Vì vậy, đối với trường hợp của tôi, điều này rất hữu ích và hoạt động tốt cho nguyên thủy như số nguyên, float boolean và chuỗi sẽ không sử dụng ngày giờ
4uk4 avatar
lá cờ cn
Để *truyền* một đối tượng ngày, hãy thay thế getCastedValue() bằng [DateTimeIso8601::getDateTime()](https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21TypedData%21Type%21DateTimeInterface.php /function/DateTimeInterface%3A%3AgetDateTime/9.2.x).

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.