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 EntityDrupalWrapper
klasę:
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?
Odpowiedzi:
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
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
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.
źródło
EntityDrupalWrapper
spowodował 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