프로그래밍 방식으로 콘텐츠 유형을 삭제하는 방법은 무엇입니까? 사용하여 모듈을 설치하는

필드 설치 구성을 사용하여 모듈을 설치하는 동안 프로그래밍 방식으로 컨텐츠 유형을 작성했습니다 .

모듈 을 제거 하는 동안 해당 내용 유형을 삭제하고 싶습니다 .

Drupal 8로 이것을 할 수있는 방법이 있습니까?



답변

노드 유형이 모듈에 따라 다르면 Drupal이 자동으로 삭제합니다.

예제는 book 모듈에서 node.type.book.yml을 참조하십시오. 이것은 관련 부분입니다.

dependencies:
  enforced:
    module:
      - book

사용자는 해당 유형의 모든 내용을 삭제해야 모듈을 제거 할 수 있습니다.


답변

이것은 나를 위해 그것을하는 것 같습니다.

$content_type = \Drupal::entityManager()->getStorage('node_type')->load('MACHINE_NAME_OF_TYPE');
$content_type->delete();

답변

의견이 충분하지 않다면 여기에 넣겠습니다.

@ Berdir, node.type.custom.yml 파일에 모듈을 적용하는 것이 제거 할 때 노드 삭제를 강제하기에는 충분하지 않은 것 같습니다.

사용자는 해당 유형의 모든 내용을 삭제해야 모듈을 제거 할 수 있습니다.

필자의 경우 컨텐츠 유형은 모듈을 제거 할 때 삭제됩니다. 그러나 사용자 정의 컨텐츠 (노드)의 삭제는 시행되지 않습니다. 이를 위해 커스텀 모듈은를 구현해야합니다 ModuleUninstallValidatorInterface.

구현 된 경우 사용자 정의 노드를 삭제하기 전에 사용자 정의 모듈을 설치 제거 할 수 없습니다. 선택 상자가 비활성화됩니다.

인터페이스를 구현하는 대신 다음에서 노드를 삭제하여 더럽게하고 있습니다 hook_uninstall().

function MYMODULE_uninstall() {

  // Delete custom_type nodes when uninstalling.
  $query = \Drupal::entityQuery('node')
    ->condition('type', 'custom_type');
  $nids = $query->execute();
  // debug($nids);
  foreach ($nids as $nid) {
    \Drupal\node\Entity\Node::load($nid)->delete();
  }
}

답변

모듈을 제거 할 때 일부 작업을 트리거하려면 hook_uninstall모듈 *.install파일 에서 구현 해야 합니다. 컨텐츠 유형을 삭제하기 전에 해당 컨텐츠 유형의 모든 노드도 삭제되도록 할 수 있습니다. 마지막으로, 모듈을 제거하고 컨텐츠 유형을 삭제 한 후 업데이트 된 구성을 내보내는 것을 잊지 마십시오.

/**
 * Place a short description here.
 */
function MYMODULE_uninstall() {

  // Delete all nodes of given content type.
  $storage_handler = \Drupal::entityTypeManager()
    ->getStorage('node');
  $nodes = $storage_handler->loadByProperties(['type' => 'MACHINE_NAME_OF_TYPE']);
  $storage_handler->delete($nodes);

  // Delete content type.
  $content_type = \Drupal::entityTypeManager()
    ->getStorage('node_type')
    ->load('MACHINE_NAME_OF_TYPE');
  $content_type->delete();
}