diff core/modules/comment/src/Form/CommentAdminOverview.php @ 0:c75dbcec494b

Initial commit from drush-created site
author Chris Cannam
date Thu, 05 Jul 2018 14:24:15 +0000
parents
children a9cd425dd02b
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/modules/comment/src/Form/CommentAdminOverview.php	Thu Jul 05 14:24:15 2018 +0000
@@ -0,0 +1,299 @@
+<?php
+
+namespace Drupal\comment\Form;
+
+use Drupal\comment\CommentInterface;
+use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Datetime\DateFormatterInterface;
+use Drupal\Core\Entity\EntityTypeManagerInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Core\Form\FormBase;
+use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\TempStore\PrivateTempStoreFactory;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides the comments overview administration form.
+ *
+ * @internal
+ */
+class CommentAdminOverview extends FormBase {
+
+  /**
+   * The entity type manager.
+   *
+   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
+   */
+  protected $entityTypeManager;
+
+  /**
+   * The comment storage.
+   *
+   * @var \Drupal\comment\CommentStorageInterface
+   */
+  protected $commentStorage;
+
+  /**
+   * The date formatter service.
+   *
+   * @var \Drupal\Core\Datetime\DateFormatterInterface
+   */
+  protected $dateFormatter;
+
+  /**
+   * The module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * The tempstore factory.
+   *
+   * @var \Drupal\Core\TempStore\PrivateTempStoreFactory
+   */
+  protected $tempStoreFactory;
+
+  /**
+   * Creates a CommentAdminOverview form.
+   *
+   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
+   *   The entity manager service.
+   * @param \Drupal\Core\Datetime\DateFormatterInterface $date_formatter
+   *   The date formatter service.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   * @param \Drupal\Core\TempStore\PrivateTempStoreFactory $temp_store_factory
+   *   The tempstore factory.
+   */
+  public function __construct(EntityTypeManagerInterface $entity_type_manager, DateFormatterInterface $date_formatter, ModuleHandlerInterface $module_handler, PrivateTempStoreFactory $temp_store_factory) {
+    $this->entityTypeManager = $entity_type_manager;
+    $this->commentStorage = $entity_type_manager->getStorage('comment');
+    $this->dateFormatter = $date_formatter;
+    $this->moduleHandler = $module_handler;
+    $this->tempStoreFactory = $temp_store_factory;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('entity_type.manager'),
+      $container->get('date.formatter'),
+      $container->get('module_handler'),
+      $container->get('tempstore.private')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getFormId() {
+    return 'comment_admin_overview';
+  }
+
+  /**
+   * Form constructor for the comment overview administration form.
+   *
+   * @param array $form
+   *   An associative array containing the structure of the form.
+   * @param \Drupal\Core\Form\FormStateInterface $form_state
+   *   The current state of the form.
+   * @param string $type
+   *   The type of the overview form ('approval' or 'new').
+   *
+   * @return array
+   *   The form structure.
+   */
+  public function buildForm(array $form, FormStateInterface $form_state, $type = 'new') {
+
+    // Build an 'Update options' form.
+    $form['options'] = [
+      '#type' => 'details',
+      '#title' => $this->t('Update options'),
+      '#open' => TRUE,
+      '#attributes' => ['class' => ['container-inline']],
+    ];
+
+    if ($type == 'approval') {
+      $options['publish'] = $this->t('Publish the selected comments');
+    }
+    else {
+      $options['unpublish'] = $this->t('Unpublish the selected comments');
+    }
+    $options['delete'] = $this->t('Delete the selected comments');
+
+    $form['options']['operation'] = [
+      '#type' => 'select',
+      '#title' => $this->t('Action'),
+      '#title_display' => 'invisible',
+      '#options' => $options,
+      '#default_value' => 'publish',
+    ];
+    $form['options']['submit'] = [
+      '#type' => 'submit',
+      '#value' => $this->t('Update'),
+    ];
+
+    // Load the comments that need to be displayed.
+    $status = ($type == 'approval') ? CommentInterface::NOT_PUBLISHED : CommentInterface::PUBLISHED;
+    $header = [
+      'subject' => [
+        'data' => $this->t('Subject'),
+        'specifier' => 'subject',
+      ],
+      'author' => [
+        'data' => $this->t('Author'),
+        'specifier' => 'name',
+        'class' => [RESPONSIVE_PRIORITY_MEDIUM],
+      ],
+      'posted_in' => [
+        'data' => $this->t('Posted in'),
+        'class' => [RESPONSIVE_PRIORITY_LOW],
+      ],
+      'changed' => [
+        'data' => $this->t('Updated'),
+        'specifier' => 'changed',
+        'sort' => 'desc',
+        'class' => [RESPONSIVE_PRIORITY_LOW],
+      ],
+      'operations' => $this->t('Operations'),
+    ];
+    $cids = $this->commentStorage->getQuery()
+      ->condition('status', $status)
+      ->tableSort($header)
+      ->pager(50)
+      ->execute();
+
+    /** @var $comments \Drupal\comment\CommentInterface[] */
+    $comments = $this->commentStorage->loadMultiple($cids);
+
+    // Build a table listing the appropriate comments.
+    $options = [];
+    $destination = $this->getDestinationArray();
+
+    $commented_entity_ids = [];
+    $commented_entities = [];
+
+    foreach ($comments as $comment) {
+      $commented_entity_ids[$comment->getCommentedEntityTypeId()][] = $comment->getCommentedEntityId();
+    }
+
+    foreach ($commented_entity_ids as $entity_type => $ids) {
+      $commented_entities[$entity_type] = $this->entityTypeManager
+        ->getStorage($entity_type)
+        ->loadMultiple($ids);
+    }
+
+    foreach ($comments as $comment) {
+      /** @var $commented_entity \Drupal\Core\Entity\EntityInterface */
+      $commented_entity = $commented_entities[$comment->getCommentedEntityTypeId()][$comment->getCommentedEntityId()];
+      $comment_permalink = $comment->permalink();
+      if ($comment->hasField('comment_body') && ($body = $comment->get('comment_body')->value)) {
+        $attributes = $comment_permalink->getOption('attributes') ?: [];
+        $attributes += ['title' => Unicode::truncate($body, 128)];
+        $comment_permalink->setOption('attributes', $attributes);
+      }
+      $options[$comment->id()] = [
+        'title' => ['data' => ['#title' => $comment->getSubject() ?: $comment->id()]],
+        'subject' => [
+          'data' => [
+            '#type' => 'link',
+            '#title' => $comment->getSubject(),
+            '#url' => $comment_permalink,
+          ],
+        ],
+        'author' => [
+          'data' => [
+            '#theme' => 'username',
+            '#account' => $comment->getOwner(),
+          ],
+        ],
+        'posted_in' => [
+          'data' => [
+            '#type' => 'link',
+            '#title' => $commented_entity->label(),
+            '#access' => $commented_entity->access('view'),
+            '#url' => $commented_entity->urlInfo(),
+          ],
+        ],
+        'changed' => $this->dateFormatter->format($comment->getChangedTimeAcrossTranslations(), 'short'),
+      ];
+      $comment_uri_options = $comment->urlInfo()->getOptions() + ['query' => $destination];
+      $links = [];
+      $links['edit'] = [
+        'title' => $this->t('Edit'),
+        'url' => $comment->urlInfo('edit-form', $comment_uri_options),
+      ];
+      if ($this->moduleHandler->moduleExists('content_translation') && $this->moduleHandler->invoke('content_translation', 'translate_access', [$comment])->isAllowed()) {
+        $links['translate'] = [
+          'title' => $this->t('Translate'),
+          'url' => $comment->urlInfo('drupal:content-translation-overview', $comment_uri_options),
+        ];
+      }
+      $options[$comment->id()]['operations']['data'] = [
+        '#type' => 'operations',
+        '#links' => $links,
+      ];
+    }
+
+    $form['comments'] = [
+      '#type' => 'tableselect',
+      '#header' => $header,
+      '#options' => $options,
+      '#empty' => $this->t('No comments available.'),
+    ];
+
+    $form['pager'] = ['#type' => 'pager'];
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function validateForm(array &$form, FormStateInterface $form_state) {
+    $form_state->setValue('comments', array_diff($form_state->getValue('comments'), [0]));
+    // We can't execute any 'Update options' if no comments were selected.
+    if (count($form_state->getValue('comments')) == 0) {
+      $form_state->setErrorByName('', $this->t('Select one or more comments to perform the update on.'));
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function submitForm(array &$form, FormStateInterface $form_state) {
+    $operation = $form_state->getValue('operation');
+    $cids = $form_state->getValue('comments');
+    /** @var \Drupal\comment\CommentInterface[] $comments */
+    $comments = $this->commentStorage->loadMultiple($cids);
+    if ($operation != 'delete') {
+      foreach ($comments as $comment) {
+        if ($operation == 'unpublish') {
+          $comment->setUnpublished();
+        }
+        elseif ($operation == 'publish') {
+          $comment->setPublished();
+        }
+        $comment->save();
+      }
+      drupal_set_message($this->t('The update has been performed.'));
+      $form_state->setRedirect('comment.admin');
+    }
+    else {
+      $info = [];
+      /** @var \Drupal\comment\CommentInterface $comment */
+      foreach ($comments as $comment) {
+        $langcode = $comment->language()->getId();
+        $info[$comment->id()][$langcode] = $langcode;
+      }
+      $this->tempStoreFactory
+        ->get('comment_multiple_delete_confirm')
+        ->set($this->currentUser()->id(), $info);
+      $form_state->setRedirect('comment.multiple_delete_confirm');
+    }
+  }
+
+}