Zawiera problem z przepływem pracy podczas usuwania pola

14

Załóżmy, że mam typ zawartości Personz polami: Name, Age,Email

Ten typ zawartości jest kontrolowany przez funkcję o nazwie, testdzięki czemu mogę sterować źródłem i przekazywać go do witryny na żywo.

Mój przepływ pracy wygląda następująco:

  • Dodam nowe pole o PersonnazwiePhone
  • lokalnie robię: drush fu test -y
  • Edytuję, test.infoaby zwiększyć numer wersji
  • Zatwierdzam zmiany w moim repozytorium
  • Przesyłam tę funkcję do działającej witryny (kopiuję pliki funkcji)
  • na stronie na żywo robię: drush fr test -y
  • na stronie na żywo robię: drush cc all

Następnie nowe pole pojawi się w aktywnej witrynie Person.

Jeśli w pierwszym kroku usunę pole Personpola nie zostanie usunięte z działającej witryny. Jak to rozwiązać? Nie chcę ręcznie usuwać go z interfejsu użytkownika w witrynie na żywo.
Czy ten przepływ pracy jest prawidłowy?

Cherouvim
źródło
1
Użyj testu drush fu -y - przyrost -wersja, aby automatycznie zwiększyć numer wersji
Mike

Odpowiedzi:

9

To jest obosieczny miecz, taki jest, aby zapobiec usuwaniu danych, co zawsze jest dobrą rzeczą. Naprawdę nie ma nic do rozwiązania, jest to oczekiwane zachowanie.

To ten sam przepływ pracy, którego używamy i robiliśmy od ponad roku, i działa naprawdę dobrze. Powiedziałbym, że to prawda, ale to bardzo subiektywna odpowiedź.

cyfrowy
źródło
A jeśli naprawdę chciałbym usunąć pole? Czy powinienem zajrzeć do aktualizacji? (Jestem nowicjuszem D7).
cherouvim
3
Aktualizacja haków byłaby idealna lub ręcznie ją usunąć.
cyfrowy
2
OK, mógłbym też zrobićdrush field-delete field
cherouvim
@cherouvim Więc musisz to robić za każdym razem, gdy odtwarzasz funkcję?
AlxVallejo
Działa funkcja hook_update_N () w pliku .install funkcji.
Mike
10

Prawidłowy sposób na usunięcie zawartości utworzonej przez Funkcje to hook_update_N (który powinien zostać zaimplementowany w pliku your_module.install).


Główną ideą funkcji jest zarządzanie konfiguracją za pomocą kodu. Używanie hook_update_Njest z tym zgodne, ponieważ usuwanie pola odbywa się w kodzie (którym można zarządzać za pomocą kontroli wersji) - podczas gdy równoważne polecenie drush field-delete fieldnie jest wywoływane z kodu zarządzanego; jest to osobny krok wiersza poleceń, który musisz wykonać (i pamiętać, aby wykonać).

smokris
źródło
Dlaczego? Nie drush field-delete fieldzadziała dobrze?
cherouvim
5
Pewnie, że to zadziała i może być prostszym rozwiązaniem. Ale główną ideą funkcji jest zarządzanie konfiguracją za pomocą kodu. Używanie hook_update()jest z tym zgodne, ponieważ usuwanie pola odbywa się w kodzie (którym można zarządzać za pomocą kontroli wersji) - podczas gdy komenda drush nie jest wywoływana z kodu zarządzanego; jest to osobny krok wiersza poleceń, który musisz wykonać (i pamiętać, aby wykonać).
smokris
W jakim pliku funkcji użyję hook_update ()? hook_update () przyjmuje obiekt węzła jako parametr, więc nie jest możliwe podanie mu obiektu węzła podczas włączania tej funkcji.
subhojit777
@ subhojit777: Ups, dowiązałem do niewłaściwej strony dokumentacji haka. Właśnie naprawiłem link; zapoznaj się z dokumentacją dla hook_update_N.
smokris
@smokris :) Wspomniałem o tym haku w mojej odpowiedzi
subhojit777
2

Utwórz nowy plik o nazwie „twoja_nazwa_funkcji.install”

Wewnątrz pliku deklaruj hook_update_N , możesz użyć field_delete_field () i jako nazwę podać nazwę pola, które chcesz usunąć.

Uruchom update.php, a pola zostaną usunięte.

subhojit777
źródło
0

Jeśli używasz field_phonew innych obszarach, możesz po prostu usunąć go ze swojego typu treści Osoba, ale nie usunąć go całkowicie ze swojej witryny. Utwórz ręcznie YOUR_FEATURE_NAME.installplik w folderze funkcji w następujący sposób:

/**
 * Implements hook_update_N().
 *
 * Removes field_phone from Person content type.
 */
function YOUR_FEATURE_NAME_update_7001() {
  if ($instance = field_info_instance('node', 'field_phone', 'person')) {
    field_delete_instance($instance);
  }
  field_purge_batch(500);
  features_revert_module('YOUR_FEATURE_NAME');
}

Jeśli usuwasz to z akapitu osoby zamiast typu zawartości osoby, możesz zmienić pierwszą instrukcję warunkową na coś takiego:

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
jimafisk
źródło