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.

amator barista
źródło
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ą.

googletorp
źródło
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).

Berdir
źródło