GUI를 통해 정의 된 컨텐츠 유형에서 Drupal 7 필드를 제거하는 가장 좋은 방법은 무엇입니까? update_php를 실행할 때 변경 사항을 여러 서버에 전파 할 수 있도록 hook_update_N을 사용하고 싶습니다. 그러나 해결책을 찾지 못하는 것 같습니다. db_drop_table ()은 사용자 정의 스키마에 대해서는 의미가 있지만 GUI를 통해 정의 된 컨텐츠 유형 / 필드에는 적합하지 않습니다.
GUI를 통해 정의 된 컨텐츠 유형에서 Drupal 7 필드를 제거하는 가장 좋은 방법은 무엇입니까? update_php를 실행할 때 변경 사항을 여러 서버에 전파 할 수 있도록 hook_update_N을 사용하고 싶습니다. 그러나 해결책을 찾지 못하는 것 같습니다. db_drop_table ()은 사용자 정의 스키마에 대해서는 의미가 있지만 GUI를 통해 정의 된 컨텐츠 유형 / 필드에는 적합하지 않습니다.
답변:
필드를 삭제하는 두 가지 API 함수가 있습니다.
field_delete_field
전체 필드 (필드의 모든 인스턴스)를 삭제하려면field_delete_instance
필드의 인스턴스 만 삭제하려면 엔터티에 연결되는 방식입니다.필드를 재사용하지 않으려는 경우 해당 컨텐츠 유형에서 인스턴스를 삭제하는 대신 전체 필드를 삭제하는 것이 약간 더 깔끔 할 수 있습니다. 오직 당신 만이 그것을 판단 할 수 있습니다.
예, field_delete_instance () 는 필드 인스턴스를 삭제하는 함수입니다.
참고 것을 field_delete_instance()
자동으로 호출 field_delete_field()
남아있는 경우가없는 경우 그래서, field_delete_instance()
대부분의 모든 당신이 이제까지해야합니다.
_update_7000_field_delete_instance()
핵심 업데이트 기능을 위해 설계되었습니다. 예 : 업데이트 기능 x_update_7000()
에서 사용하고 field_delete_instance()
있습니다. 그런 다음에서 일관되지 않은 방식으로 테이블 x_update_7001()
을 변경 {field_config}
하고 field_delete_instance()
분명히 변경해야합니다.
그러나 지금 은 테이블이 여전히 오래된 구조이기 때문에에 대한 x_update_7000()
호출로 field_delete_instance()
인해 오류가 발생합니다. 그러나 기여한 모듈의 상황은 항상 다릅니다. 모든 코어 업데이트 후에 항상 실행 해야하므로 최신 코어 버전으로 작업해야합니다.
그러나 이는 업데이트 기능에 사용중인 고유 한 API 기능에 사용할 패턴입니다.
또한 이러한 _update 함수는 결과를 예측할 수 없기 때문에 (예 : 업데이트가 실행되는 모듈이 비활성화 될 수 있기 때문에) 후크를 실행하지 않습니다.