필드 삭제와 관련된 기능 워크 플로우 문제


14

내가 콘텐츠 형식이 있다고 가정 Person필드를 : Name, Age,Email

이 컨텐츠 유형은 기능이라는 test소스에 의해 제어되므로 소스 제어하여 라이브 사이트로 푸시 할 수 있습니다.

내 워크 플로는 다음과 같습니다.

  • 나는에 새로운 필드를 추가 Person라는Phone
  • 로컬로 나는 : drush fu test -y
  • test.info버전 번호를 높이기 위해 를 수정합니다.
  • 저장소에 변경 사항을 적용합니다.
  • 기능을 라이브 사이트로 푸시합니다 (기능 파일 복사)
  • 내가하는 라이브 사이트에서 : drush fr test -y
  • 내가하는 라이브 사이트에서 : drush cc all

그러면 새 필드가 라이브 사이트의에 나타납니다 Person.

첫 번째 단계에서 필드의 필드를 제거 Person하면 라이브 사이트에서 삭제되지 않습니다. 이 문제를 어떻게 해결합니까? 라이브 사이트의 UI에서 수동으로 삭제하고 싶지 않습니다.
이 작업 과정이 정확합니까?


1
drush fu test -y --version-increment를 사용하여 버전 번호를 자동으로 증가시킵니다.
Mike

답변:


9

이것은 양날의 칼이며, 항상 좋은 데이터 삭제를 방지하는 것과 같습니다 . 실제로 해결해야 할 것은 없습니다. 이것은 예상 된 동작입니다.

우리가 사용하고 1 년 넘게 해왔 던 것과 같은 워크 플로이며 실제로 잘 작동합니다. 나는 그것이 맞다고 말하지만 그것은 매우 주관적인 대답입니다.


필드를 정말로 삭제하고 싶습니까? 업데이트 후크를 조사해야합니까? (저는 D7 초보자입니다).
cherouvim

3
업데이트 후크가 이상적이거나 수동으로 제거하십시오.
디지털

2
OK, 나는 또한 할 수drush field-delete field
cherouvim

@cherouvim 기능을 다시 만들 때마다 그렇게해야합니까?
AlxVallejo

기능의 .install 파일에서 hook_update_N ()이 작동합니다.
Mike

10

기능으로 작성된 컨텐츠를 제거하는 올바른 방법은 hook_update_N (파일에 구현되어야 함 your_module.install)을 사용하는 것입니다.


기능의 주요 아이디어는 코드로 구성을 관리하는 것입니다. hook_update_N필드 삭제는 코드 (버전 제어로 관리 할 수 ​​있음)에 있기 때문에 관리 코드에서 동등한 명령 drush field-delete field을 호출하지 않기 때문에 사용 이 일관성이 있습니다 . 수행해야하는 (그리고 수행해야하는 것을 기억해야하는) 별도의 명령 줄 단계입니다.


왜? 잘 drush field-delete field작동 하지 않습니까?
cherouvim

5
물론, 그것은 효과가 있고 더 간단한 해결책 일 수 있습니다. 그러나 기능의 주요 아이디어는 코드로 구성을 관리하는 것입니다. hook_update()필드 삭제는 코드 (버전 제어로 관리 할 수 ​​있음)에 있지만 drush 명령은 관리 코드에서 호출되지 않기 때문에 사용 이 일관성이 있습니다. 수행해야하는 (그리고 수행해야하는 것을 기억해야하는) 별도의 명령 줄 단계입니다.
smokris

어떤 기능 파일에서 hook_update ()를 사용합니까? hook_update ()는 노드 객체를 매개 변수로 사용하므로 기능을 활성화하는 동안 노드 객체를 제공 할 수 없습니다.
subhojit777

@ subhojit777 : 죄송합니다. 잘못된 후크 설명서 페이지에 연결되었습니다. 방금 링크를 수정했습니다. 에 대한 문서를 참조하십시오 hook_update_N.
smokris 2016 년

@smokris : 나는 내 대답에 그 훅을 언급
subhojit777

2

"your_feature_name.install"이라는 새 파일을 작성하십시오.

파일 hook hook_update_N 내부에서 field_delete_field () 를 사용하고 매개 변수로 삭제하려는 필드 이름을 지정할 수 있습니다 .

update.php를 실행하면 필드가 삭제됩니다.


0

field_phone다른 영역에서 사용하는 경우 개인 컨텐츠 유형에서 제거하지만 사이트에서 완전히 삭제하지는 않을 수 있습니다. 다음 YOUR_FEATURE_NAME.install과 같이 기능의 폴더에 파일을 수동으로 작성 하십시오.

/**
 * 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');
}

Person Content Type 대신 Person Paragraph에서 이것을 삭제하는 경우 첫 번째 조건문을 다음과 같이 변경할 수 있습니다.

if ($instance = field_info_instance('paragraphs_item', 'field_phone', 'person')) {
  ...
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.