Làm cách nào tôi có thể nhận được gói thực thể từ loại và id?


11

Tôi cần xác định bundlemột thực thể từ nó typeid.

Ví dụ: nếu typelà 'nút' và idlà 7, tôi có thể lấy 'trang' là bundle.

Cảm ơn

Câu trả lời:


11

Sử dụng entity_loadđể tải thực thể như được đề cập bởi @Nikhil.

Sau đó sử dụng entity_extract_ids , để giải nén gói. Thí dụ:

$entity = entity_load('node', array('7'));

list(, , $bundle) = entity_extract_ids('node', $entity);

echo "Bundle name is : " . $bundle;

Hàm entity_extract_idstrả về một mảng được lập chỉ mục bằng số (không phải là bảng băm) có chứa các phần tử:

  • 0: ID chính của thực thể.
  • 1: ID sửa đổi của thực thể hoặc NULL nếu $ entity_type không được phiên bản.
  • 2: Tên gói của thực thể hoặc NULL nếu $ entity_type không có gói.

ở đâu, 0, 1, và 2là chỉ số mảng. Tuy nhiên, cách tiếp cận được sử dụng bởi các mô-đun lõi và đóng góp là sử dụng list()chức năng.


Tôi nghĩ rằng nó không tốt để phụ thuộc vào chỉ số số mảng.
Junaid

3
@Junaid Chỉ số đó có thể dự đoán được nên không sao. Đây là cách lõi Drupal xử lý công việc này. Nếu 'số ma thuật' làm phiền bạn, bạn chỉ cần sử dụng các tính năng ngôn ngữ:list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive

@Junaid Bạn có thể phụ thuộc vào chỉ số số, khi bạn chắc chắn họ sẽ không thay đổi. Xem chỉnh sửa để giải thích lý do tại sao tôi sử dụng chỉ mục số. Đó là bởi vì chức năng API được thiết kế theo cách đó. Ngoài ra, giải pháp không phụ thuộc vào mô-đun thực thể ;-)
AjitS

7

Đây là cái sạch nhất mà tôi nhận được từ mã mô-đun nhóm hữu cơ.

$wrapper = entity_metadata_wrapper($entity_type, $entity_id);
$bundle = $wrapper->getBundle();

Ví dụ tôi có thể gọi nó như:

$wrapper = entity_metadata_wrapper('node', 1);
$bundle = $wrapper->getBundle();

Chỉnh sửa: Như @Clive đã chỉ ra, phương pháp trên phụ thuộc vào mô đun thực thể.

Đây là một phương pháp khác không phụ thuộc vào bất kỳ mô-đun bổ sung. Nó được giải thích ở đây https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW

Sao chép phương pháp dán đó:

function _entity_get_bundle($entity, $entity_type) {
  $info = entity_get_info($entity_type);
  if (empty($info['entity keys']['bundle'])) {
    return $entity_type;
  } else {
    return $entity->{$info['entity keys']['bundle']};
  }
}

$group_type, $gidgì và giá trị trong là $bundle gì?
niksmac

Xin lỗi, tôi quên sử dụng tên tham số thích hợp. Nó được sửa chữa ngay bây giờ.
Junaid

Bạn có thể làm tương tự cho entity_load, bằng cách nào nó sạch nhất?
niksmac

1
Cá nhân tôi không nghĩ entity_metadata_wrapper()là sạch hơn entity_extract_ids()phương pháp. Thêm vào đó, bạn dựa vào mô-đun thực thể đang được cài đặt ...
Clive

Nó không nhất thiết phải sạch hơn, nhưng đó là một sự thay thế hợp lệ, đặc biệt là nếu bạn đang sử dụng trình bao bọc siêu dữ liệu. Có lẽ @develkar hoặc Junaid có thể chỉnh sửa câu trả lời của họ để bao gồm cả hai lựa chọn thay thế? (Trả lời, có lẽ bạn có thể thêm liên kết đến mô đun Thực thể và vào trang về entity_metadata_wrappers?)
Alice Heaton

3

Hãy thử thực thể_load

Tải các thực thể từ cơ sở dữ liệu.

Các thực thể được lưu trữ trong bộ nhớ cache bộ nhớ tĩnh và sẽ không yêu cầu quyền truy cập cơ sở dữ liệu nếu được tải lại trong cùng một yêu cầu trang.

Thông số

$ entity_type : Loại thực thể cần tải, ví dụ: nút hoặc người dùng.

$ ids : Mảng ID thực thể hoặc FALSE để tải tất cả các thực thể.

$ condition : (không dùng nữa) Một mảng các điều kiện kết hợp trên bảng cơ sở, trong đó các khóa là các trường cơ sở dữ liệu và các giá trị là các giá trị mà các trường phải có. Thay vào đó, tốt hơn là sử dụng EntityFieldQuery để lấy danh sách ID thực thể có thể tải bởi chức năng này.

$ reset : Có đặt lại bộ đệm trong cho loại thực thể được yêu cầu hay không.

Giá trị trả về

Một mảng các đối tượng thực thể được lập chỉ mục bởi id của chúng. Khi không tìm thấy kết quả, một mảng trống được trả về.


3

Nếu bạn muốn một cách rất nhẹ, hiệu suất khôn ngoan, để lấy loại nút từ id nút - bạn có thể sử dụng một truy vấn chọn duy nhất trên bảng nút.

$type = db_query("SELECT type FROM {node} WHERE nid = :nid", 
                  array(':nid' => $nid))->fetchField();

Theo cách đó, bạn không cần phải gọi toàn bộ hệ thống hook thực thể, với entity_load, v.v.

Đó là một truy vấn chọn duy nhất bằng cách sử dụng id nút được lập chỉ mục.


chúng tôi không chơi với chỉ các nút ở đây.
Junaid

OP đã viết "Ví dụ: nếu loại là 'nút' và id là 7, tôi có thể lấy 'trang' dưới dạng gói." do đó nút trả lời ví dụ dựa trên nút.
David Thomas
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.