컨텐트 유형에서 필드를 삭제하는 가장 좋은 방법


21

GUI를 통해 정의 된 컨텐츠 유형에서 Drupal 7 필드를 제거하는 가장 좋은 방법은 무엇입니까? update_php를 실행할 때 변경 사항을 여러 서버에 전파 할 수 있도록 hook_update_N을 사용하고 싶습니다. 그러나 해결책을 찾지 못하는 것 같습니다. db_drop_table ()은 사용자 정의 스키마에 대해서는 의미가 있지만 GUI를 통해 정의 된 컨텐츠 유형 / 필드에는 적합하지 않습니다.


컨텐츠 유형을 정의하기 위해 사용자 정의 모듈을 작성 했습니까?
iStryker

iStryker : 관리 인터페이스를 통해 컨텐츠 유형을 생성하고 일부 필드를 추가 한 다음 기능을 통해 내보냈습니다. 그러나 이제 해당 필드 중 하나를 프로그래밍 방식으로 제거하고 싶습니다.
아마추어 바리 스타

D5는 herehere로 문서화 된 content_field_instance_delete () 함수를 제공 하지만 해당 함수는 D7에서 사용할 수 없습니다. 또한 D7 core의 field.install이 필드를 삭제하는 데 사용하는 것이 궁금합니다. _update_7000_field_delete_instance ()-다른 사람이 사용할 수없는 사용자 지정 "내부"함수입니다. 필드만큼 중요한 무언가를 위해 어딘가에 "공용"기능이 있어야하는 것 같습니다. 그게 내가 찾고있는 것입니다.
아마추어 바리 스타

현재 내 "후보자"공용 함수는 field_delete_instance ()입니다.
아마추어 바리 스타

답변:


18

필드를 삭제하는 두 가지 API 함수가 있습니다.

필드를 재사용하지 않으려는 경우 해당 컨텐츠 유형에서 인스턴스를 삭제하는 대신 전체 필드를 삭제하는 것이 약간 더 깔끔 할 수 있습니다. 오직 당신 만이 그것을 판단 할 수 있습니다.


2
매력처럼 일했다. 이 함수는 인수를 반환하지 않으므로 hook_update_N ()과 함께 사용할 때 watchdog ()을 수행하여 업데이트 변경 사항을 기록하는 것이 좋습니다.
아마추어 바리 스타

9

예, 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 함수는 결과를 예측할 수 없기 때문에 (예 : 업데이트가 실행되는 모듈이 비활성화 될 수 있기 때문에) 후크를 실행하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.