Jaki jest właściwy sposób programowo usunąć jeden konkretny wpis pola dla pola wielokrotnego wpisu z jednego konkretnego obiektu? (to są określone pola i określone encje, a nie typy lub instancje pól i typy encji)
Oto kilka możliwości, które sprawdziłem i które nie działają:
- Ładowanie encji za pomocą
entity_load()
, ustawienie wpisu pola na = null lub = array (), a następnie zapisywanie za pomocąfield_attach_update()
. Jest to najbliższe, jakie znalazłem, ale pozostawia wpis zerowego pola zombie w bazie danych, który pojawia się jako pusty wiersz w formularzach, dopóki formularz nie zostanie zapisany ihook_field_is_empty()
może się uruchomić (hook_field_is_empty()
jest skonfigurowany tak, że = null lub = array () będzie oznaczać jak pusty). - Ładowanie encji za pomocą
entity_load()
, odznaczanie pola wpisu kluczem, a następnie zapisywanie za pomocąfield_attach_update()
. To wydaje się nic nie robić - wydaje się, że Drupal interpretuje nieistnienie wpisu jako znak, aby go nie modyfikować. (co dziwne, czasami próbuję tego podejścia uzyskać maksymalny limit czasu ważności zapytania) field_attach_delete()
- to jest zbyt tępe: zabija wszystkie pola dla bytufield_purge_data()
- lepiej, ale wciąż zbyt tępo: zabija wszystkie wpisy w polu, a nie konkretne wpisy
Aby to wyjaśnić, mam kod, który znajduje (i ładuje) byt, który ma pole zawierające wiele wpisów i znajduje określony wpis w tym polu, który należy usunąć. Chcę całkowicie usunąć ten wpis, nie dotykając żadnych innych wpisów ani żadnych pól w encji.
Musiałem to zrobić w ramach czyszczenia migracji Drupal8.
Po kilku eksperymentach odkryłem, że iteracja, a następnie użycie metody unset () w delcie może ją zabić. Moim przykładem było usunięcie tagu (stąd szukam „target_id”, a nie „wartość”, jak to często bywało w przypadku innych pól.
A potem, jeśli sukces, to
$object->save();
źródło
W przypadku Drupal 8, aby usunąć pole z encji:
Spowoduje to wywołanie magicznej metody __unset () z ContentEntityBase:
Nie zapominaj, że aby zachować zmiany, musisz zadzwonić
Po wprowadzeniu wszystkich zmian.
źródło
To lepszy sposób:
źródło
obecna preferowana metoda wykorzystywałaby element_wadania_metadanych
to najlepszy poradnik na temat EMW, jaki widziałem http://deeson-online.co.uk/labs/programatically-access-field-data-using-entitymetadatawrapper-drupal
źródło