Do czego służy funkcja entity_metadata_wrapper () i dlaczego powinienem jej używać?

23

Wydaje mi się, że opracowuję dodatki do wielu modułów, które używają obecnie Entity API , a ta entity_metadata_wrapper()funkcja wciąż się pojawia.

Strona dokumentacji mówi o tym:

Zwraca opakowanie właściwości dla danych.

Jeśli jednostka jest opakowana, opakowanie może być użyte do pobrania dalszych opakowań dla właściwości uprawnień.

Ignorując cudowną freudowską pisownię słowa „istota”, tak naprawdę nie rozumiem, jaki jest cel tych opakowań.

Rozumiem, że funkcja zasadniczo zwraca EntityDrupalWrapperklasę:

Opakowanie ułatwia stosowanie wywołań zwrotnych getter i setter właściwości właściwości encji

Ale nie rozumiem, jak to ułatwia.

Na przykład, aby zaktualizować właściwość statusu węzła, mógłbym użyć tego kodu:

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

To całkiem czyste. Jak rozumiem (ale może się mylić), użycie równoważnego kodu entity_metadata_wrapper()byłoby bardziej szczegółowe.

Nie jestem pewien, czy to po prostu użycie terminu „opakowanie” mnie tu potyka, ale przejrzałem również kod w module Entity i nie jestem tak blisko, aby go zrozumieć.

Czy ktoś jest w stanie wyjaśnić zalety korzystania z tej funkcji i być może podać prosty przykład kodu dla typowego przypadku użycia?

Clive
źródło
Może to pogłębić zrozumienie interfejsu API i opakowań encji. To rozmowa Fago, faceta Entity. wolfgangziegler.net/drupalcon-denver
Ken
Dzięki, to brzmi naprawdę przydatne z pierwszego gambitu. Przyjrzę się temu, kiedy będę miał trochę czasu
Clive
Ten „film został usunięty z blipa”, ale slajdy są nadal pobierane.
artfulrobot

Odpowiedzi:

23

Tak, zmiana statusu węzła jest banalna, ponieważ jest to właściwość zakodowana na stałe.

Z drugiej strony pola są znacznie bardziej skomplikowane. Są one zagnieżdżone na trzech poziomach, podczas gdy istnieje field_get_items (), aby uzyskać je we właściwym języku, nie ma takiej funkcji do ustawiania wartości pól. Dlatego zawsze musisz sprawdzić, czy pole można przetłumaczyć, czy nie, i musisz wiedzieć, która właściwość zawiera dokładnie wartości, których szukasz / chcesz ustawić.

Dwa przykłady, które pokazują, co może zrobić opakowanie encji:

  • Następujący wiersz dodaje element zamówienia do zamówienia, dbając o język i właściwość zawierającą identyfikator referencyjny, zaczerpnięte z następującej odpowiedzi /drupal//a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
  • W podobny sposób, możliwość bezpośredniego dostępu do wartości pola, bez konieczności sprawdzania języka lub delty, a nawet możliwość bezpośredniego dostępu do jednostek, do których istnieją odniesienia, pobrane z /drupal//a/ 33010/31

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

Opakowanie encji jest siłą napędową elastycznych, potężnych modułów, takich jak Search API i Rules, ponieważ pozwala im na przechodzenie przez wiele poziomów referencji, dzięki czemu możesz np. Uzyskać dostęp do pola produktu, który użytkownik kupił w zamówieniu, z czymś jak [commerce-order:commerce-line-items:0:commerce-product:some-field](może nie być poprawne, ale coś w tym stylu) lub dodaj streszczenie indeksu węzła, do którego istnieje odwołanie, do indeksu wyszukiwania.

To powiedziawszy, niekoniecznie lubię faktyczne API otoki, są to ogromne wewnętrzne tablice i nawet proste właściwości są znowu klasami otoki. Mam nadzieję, że ulepszony system encji (i mam nadzieję, że będzie działał w terenie) w Drupal 8 wyeliminuje potrzebę takiego opakowania dzięki posiadaniu sklasyfikowanych encji.

Berdir
źródło
Genialnie, wiedziałem, że coś z tym przegapiłem. Myślę, że to opis EntityDrupalWrapperspowodował zamieszanie; kiedy wspomniałem o „właściwościach”, nie zdawałem sobie sprawy, że pola są w ogóle zaangażowane, po prostu pomyślałem, że to dosłownie oznacza, że ​​klasa zadbała o właściwości (nid, status itp.). Dzięki, że to wyczyściłeś, wiedząc, że moduł Reguły używa go do wyboru danych, robi to o wiele bardziej sensowne
Clive
@Berdir „Niekoniecznie lubię faktyczne API opakowania…” Mam takie same odczucia jak ty. Czy robisz coś, aby z tym walczyć? Czy używasz field_view_value () do przeglądania wartości? Jak zaleciłbyś ustawienie wartości w niestandardowych wywołaniach zwrotnych dla niestandardowego przepływu pracy lub pulpitu nawigacyjnego?
Charlie Schliesser