Jaka jest najlepsza praktyka podczas pracy z językiem [und]?


51

Zaczynam używać tego formularza, aby uzyskać dostęp do danych w moim module. (Patrz komentarz nr 1 ).

$node->field_test[$node->language][0]['value']

Pomyślałem, że to całkiem dobre rozwiązanie, ale w dalszej części tego samego pytania znalazłem to :

Nie zakładaj, że „und” odnosi się do pól encji bez języka, dotyczy to także pól, które nie podlegają tłumaczeniu, i bez modułu tłumaczenia encji, który jest wszystkimi polami. Co więcej, istnieją w tym różnice między różnymi wersjami Drupala w wersji 7.x.
Lepiej skorzystać z field_get_items()funkcji, która uporządkuje dla Ciebie kod języka, w którym przechowywane są dane.

A teraz nie wiem, czy to, czego używam, może coś zepsuć.

Odpowiedzi:


39

Uważam, że korzystanie z modułu Entity API jest świetną pomocą, a także sprawia, że ​​kod jest bardziej czytelny. Powyższy kod nie zawsze będzie działał, ponieważ język węzła i język pola mogą być różne.

Za pomocą modułu API encji i jego opakowania możesz użyć następującego kodu:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

To powinno być kuloodporne. Jedną rzeczą dotyczącą korzystania z modułu encji jest to, że jeśli spróbujesz uzyskać dostęp do pola, które nie istnieje, otrzymasz nieprzyjemny błąd i zgłoszony wyjątek zamiast powiadomienia i niewłaściwego zachowania.

Aby tego uniknąć, możesz spróbować / złapać w ten sposób

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

Lub możesz użyć, isset()który EntityMetadataWrapperobsługuje wewnętrznie:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

Czy ta funkcja entity_metadata_wrapper()jest przestarzała? Próbowałem wywołać to w moim module i dostałem Fatal error: Call to undefined function entity_metadata_wrapper()- przeszukałem również źródła w mojej instalacji Drupal 7.12 w Dreamweaver i znalazłem 0 wyników gdziekolwiek indziej w kodzie!
Aditya MP

1
aditya - znajduje się w module Entity API - nie w rdzeniu.
lazysoundsystem

1
@adityamenon Jak leniwy mówi, że to nie jest sedno ... jednak prawdopodobnie będzie to dla Drupala 8. Interfejsy API encji zostaną co najmniej znacznie ulepszone. Naprawdę nie było czasu, aby utworzyć wszystkie interfejsy API potrzebne dla systemu encji dla Drupala 7, więc to właśnie ten moduł API encji stara się osiągnąć.
googletorp

Dziękuję wam, byłem głupi, że nie przeczytałem poprawnie odpowiedzi i nie podążyłem za linkiem do strony projektu Entity API :)
Aditya MP

1
Kiedy patrzę na kod źródłowy encji_zwijacza_zwijacza i podążam śladem królika przez wszystkie klasy, które są tworzone i rozszerzane, aby ułatwić mi manipulowanie polem, zastanawiam się, czy to wszystko jest tego warte. Dodając kolejne 3k + linii kodu do mojego bootstrapu i zajmując więcej pamięci, aby poradzić sobie ze wszystkimi przypisaniami zmiennych ... czy jest coś bardziej lekkiego? Wydaje się, że $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';to naprawdę najbardziej efektywny sposób.
Charlie Schliesser

19

Do czytania zawsze powinieneś być w stanie używać field_get_items () , który wybierze dla ciebie odpowiedni język, a także sprawdzi, czy pole ma jakieś wartości.

Niestety, interfejs API pola jest bardzo ograniczony w 7.x, nie ma sposobu na uzyskanie np. Pierwszego elementu pola, nawet nie waż się pytać o uzyskanie wartości za pomocą pojedynczego wywołania funkcji ... I nie ma pól_zestaw_pola ( ) odpowiednik.

Więc tak, moduł podmiot API ma zapewnić ładniejszy API z tą wadą, że również pochodzi z dość trochę nad głową (to w zasadzie przekształca każdą wartość wrapper obiekty, które mają mnóstwo własności zagnieżdżonych tablic informacyjnych dołączonych do nich). Próba zrzucenia opakowania encji zazwyczaj nie zapewni ani niczego, ani ściany nieczytelnych tablic.


1
Mam wrażenie, że mówisz, że w Drupal 8 można ulepszyć tego rodzaju rzeczy? Jeśli tak, to jak można dowiedzieć się, jak postępują tego rodzaju rzeczy? Poza stronami modułu Do jest dla mnie jak labirynt! :)
Clive

1
Cóż, zawsze jest nadzieja :) I ciężko jest zachować ogólny przegląd tego, co dzieje się w Drupal 8, jednym ze sposobów jest śledzenie inicjatyw. Jednak nie jest to bezpośrednim celem istniejących dyrektyw. Części modułu encji API są przenoszone / przenoszone do rdzenia (teraz jest klasa Entity, a istniejące encje są konwertowane na nowy system). Jest więc szansa, że ​​np. Uzyskamy metody bezpośrednio na tych klasach do obsługi pól. W przypadku zatwierdzonych zmian dobrym zasobem jest nowy system rejestrowania zmian, patrz drupal.org/list-changes/drupal .
Berdir,

Genialnie, właśnie tego szukałem bardzo dzięki! :) Mam nadzieję, że nie masz nic przeciwko, że pytam Wiem, że to nie jest tak naprawdę temat na stronie ... Chciałbym się zaangażować w przyczynianie się do rdzenia, ale nigdy tak naprawdę nie byłem zaangażowany w open source, uważam, że to wszystko trochę zniechęcające ... fajnie jest mieć dobre miejsce na start :)
Clive

Clive: Sprawdź drupalofficehours.org - to właśnie po to, aby pomóc ludziom w rozpoczęciu pracy. Więcej zasobów. Poleciłbym także udać się na spotkanie grupy użytkowników, które często lub co najwyżej na deweloperów podstawowych, DrupalCamp, gdzie będzie lub kilka deweloperów podstawowych. Znajdź swoją grupę lokalną na groups.drupal.org i powinieneś być w stanie to wypracować. drupical.org też może być przydatny.
wizonesolutions

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

Czy możesz dodać krótkie wyjaśnienie, dlaczego to odpowiada na pytanie?
Bezpłatny Radical
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.