„Set” wersja field_get_items?

9

Można pobrać elementy pola z encji za pomocą

// Find all terms on $node in field 'field_tags'.
$terms = field_get_items('node', $node, 'field_tags');

Ale czy istnieje wygodny sposób na wykonanie czynności odwrotnej, Core lub w inny sposób?

// Attach new term $term to $node in field 'field_tags'.
$term = taxonomy_term_load($tid);
$node = field_set_items('node', $node, 'field_tags', 'taxonomy_term', $term);
node_save($node);

Chciałbym uniknąć kłopotów z ręcznym przypisywaniem terminu $, przyjrzyj się, jak wygląda struktura tablicy, a następnie zbuduj tablicę ręcznie, ponieważ czasami nie jest to trywialne.

Jedyny problem w kolejce podstawowej, który mogłem znaleźć, który wyglądał nieco podobnie, dotyczył języka polowego API DX .

Letharion
źródło

Odpowiedzi:

6

Nie, nie ma takiej funkcji.

Zobacz mój komentarz na stronie Obsługa języków dla pól encji .

Berdir
źródło
1
Dzięki Berdir. Miałem nadzieję, że się pojawisz;) i obawiałem się, że to powiesz. Problem z kodem w twoim komentarzu polega na tym, że dla wielu pól „wartość” może być niewystarczająca lub po prostu błędna.
Letharion
field_get_items () też ci w tym nie pomaga, zwraca tablicę elementów zawierających wartość. Lub cokolwiek zdefiniuje typ pola. Nie da się tego streścić.
Berdir,
Na przykład field_get_items () zwraca tablicę (array ('tid' => 123)). Twój kod musi wiedzieć, że field_tags to odwołanie do terminu taksonomii i że ma ustawiony zestaw kluczy Tid oraz że jest to odniesienie do terminu taksonomii.
Berdir
Komentarze nie są już widoczne na tej stronie zgodnie z danym linkiem.
Junaid
Komentarze są teraz na stronie dyskusji: drupal.org/node/1500308/discuss
Berdir,
2

Aby taka funkcja istniała, field_set_items()musiałaby być w stanie zidentyfikować stdClassobiekt jako termin taksonomii, a także odwzorować go na funkcję, która może dekodować obiekt i utworzyć z niego tablicę pól.

Ponieważ nie ma do tego podstawowej funkcji, nie sądzę, że będzie to łatwe.

Clive
źródło
To strasznie irytujące, że nie ma jeszcze właściwości $ entity-> entity_type (ale) , ale niezależnie od tego, można ją łatwo dodać do mojego przykładowego wywołania zwrotnego. Zaktualizowałem pytanie, aby to odzwierciedlić.
Letharion
1
Brak entity_typeproblemu tak naprawdę nie jest problemem IMHO ... problemem jest dokładnie to, co dodałeś do swojego pytania: „czasem nie jest trywialne”. Ponieważ dane nie są trywialne, field_set_itemsaby działały tak, jak chcesz, każdy typ pola w systemie musiałby zaimplementować jakiś interfejs opisujący sposób inżynierii wstecznej tablicy danych na podstawie zmiennej obiektowej / arbitralnej.
Clive
2

Chociaż nie pomaga to w budowaniu czasami skomplikowanej struktury tablic, widzę, że to, czego szukam, do pewnego stopnia zostało wprowadzone w Drupal 8. Być może zostanie ono w przyszłości rozszerzone. :)

Dostępne nowe, prostsze API umożliwiające dostęp do pól, właściwości i informacji o języku .

Przykładowe użycie z połączonej strony:

<?php
// Change a field value.
$body = $comment->get('comment_body');
$body[0]['value'] = 'This is actually a perverted tango';
$comment->set('comment_body', $body);
Letharion
źródło