Najlepszy sposób na usunięcie pola z typu zawartości


21

Jaki jest najlepszy sposób na usunięcie pola Drupal 7 z typu zawartości zdefiniowanego za pomocą GUI? Chcę użyć hook_update_N, aby zmiany mogły być propagowane na wiele serwerów po uruchomieniu update.php. Jednak nie mogę znaleźć rozwiązania. db_drop_table () miałoby dla mnie sens dla niestandardowych schematów, ale nie dla typu / pola treści zdefiniowanego przez GUI.


stworzyłeś moduł niestandardowy, aby zdefiniować typ zawartości?
iStryker

iStryker: utworzył typ zawartości za pomocą interfejsu administratora, dodał niektóre pola, a następnie wyeksportował za pośrednictwem funkcji. Ale teraz chcę programowo usunąć jedno z tych pól.
amator barista

Zauważono, że D5 zapewnia funkcję content_field_instance_delete () , udokumentowaną tu i tutaj , ale ta funkcja nie jest dostępna dla D7. Ciekawe jest również, czego używa field.install w rdzeniu D7 do usuwania pól: _update_7000_field_delete_instance () - niestandardowa funkcja „wewnętrzna”, z której inni nie mogą korzystać. W przypadku czegoś tak ważnego jak pola wydaje mi się, że powinna być gdzieś dostępna funkcja „publiczna” i właśnie tego szukam.
amator barista

Obecnie moją publiczną funkcją „kandydata” jest field_delete_instance ().
amator barista

Odpowiedzi:


18

Istnieją dwie funkcje interfejsu API do usuwania pól:

Jeśli nie chcesz ponownie używać tego pola, usunięcie całego pola może być nieco czystsze, zamiast usuwać tylko jego instancję dla danego typu zawartości. Tylko Ty możesz być tego sędzią.


2
Działa jak urok. Funkcja nie zwraca żadnych argumentów, dlatego w połączeniu z hook_update_N () zalecałbym wykonanie watchdog () w celu zarejestrowania zmian aktualizacji.
amator barista

9

Tak, field_delete_instance () to funkcja służąca do usuwania instancji pól.

Pamiętaj, że field_delete_instance()automatycznie dzwoni, field_delete_field()jeśli nie ma już pozostałych wystąpień, więc field_delete_instance()najprawdopodobniej jest to wszystko, czego kiedykolwiek potrzebujesz.

_update_7000_field_delete_instance()jest przeznaczony do podstawowych funkcji aktualizacji. Przykład: w funkcji aktualizacji x_update_7000()używasz field_delete_instance(). Następnie x_update_7001()zmieniasz {field_config}tabelę w niekonsekwentny sposób i field_delete_instance()oczywiście również musisz ją zmienić .

Ale teraz x_update_7000()wywołanie field_delete_instance()spowoduje błąd, ponieważ tabela jest nadal w starej strukturze. Jednak sytuacja w przypadku modułów wnoszonych jest inna, ponieważ powinny one zawsze być wykonywane po wszystkich aktualizacjach podstawowych i dlatego muszą działać z najnowszą wersją podstawową.

Ale jest to wzorzec, którego możesz chcieć użyć do własnych funkcji API, których używasz w funkcjach aktualizacji.

Ponadto te funkcje _update nie wykonują przechwyceń, ponieważ wynik nie jest przewidywalny (na przykład dlatego, że moduł, dla którego aktualizacja jest uruchamiana, może być wyłączony).

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.