필드 설치 구성을 사용하여 모듈을 설치하는 동안 프로그래밍 방식으로 컨텐츠 유형을 작성했습니다 .
모듈 을 제거 하는 동안 해당 내용 유형을 삭제하고 싶습니다 .
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();
}