2012-11-28 9 views
6

Próbuję dowiedzieć się, jak utworzyć niestandardowy typ zawartości programowo z mojego modułu.Jak usunąć ślady pól należące do typu zawartości modułu?

Jednak po odinstalowaniu i ponownym zainstalowaniu modułu wystąpił błąd informujący, że nie można utworzyć co najmniej jednego z pól, które próbowałem utworzyć, ponieważ one już istnieją.

Więc poszedłem hakować przez mój databse, usuwając typ zawartości i wszystkie tabele, które do niego należały.

Ten sam wynik - pole już istnieje.

Następnie udałem się do strony internetowej Drupal API szuka sposobów, aby usunąć pola i instancje pola, i natknąłem

field_delete_field() 

i

field_delete_instance() 

zrobiłem stronę php, aby spróbować usunąć pola, które utworzyłem, tylko po to, aby uzyskać błąd stwierdzający, że tabela, którą próbowałem usunąć, nie istnieje.

Trochę utknąłem - nie mogę utworzyć pól, ponieważ one już istnieją i nie mogę ich usunąć, ponieważ one nie istnieją!

BTW kod, dla którego modelowałem mój moduł po jest kod znaleziony w sekcji "węzeł_przykład" sekcji Drupal examples module.

Odpowiedz

4

Ała, ręczne usuwanie tabel bazy danych nigdy nie jest dobrym pomysłem - Drupal nie jest tak wyrozumiały :)

Wystarczy zająć się kod w swoim zainstalować/włączyć haka, zawiń utworzenie pola w:

if (!field_info_field('field_name')) { 
    field_create_field(... 
} 

Dzięki temu problem znów się nie powiedzie. Lub jeśli nie chcesz tego zrobić, upewnij się, że pole jest usunięte w haku do deinstalacji/dezaktywacji. Oczywiście ta metoda może potencjalnie doprowadzić do utraty danych.

celu rozwiązania obecnego problemu, wykonaj ten proces:

  • całkowicie odinstalować (nie tylko wyłączyć) moduł niestandardowy. Jeśli jest niespójny, po prostu usuń jego wiersz z tabeli system.
  • Usuń wszystkie ślady pola z tabel field_config i field_config_instance.
  • Skracaj wszystkie tabele podręczne ręcznie (dowolna tabela zaczynająca się od cache_).
  • Nie bezwzględnie konieczne, ale wyjaśnić wszelkie ociąganie zawartość:

    $nids = db_query('SELECT nid FROM {node} WHERE type = :type', array(':type' => 'type'))->fetchCol(); 
    node_delete_multiple($nids); 
    

To powinno wystarczyć.

Za każdym razem, gdy usuniesz pole, poprzez interfejs lub programowo, będziesz musiał albo uruchomić crona, albo zadzwonić pod numer field_purge_batch(), aby "twardo" usunąć pola, ponieważ są one tylko oznaczone do usunięcia w pierwszej instancji.

+0

Dziękuję bardzo! – Tyler

Powiązane problemy