ContentEntityDeleteForm.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <?php
  2. namespace Drupal\Core\Entity;
  3. use Drupal\Core\Form\FormStateInterface;
  4. /**
  5. * Provides a generic base class for a content entity deletion form.
  6. *
  7. * @internal
  8. *
  9. * @todo Re-evaluate and streamline the entity deletion form class hierarchy in
  10. * https://www.drupal.org/node/2491057.
  11. */
  12. class ContentEntityDeleteForm extends ContentEntityConfirmFormBase {
  13. use EntityDeleteFormTrait {
  14. getQuestion as traitGetQuestion;
  15. logDeletionMessage as traitLogDeletionMessage;
  16. getDeletionMessage as traitGetDeletionMessage;
  17. getCancelUrl as traitGetCancelUrl;
  18. }
  19. /**
  20. * {@inheritdoc}
  21. */
  22. public function buildForm(array $form, FormStateInterface $form_state) {
  23. $form = parent::buildForm($form, $form_state);
  24. /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
  25. $entity = $this->getEntity();
  26. if ($entity->isDefaultTranslation()) {
  27. if (count($entity->getTranslationLanguages()) > 1) {
  28. $languages = [];
  29. foreach ($entity->getTranslationLanguages() as $language) {
  30. $languages[] = $language->getName();
  31. }
  32. $form['deleted_translations'] = [
  33. '#theme' => 'item_list',
  34. '#title' => $this->t('The following @entity-type translations will be deleted:', [
  35. '@entity-type' => $entity->getEntityType()->getLowercaseLabel(),
  36. ]),
  37. '#items' => $languages,
  38. ];
  39. $form['actions']['submit']['#value'] = $this->t('Delete all translations');
  40. }
  41. }
  42. else {
  43. $form['actions']['submit']['#value'] = $this->t('Delete @language translation', ['@language' => $entity->language()->getName()]);
  44. }
  45. return $form;
  46. }
  47. /**
  48. * {@inheritdoc}
  49. */
  50. public function submitForm(array &$form, FormStateInterface $form_state) {
  51. /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
  52. $entity = $this->getEntity();
  53. $message = $this->getDeletionMessage();
  54. // Make sure that deleting a translation does not delete the whole entity.
  55. if (!$entity->isDefaultTranslation()) {
  56. $untranslated_entity = $entity->getUntranslated();
  57. $untranslated_entity->removeTranslation($entity->language()->getId());
  58. $untranslated_entity->save();
  59. $form_state->setRedirectUrl($untranslated_entity->urlInfo('canonical'));
  60. }
  61. else {
  62. $entity->delete();
  63. $form_state->setRedirectUrl($this->getRedirectUrl());
  64. }
  65. $this->messenger()->addStatus($message);
  66. $this->logDeletionMessage();
  67. }
  68. /**
  69. * {@inheritdoc}
  70. */
  71. public function getCancelUrl() {
  72. /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
  73. $entity = $this->getEntity();
  74. return $entity->isDefaultTranslation() ? $this->traitGetCancelUrl() : $entity->urlInfo('canonical');
  75. }
  76. /**
  77. * {@inheritdoc}
  78. */
  79. protected function getDeletionMessage() {
  80. /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
  81. $entity = $this->getEntity();
  82. if (!$entity->isDefaultTranslation()) {
  83. return $this->t('The @entity-type %label @language translation has been deleted.', [
  84. '@entity-type' => $entity->getEntityType()->getLowercaseLabel(),
  85. '%label' => $entity->label(),
  86. '@language' => $entity->language()->getName(),
  87. ]);
  88. }
  89. return $this->traitGetDeletionMessage();
  90. }
  91. /**
  92. * {@inheritdoc}
  93. */
  94. protected function logDeletionMessage() {
  95. /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
  96. $entity = $this->getEntity();
  97. if (!$entity->isDefaultTranslation()) {
  98. $this->logger($entity->getEntityType()->getProvider())->notice('The @entity-type %label @language translation has been deleted.', [
  99. '@entity-type' => $entity->getEntityType()->getLowercaseLabel(),
  100. '%label' => $entity->label(),
  101. '@language' => $entity->language()->getName(),
  102. ]);
  103. }
  104. else {
  105. $this->traitLogDeletionMessage();
  106. }
  107. }
  108. /**
  109. * {@inheritdoc}
  110. */
  111. public function getQuestion() {
  112. /** @var \Drupal\Core\Entity\ContentEntityInterface $entity */
  113. $entity = $this->getEntity();
  114. if (!$entity->isDefaultTranslation()) {
  115. return $this->t('Are you sure you want to delete the @language translation of the @entity-type %label?', [
  116. '@language' => $entity->language()->getName(),
  117. '@entity-type' => $this->getEntity()->getEntityType()->getLowercaseLabel(),
  118. '%label' => $this->getEntity()->label(),
  119. ]);
  120. }
  121. return $this->traitGetQuestion();
  122. }
  123. }