X-Git-Url: http://www.aleph1.co.uk/gitweb/?a=blobdiff_plain;f=web%2Fcore%2Fmodules%2Fnode%2Fsrc%2FForm%2FDeleteMultiple.php;fp=web%2Fcore%2Fmodules%2Fnode%2Fsrc%2FForm%2FDeleteMultiple.php;h=91d8ad4a9ea15747111aa40e9b7dda5f46ee5853;hb=a2bd1bf0c2c1f1a17d188f4dc0726a45494cefae;hp=0000000000000000000000000000000000000000;hpb=57c063afa3f66b07c4bbddc2d6129a96d90f0aad;p=yaffs-website diff --git a/web/core/modules/node/src/Form/DeleteMultiple.php b/web/core/modules/node/src/Form/DeleteMultiple.php new file mode 100644 index 000000000..91d8ad4a9 --- /dev/null +++ b/web/core/modules/node/src/Form/DeleteMultiple.php @@ -0,0 +1,199 @@ +tempStoreFactory = $temp_store_factory; + $this->storage = $manager->getStorage('node'); + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('user.private_tempstore'), + $container->get('entity.manager') + ); + } + + /** + * {@inheritdoc} + */ + public function getFormId() { + return 'node_multiple_delete_confirm'; + } + + /** + * {@inheritdoc} + */ + public function getQuestion() { + return $this->formatPlural(count($this->nodeInfo), 'Are you sure you want to delete this item?', 'Are you sure you want to delete these items?'); + } + + /** + * {@inheritdoc} + */ + public function getCancelUrl() { + return new Url('system.admin_content'); + } + + /** + * {@inheritdoc} + */ + public function getConfirmText() { + return t('Delete'); + } + + /** + * {@inheritdoc} + */ + public function buildForm(array $form, FormStateInterface $form_state) { + $this->nodeInfo = $this->tempStoreFactory->get('node_multiple_delete_confirm')->get(\Drupal::currentUser()->id()); + if (empty($this->nodeInfo)) { + return new RedirectResponse($this->getCancelUrl()->setAbsolute()->toString()); + } + /** @var \Drupal\node\NodeInterface[] $nodes */ + $nodes = $this->storage->loadMultiple(array_keys($this->nodeInfo)); + + $items = []; + foreach ($this->nodeInfo as $id => $langcodes) { + foreach ($langcodes as $langcode) { + $node = $nodes[$id]->getTranslation($langcode); + $key = $id . ':' . $langcode; + $default_key = $id . ':' . $node->getUntranslated()->language()->getId(); + + // If we have a translated entity we build a nested list of translations + // that will be deleted. + $languages = $node->getTranslationLanguages(); + if (count($languages) > 1 && $node->isDefaultTranslation()) { + $names = []; + foreach ($languages as $translation_langcode => $language) { + $names[] = $language->getName(); + unset($items[$id . ':' . $translation_langcode]); + } + $items[$default_key] = [ + 'label' => [ + '#markup' => $this->t('@label (Original translation) - The following content translations will be deleted:', ['@label' => $node->label()]), + ], + 'deleted_translations' => [ + '#theme' => 'item_list', + '#items' => $names, + ], + ]; + } + elseif (!isset($items[$default_key])) { + $items[$key] = $node->label(); + } + } + } + + $form['nodes'] = [ + '#theme' => 'item_list', + '#items' => $items, + ]; + $form = parent::buildForm($form, $form_state); + + return $form; + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, FormStateInterface $form_state) { + if ($form_state->getValue('confirm') && !empty($this->nodeInfo)) { + $total_count = 0; + $delete_nodes = []; + /** @var \Drupal\Core\Entity\ContentEntityInterface[][] $delete_translations */ + $delete_translations = []; + /** @var \Drupal\node\NodeInterface[] $nodes */ + $nodes = $this->storage->loadMultiple(array_keys($this->nodeInfo)); + + foreach ($this->nodeInfo as $id => $langcodes) { + foreach ($langcodes as $langcode) { + $node = $nodes[$id]->getTranslation($langcode); + if ($node->isDefaultTranslation()) { + $delete_nodes[$id] = $node; + unset($delete_translations[$id]); + $total_count += count($node->getTranslationLanguages()); + } + elseif (!isset($delete_nodes[$id])) { + $delete_translations[$id][] = $node; + } + } + } + + if ($delete_nodes) { + $this->storage->delete($delete_nodes); + $this->logger('content')->notice('Deleted @count posts.', ['@count' => count($delete_nodes)]); + } + + if ($delete_translations) { + $count = 0; + foreach ($delete_translations as $id => $translations) { + $node = $nodes[$id]->getUntranslated(); + foreach ($translations as $translation) { + $node->removeTranslation($translation->language()->getId()); + } + $node->save(); + $count += count($translations); + } + if ($count) { + $total_count += $count; + $this->logger('content')->notice('Deleted @count content translations.', ['@count' => $count]); + } + } + + if ($total_count) { + drupal_set_message($this->formatPlural($total_count, 'Deleted 1 post.', 'Deleted @count posts.')); + } + + $this->tempStoreFactory->get('node_multiple_delete_confirm')->delete(\Drupal::currentUser()->id()); + } + + $form_state->setRedirect('system.admin_content'); + } + +}