entity_metadata_wrapper () 함수의 목적은 무엇이며 왜 사용해야합니까?


23

현재 Entity API 를 사용하는 많은 모듈에 대한 애드온을 개발하고있는 것으로 보이며 entity_metadata_wrapper()기능이 계속 나타납니다.

문서 페이지에 대해이 말한다 :

주어진 데이터에 대한 속성 래퍼를 반환합니다.

엔터티가 래핑 된 경우 래퍼를 사용하여 엔티티 속성에 대한 추가 래퍼를 검색 할 수 있습니다.

거기에 '엔티티'라는 단어의 놀라운 프로 디우스 철자를 무시하고, 나는이 포장지의 목적이 무엇인지 실제로 이해하지 못한다.

함수가 본질적으로 EntityDrupalWrapper클래스를 반환한다는 것을 이해합니다 .

래퍼는 엔티티 속성의 getter 및 setter 콜백을 쉽게 적용 할 수 있습니다.

그러나 내가 이해할 수없는 것은 그것이 일을 더 쉽게 만드는 방법 입니다.

예를 들어 노드의 상태 속성을 업데이트하려면 다음 코드를 사용할 수 있습니다.

$node = node_load($nid);
$node->status = 1;
node_save($node);

꽤 깨끗합니다. 내가 이해하지만 (잘못 될 수도 있음) 동등한 코드를 사용하는 entity_metadata_wrapper()것이 그보다 더 장황합니다.

단순히 여기에서 나를 넘어 오는 '래퍼'라는 용어를 사용하는지 확실하지 않지만 Entity 모듈의 코드를 살펴 보았으므로 이해하기에 더 가깝지 않습니다.

누구나이 기능을 사용하여 얻을 수있는 이점을 설명하고 일반적인 사용 사례에 대한 간단한 코드 예제를 제공 할 수 있습니까?


이것은 엔티티 API 및 랩퍼에 대한 깊은 이해를 추가 할 수 있습니다. 엔터티 사람인 Fago의 연설입니다. wolfgangziegler.net/drupalcon-denver
Ken

고마워, 그것은 시작 도박에서 정말 유용하게 들린다. 시간이 났을 때 살펴 보도록하겠습니다
Clive

"비디오가 블리치에서 제거되었습니다"라는 슬라이드가 여전히 다운로드됩니다.
artfulrobot

답변:


23

예, 하드 코드 된 특성이므로 노드의 상태를 변경하는 것은 쉽지 않습니다.

반면에 필드는 훨씬 더 복잡합니다. 그것들은 3 단계 깊이로 중첩 되어 있지만 올바른 언어로 얻을 수있는 field_get_items ()있지만 필드 값을 설정하는 기능은 없습니다. 따라서 항상 필드를 번역 할 수 있는지 여부확인 해야하며 설정 / 설정하려는 값이 정확히 포함 된 속성을 알아야합니다.

엔티티 랩퍼가 수행 할 수있는 작업을 보여주는 두 가지 예 :

  • 다음 줄은 다음 대답에서 가져온 언어와 참조 ID를 보유하고있는 실제 재산, 돌보는, 순서에 상거래 라인 항목을 추가 /drupal//a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
  • 비슷한 방식으로 언어 또는 델타를 확인하지 않고도 필드 값에 직접 액세스 할 수 있고 /drupal//a/ 에서 가져온 참조 엔티티에 직접 액세스 할 수도 있습니다. 33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

같은 유연하고 강력한 모듈의 원동력입니다 래퍼 엔티티 검색 API규칙 그래서 당신은 예를 들어 액세스 사용자가 뭔가 순서로 구입 한 제품의 필드 수는 참조의 여러 단계를 통해 자신의 방식으로 작동하도록 허용하는, 같은 [commerce-order:commerce-line-items:0:commerce-product:some-field](실제로는 정확하지만, 그런 일하지 않을 수 있습니다), 또는 검색 색인에 참조 된 노드의 몸 요약을 추가 할 수 있습니다.

즉, 필자는 래퍼의 실제 API를 좋아하지 않으며 거대한 내부 배열이며 간단한 속성조차도 래퍼 클래스라고합니다. Drupal 8의 개선 된 엔터티 (및 희망 필드) 시스템이 분류 된 엔터티 덕분에 이러한 래퍼가 필요하지 않기를 바랍니다.


브릴리언트, 나는 이것으로 뭔가를 놓쳤다는 것을 알았습니다. 나는 그것이의 설명이라고 생각 EntityDrupalWrapper혼란을 야기하는; '속성'에 대해 언급했을 때 나는 필드가 전혀 관여하지 않았다는 것을 깨닫지 못했습니다. 문자 그대로 클래스가 속성 (nid, status 등)을 처리한다는 것을 의미한다고 생각했습니다. 규칙 모듈은 데이터 선택을 위해 그것을 사용하는 것을 알고 청산이 최대에 대한 감사는 더 많은 의미가 있습니다
클라이브

@Berdir "실제로 래퍼의 실제 API를 좋아하지는 않습니다 ..."나는 당신과 같은 감정을 가지고 있습니다. 이 문제를 해결하기 위해 무엇을하십니까? field_view_value ()를 사용하여 값을 보십니까? 사용자 정의 워크 플로 또는 대시 보드에 대한 사용자 정의 콜백에서 값을 설정하는 방법은 무엇입니까?
Charlie Schliesser 2012 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.