유형과 ID에서 엔티티 번들을 어떻게 얻을 수 있습니까?


11

나는 식별해야 bundle그에서 엔티티의 typeid.

예를 들어, type가 'node'이고 id7이면 'page'가로 표시 될 수 있습니다 bundle.

감사

답변:


11

entity_load@Nikhil이 언급 한대로 엔티티를로드하는 데 사용하십시오 .

그런 다음 entity_extract_ids 를 사용하여 번들을 추출하십시오. 예:

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

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

echo "Bundle name is : " . $bundle;

이 함수 entity_extract_ids는 다음 요소를 포함하는 숫자 인덱스 배열 (해시 테이블이 아님)을 반환합니다.

  • 0 : 엔터티의 기본 ID입니다.
  • 1 : 엔티티의 개정 ID 또는 $ entity_type의 버전이 지정되지 않은 경우 NULL입니다.
  • 2 : 엔티티의 번들 이름. $ entity_type에 번들이없는 경우 NULL입니다.

여기서, 0, 1, 및 2배열 인덱스이다. 그러나 코어 및 contrib 모듈에서 사용하는 방법은이 list()기능 을 사용하는 것입니다.


배열 숫자 인덱스에 의존하는 것이 좋지 않다고 생각합니다.
Junaid

3
@Junaid 색인은 예측 가능하므로 괜찮습니다. 이것이 Drupal 코어가이 작업을 처리하는 방법입니다. '마법의 숫자'가 귀찮은 경우 언어 기능 만 사용하십시오.list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
Clive

@Junaid 숫자 인덱스가 변경되지 않을 것이라고 확신 할 때 숫자 인덱스에 의존 할 수 있습니다. 숫자 인덱스를 사용한 이유에 대한 설명은 편집을 참조하십시오. API 기능이 그런 식으로 설계 되었기 때문입니다. 또한 솔루션은 엔티티 모듈에 의존하지 않습니다 ;-)
AjitS

7

다음은 Organic groups 모듈 코드에서 얻은 가장 깨끗한 것입니다.

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

예를 들어 다음과 같이 호출 할 수 있습니다.

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

편집 : @Clive가 지적했듯이 위의 방법은 엔티티 모듈에 따라 다릅니다.

추가 모듈에 의존하지 않는 다른 방법이 있습니다. https://forrst.com/posts/Get_the_bundle_of_a_Drupal_7_entity-0xW에 설명되어 있습니다.

해당 방법을 붙여 넣기 :

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, $gid? 그리고 가치는 $bundle 무엇입니까?
niksmac

죄송합니다. 올바른 매개 변수 이름을 사용하는 것을 잊었습니다. 이제 수정되었습니다.
Junaid

동일한에 대한 작업을 수행 할 수 있습니다 entity_load방법은 깨끗한 방법으로?
niksmac

1
개인적으로 나는 방법 entity_metadata_wrapper()보다 깨끗 하다고 생각하지 않습니다 entity_extract_ids(). 또한 설치중인 엔터티 모듈에 의존합니다.
Clive

반드시 깨끗하지는 않지만 특히 메타 데이터 래퍼를 사용하는 경우 올바른 대안입니다. 어쩌면 @develkar 또는 Junaid는 두 대안을 모두 포함하도록 답변을 편집 할 수 있습니까? (Junaid, Entity 모듈 및 entity_metadata_wrappers에 대한 페이지에도 링크를 추가 할 수 있습니까?)
Alice Heaton

3

entity_load를 시도 하십시오

데이터베이스에서 엔티티를로드하십시오.

엔티티는 정적 메모리 캐시에 저장되며 동일한 페이지 요청 중에 다시로드 된 경우 데이터베이스 액세스가 필요하지 않습니다.

매개 변수

$ entity_type :로드 할 엔티티 유형 (예 : 노드 또는 사용자).

$ ids : 엔터티 ID의 배열 또는 모든 엔터티를로드하는 FALSE

$ conditions : (더 이상 사용되지 않음) 키가 데이터베이스 필드이고 값이 해당 필드에 있어야하는 값인 기본 테이블의 연관 조건 배열입니다. 대신 EntityFieldQuery를 사용하여이 함수로로드 할 수있는 엔티티 ID 목록을 검색하는 것이 좋습니다.

$ reset : 요청 된 엔티티 유형의 내부 캐시를 재설정할지 여부입니다.

반환 값

ID로 색인이 생성 된 엔티티 객체의 배열입니다. 결과가 없으면 빈 배열이 반환됩니다.


3

성능 측면에서 매우 가벼운 방법으로 노드 ID에서 노드 유형을 가져 오려면 노드 테이블에서 단일 선택 쿼리를 사용할 수 있습니다.

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

그렇게하면 entity_load 등을 사용하여 전체 엔티티 후크 시스템을 호출 할 필요가 없습니다.

인덱싱 된 노드 ID를 사용하는 단일 선택 쿼리입니다.


여기서는 노드 만 가지고 노는 것이 아닙니다.
Junaid

OP는 "예를 들어, 유형이 'node'이고 id가 7 인 경우 'page'를 번들로 얻을 수 있습니다." 따라서 노드 기반 예제 답변입니다.
David Thomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.