Làm cách nào để có được danh sách tất cả các giá trị được chọn cho một trường theo chương trình?


7

Làm cách nào tôi có thể nhận được danh sách tất cả các giá trị được chọn cho một trường?

Ví dụ: tôi có một trường được gọi là các quốc gia và tôi muốn nhận tất cả các quốc gia được chọn cho một nút nhất định.

Tôi cần phải có danh sách này, vì tôi muốn khu vực được tự động chọn trong một lĩnh vực (khu vực) khác, theo quốc gia được chọn.

Ví dụ: Tôi chọn Pháp ở các quốc gia, sau đó tự động khu vực châu Âu được chọn theo khu vực

Hiện tại tôi chỉ có thể sao chép các giá trị đã chọn trong trường "quốc gia", trong trường "khu vực" bằng cách thực hiện việc này:

$node->field_regions = $node->field_countries;

Đây là kết quả khi tôi chọn Pháp trong lĩnh vực quốc gia:

Country: France

Regions: France

Chỉnh sửa : Tôi đã thử với hàm: field_get_items (), nhưng tất cả những gì tôi nhận được là một mảng:

$items = field_get_items('node', $node, 'field_countries', $node->language);

Có cái gì đó không đúng? Tôi cũng đã thử với điều này nhưng tôi nhận được kết quả tương tự ...

$items = $node->field_countries[$node->language][0]

Câu trả lời:


7

Bởi vì các trường có thể có nhiều giá trị cả hai phương thức bạn mô tả sẽ trả về một mảng. Mỗi mục mảng đó sẽ là một mảng, trong tất cả các cột có thể có cho trường. Trong trường hợp các trường văn bản, cột duy nhất bạn thực sự cần phải lo lắng là valuecột.

Giả sử trường cụ thể của bạn không chấp nhận nhiều giá trị hoặc nó có và bạn chỉ muốn giá trị đầu tiên, sau đây sẽ hoạt động:

$items = field_get_items('node', $node, 'field_countries', $node->language);
$item = array_shift($items);
$value = $item['value'];

hoặc là

$value = $node->field_countries[$node->language][0]['value'];

Cảm ơn bạn đây là chính xác những gì tôi cần. Chỉ một điều nữa. Trường quốc gia của tôi chấp nhận nhiều giá trị. Làm thế nào để tôi có được tất cả các giá trị? Tôi biết tôi phải nghiêm túc nghiên cứu PHP
118218

1
Bạn thường sẽ lặp qua chúng với một foreach, đại loại như:foreach ($node->field_countries[$node->language] as $item) { $val = $item['value']; // Do something with $val }
Clive

Điều quan trọng là luôn luôn kiểm tra xem mảng của các mục có trống không, hoặc nếu đó là một mảng nào cả! Tôi sẽ viết một câu trả lời mới, vì nó quá nhiều thay đổi cho một chỉnh sửa.
donquixote

6

field_get_items()là giải pháp thường được đề nghị. Tuy nhiên, có một số hãy cẩn thận.

Điều quan trọng là kiểm tra nếu trường trống. Trong trường hợp này, field_get_items () trả về false (mà hút).

$items = field_get_items('node', $node, 'field_countries', $node->language);
if (!empty($items)) {
  $item = reset($items);
  return $item['value'];
}
else {
  return NULL;
}

Tôi nghĩ bạn thường có thể chắc chắn rằng nếu một vật phẩm tồn tại, nó sẽ nằm trong chỉ số zero [0]. Và isset () là một điều rất mạnh mẽ. Vì vậy, các công việc sau đây là tốt:

$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]['value']) ? $items[0]['value'] : NULL;

Đối với một số loại trường, giá trị không nằm trong $ item ['value'] mà là $ item ['tid'] hoặc thứ gì khác.
Trong trường hợp thông thường (tôi không thể nghĩ ra một ngoại lệ atm), giá trị sẽ là điều đầu tiên trong mảng $ item. Vì vậy, những điều sau đây cũng sẽ hoạt động, nhưng điều này là do sự trùng hợp ngẫu nhiên hơn là do thiết kế. Vì vậy, cá nhân tôi sẽ không dựa vào nó.
(Nếu $ item là một mảng (không trống), thì chúng ta có thể (*) giả định rằng mọi mục $ cũng sẽ là một mảng chứ không phải là một thứ gì khác.)

$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]) ? reset($items[0]) : NULL;

Giá trị trả về của field_get_items () là theo giá trị, do đó, nói chung là ổn khi sửa đổi mảng $ items. Điều này có nghĩa là bạn có thể sử dụng mảng_shift ().

$items = field_get_items('node', $node, 'field_countries', $node->language);
return !empty($items) ? array_shift(array_shift($items)) : NULL;

(*) Hầu hết các giả định chúng tôi đưa ra ở đây không dựa trên các đảm bảo ở cấp độ ngôn ngữ, mà chỉ dựa trên cách thức hoạt động của Drupal.

Btw thủ thuật sau đây đôi khi có thể hữu ích, nhưng nó không phải là một giải pháp hoàn chỉnh cho câu hỏi ban đầu:

$items = field_get_items(..) ?: array();

Điều này đảm bảo rằng các mục $ luôn là một mảng. Nhưng đối với các đoạn trên, điều này không thực sự giúp chúng tôi.

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.