Opakowania metadanych jednostki
Interfejs API encji zapewnia pewne klasy opakowań, których można użyć do łatwego radzenia sobie z encjami i do wykorzystania dostarczonych modułów informacji o właściwości encji. Za pomocą opakowań można uzyskać dostęp do informacji o właściwościach, przeglądać znane właściwości lub po prostu uzyskać / ustawić opisane wartości danych itp.
Oto kilka prostych przykładów użycia, które można znaleźć w pliku README:
Aby skorzystać z tych informacji (metadanych), moduł udostępnia pewne klasy opakowań, które ułatwiają pobieranie i ustawianie wartości. Opakowanie obsługuje łańcuchowe użycie do pobierania opakowań właściwości encji, np. W celu uzyskania adresu e-mail autora węzła można użyć:
$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();
Aby zaktualizować adres e-mail użytkownika, można użyć
$wrapper->author->mail->set('[email protected]');
lub
$wrapper->author->mail = '[email protected]';
Opakowania zawsze zwracają dane zgodnie z opisem w informacjach o właściwościach, które można pobrać bezpośrednio za pomocą encji_get_property_info () lub z opakowania:
$mail_info = $wrapper->author->mail->info();
W celu wymuszenia dezynfekcji wartości tekstowej na wyjściu można użyć np
$wrapper->title->value(array('sanitize' => TRUE));
aby uzyskać tytuł odkażonego węzła. Gdy właściwość jest już domyślnie zwracana w stanie odkażonym, takim jak treść węzła, prawdopodobnie chce się uzyskać niezanieczone dane, tak jak wyglądałoby to w przeglądarce dla innych przypadków użycia. W tym celu można włączyć opcję „dekodowania”, która zapewnia, że wszelkie odkażone dane są usuwane, a encje HTML są dekodowane przed zwróceniem właściwości:
$wrapper->body->value->value(array('decode' => TRUE));
W ten sposób zawsze dostaje się dane pokazane użytkownikowi. Jeśli jednak naprawdę chcesz uzyskać surową, nieprzetworzoną wartość, nawet w przypadku oczyszczonych danych tekstowych, możesz to zrobić za pomocą:
$wrapper->body->value->raw();
Więcej przykładów:
$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';
$wrapper->save();
$wrapper->delete();
Więcej dokumentów : http://drupal.org/node/1021556
Dzwonienie
field_attach_update('node', $node)
pod koniechook_node_update
działało dla mnie. Zakładam, żefield_attach_insert('node', $node)
pod koniec teżhook_node_insert
będzie działać. Przykładowa funkcja wyglądałaby następująco:Nie trzeba dzwonić
node_load
node_save
ani nic zwracać.Myślę, że powodem tego jest fakt
node_save
, z któregohook_node_update
ihook_node_insert
są nazywane, okłady wszystkie zapytania do bazy danych w transakcji. (Uwaga pierwszą linięnode_save
:$transaction = db_transaction()
). Te pytania nie są nazywane aż donode_save
wykończeń. Wywoływane jest ostatnie zapytanie, którenode_save
dodaje się do transakcjifield_attach_update
, które korzysta z obiektu $ node tak jak poprzedniohook_node_update
. Musisz więc ustawić kolejkę innego zapytania, dzwoniącfield_attach_update
ponownie. Przynajmniej tak rozumiem, co się dzieje.Jeśli masz problemy ze zmianą atrybutów niepolowych węzła (np.
$node->log
), Spróbuj także zadzwonić_node_save_revision($node, $user->uid, 'vid');
. To nie utworzy nowej wersji.źródło
Oto jak zmieniasz wartości w węźle:
źródło
und
nie jest tu właściwie właściwe, OP stwierdził już w kodzie, że używają go$node->language
do kodu językaUlepszenie powyższego rozwiązania Lance'a, unikające zapisywania całego węzła, gdy modyfikowanych jest tylko kilka wartości pól:
Może to być również przydatne, aby uniknąć skutków ubocznych
node_save()
.Źródło: Zapisywanie pól węzła bez zapisywania samego węzła
https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself
źródło