Kiểm tra nếu một trường trống


18

Làm thế nào để bạn kiểm tra xem một trường có trống không, khi bạn có đối tượng nút $?.

Tôi thấy đây là giải pháp có thể:

$field = field_get_items('node', $node, 'field_post_image');

Tôi có thể kiểm tra ngay bây giờ:

CẬP NHẬT .Ups! Điều này không đáng tin cậy, mặc dù tôi hứa rằng nó đã làm việc cho tôi ngày hôm qua.

isset($field);

nhưng tôi tự hỏi nếu có một cách tốt hơn.

Soi sáng cho tôi

Câu trả lời:


30

Nếu bạn đọc tài liệu này , hàm sẽ trả về FALSEnếu không có dữ liệu. isset()sẽ thực sự thất bại bởi vì bạn đang gán FALSEcho biến để nó thực sự được đặt thành một cái gì đó. Cú pháp đúng sẽ là:

$field = field_get_items('node', $node, 'field_post_image');
if ($field) {
   //Do something with the field
}
else{
   //There are no results
}

Có vẻ như đây là cách tốt nhất. Nếu nó trống sẽ trả về FALSE, nếu có bất kỳ dữ liệu nào, nó sẽ trả về một mảng, vì vậy không có gì đáng lo ngại khi trường $ đánh giá thành FALSE trong trường hợp các trường số 0, v.v.
corbacho

Điều này không làm việc cho tôi vì nó trả về giá trị mặc định khi không có gì được đặt.
sông

@ Sam52 Cảm ơn! Điều này hoạt động rất tốt khi tôi đăng nhập, nhưng khi tôi đăng xuất thì nó không hiển thị gì cả. Có một lý do cho điều đó và bất kỳ giải pháp?
Dan

Chào Dân. Đăng nhập không nên có bất kỳ tác động nào đến đoạn mã trên. Có lẽ bạn đang sử dụng devel để gỡ lỗi một biến và người dùng anon không có "thông tin nhà phát triển truy cập"?
Sam52

Đây là cách kiểm tra sai nếu một trường trống, bạn nên sử dụng cách tiếp cận được mô tả bằng cách gọi hook_field_is_empty được xác định bởi mô-đun triển khai trường, xem bài đăng của kiamlaluno.
lslinnet

8

Bạn có thể sử dụng đoạn mã sau để xác minh xem trường có trống không.

$info = field_info_field($field_name);
$function = $info['module'] . '_field_is_empty';

if (function_exists($function)) {
  $value = field_get_items('node', $node, $field_name);
  $is_empty = $function($value[0], $info);
}

Mã này an toàn hơn, vì các trường khác nhau được coi là trống trong các điều kiện khác nhau. Xem, ví dụ, sự khác biệt giữa file_field_is_empty () , number_field_is_empty () , và taxonomy_field_is_empty () : taxonomy_field_is_empty()kiểm tra các tid tài sản của $itemtham số, trong khi number_field_is_empty()kiểm tra các giá trị tài sản của các thông số tương tự. Các trường tùy chỉnh có thể yêu cầu một điều kiện phức tạp hơn để được xác minh, để xem xét trường trống.

Mô tả cho hook_field_is_empty () được cung cấp trong tài liệu là mô tả sau:

Xác định những gì tạo thành một mục trống cho một loại trường.


Tôi đánh giá cao câu trả lời này, nhưng hook_field_is_empty () dường như đi rất xa. Tôi muốn biết nếu lĩnh vực này thực sự trống rỗng. Ví dụ number_field_is_empty coi 0 cũng trống. Ngoài ra tôi kiểm tra rằng bạn không thể áp dụng chức năng này trực tiếp nếu trường là đa giá trị.
corbacho

1
Đó là những gì rỗng () khi bạn truyền cho nó một biến chứa 0 hoặc chuỗi "0"; đó có thể là trường đang sử dụng một giá trị khi nó trống và gọi hook_field_is_empty () là cách duy nhất để biết trường có trống không.
kiamlaluno

Có một sai lầm. Nên là hàm $ ($ value [0], $ thông tin); Xem api.drupal.org/api/drupal/modules!field!field.api.php/feft/ khăn
volocuga

2

Chúng tôi đã tìm thấy giá trị thô trong ( $content['field_name']['#items'][0][value]), vì vậy bạn có thể xác định xem trường có trống hay không với biểu thức

(! trống ($ nội dung ['field_name'] ['# items'] [0] [value]))

trong đó field_namekhớp với tên của trường mong muốn.


Không. Khóa "value" chỉ là tên cột db. Nó có thể khác nhau tùy thuộc vào loại trường. Tôi nghĩ cách tốt nhất - kiểm tra hook_field_is_empty () (bắt buộc) như đề xuất ở trên
volocuga

1

Drupal 8

Nếu ai đó cần câu trả lời tương tự trong D8, đó là những gì tôi làm để kiểm tra lĩnh vực của mình:

if ($entity->hasField('field_event_date_start')
  && !$entity->get('field_event_date_start')->isEmpty()) {
  // Do something ...
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.