diff --git a/core/modules/comment/comment.admin.inc b/core/modules/comment/comment.admin.inc deleted file mode 100644 index 02f2278..0000000 --- a/core/modules/comment/comment.admin.inc +++ /dev/null @@ -1,231 +0,0 @@ -request->all(); - - if (isset($edit['operation']) && ($edit['operation'] == 'delete') && isset($edit['comments']) && $edit['comments']) { - return drupal_get_form(ConfirmDeleteMultiple::create(\Drupal::getContainer()), $request); - } - else { - return drupal_get_form('comment_admin_overview', $type); - } -} - -/** - * Form constructor for the comment overview administration form. - * - * @param $arg - * The type of overview form ('approval' or 'new'). - * - * @ingroup forms - * @see comment_admin() - * @see comment_admin_overview_validate() - * @see comment_admin_overview_submit() - * @see theme_comment_admin_overview() - */ -function comment_admin_overview($form, &$form_state, $arg) { - // Build an 'Update options' form. - $form['options'] = array( - '#type' => 'details', - '#title' => t('Update options'), - '#attributes' => array('class' => array('container-inline')), - ); - - if ($arg == 'approval') { - $options['publish'] = t('Publish the selected comments'); - } - else { - $options['unpublish'] = t('Unpublish the selected comments'); - } - $options['delete'] = t('Delete the selected comments'); - - $form['options']['operation'] = array( - '#type' => 'select', - '#title' => t('Action'), - '#title_display' => 'invisible', - '#options' => $options, - '#default_value' => 'publish', - ); - $form['options']['submit'] = array( - '#type' => 'submit', - '#value' => t('Update'), - ); - - // Load the comments that need to be displayed. - $status = ($arg == 'approval') ? COMMENT_NOT_PUBLISHED : COMMENT_PUBLISHED; - $header = array( - 'subject' => array('data' => t('Subject'), 'field' => 'subject'), - 'author' => array('data' => t('Author'), 'field' => 'name', 'class' => array(RESPONSIVE_PRIORITY_MEDIUM)), - 'posted_in' => array('data' => t('Posted in'), 'field' => 'node_title', 'class' => array(RESPONSIVE_PRIORITY_LOW)), - 'changed' => array('data' => t('Updated'), 'field' => 'c.changed', 'sort' => 'desc', 'class' => array(RESPONSIVE_PRIORITY_LOW)), - 'operations' => t('Operations'), - ); - - $query = db_select('comment', 'c') - ->extend('Drupal\Core\Database\Query\PagerSelectExtender') - ->extend('Drupal\Core\Database\Query\TableSortExtender'); - if (\Drupal::moduleHandler()->moduleExists('node')) { - // Special case to ensure node access works. - $query->leftJoin('node_field_data', 'n', "n.nid = c.entity_id AND c.entity_type = 'node'"); - $query->addTag('node_access'); - } - $result = $query - ->fields('c', array('cid', 'subject', 'name', 'changed', 'entity_id', 'entity_type', 'field_id')) - ->condition('c.status', $status) - ->limit(50) - ->orderByHeader($header) - ->execute(); - - $cids = array(); - $entity_ids = array(); - $entities = array(); - - // We collect entities grouped by entity_type so we can load them and use - // their labels. - foreach ($result as $row) { - $entity_ids[$row->entity_type][] = $row->entity_id; - $cids[] = $row->cid; - } - // Ensure all entities are statically cached so that we do not have to load - // them individually when getting their labels below. - foreach ($entity_ids as $entity_type => $ids) { - $entities[$entity_type] = entity_load_multiple($entity_type, $ids); - } - $comments = entity_load_multiple('comment', $cids); - - // Build a table listing the appropriate comments. - $options = array(); - $destination = drupal_get_destination(); - - foreach ($comments as $comment) { - // Use the first entity label. - $entity = $entities[$comment->entity_type->value][$comment->entity_id->value]; - $entity_uri = $entity->uri(); - // Remove the first node title from the node_titles array and attach to - // the comment. - $username = array( - '#theme' => 'username', - '#account' => comment_prepare_author($comment), - ); - $body = ''; - if (!empty($comment->comment_body->value)) { - $body = $comment->comment_body->value; - } - $options[$comment->id()] = array( - 'title' => array('data' => array('#title' => $comment->subject->value ?: $comment->id())), - 'subject' => array( - 'data' => array( - '#type' => 'link', - '#title' => $comment->subject->value, - '#href' => 'comment/' . $comment->id(), - '#options' => array('attributes' => array('title' => truncate_utf8($body, 128)), 'fragment' => 'comment-' . $comment->id()), - ), - ), - 'author' => drupal_render($username), - 'posted_in' => array( - 'data' => array( - '#type' => 'link', - '#title' => $entity->label(), - '#href' => $entity_uri['path'], - '#options' => $entity_uri['options'], - '#access' => $entity->access('view'), - ), - ), - 'changed' => format_date($comment->changed->value, 'short'), - ); - $links = array(); - $links['edit'] = array( - 'title' => t('edit'), - 'href' => 'comment/' . $comment->id() . '/edit', - 'query' => $destination, - ); - if (module_invoke('content_translation', 'translate_access', $comment)) { - $links['translate'] = array( - 'title' => t('translate'), - 'href' => 'comment/' . $comment->id() . '/translations', - 'query' => $destination, - ); - } - $options[$comment->id()]['operations']['data'] = array( - '#type' => 'operations', - '#links' => $links, - ); - } - - $form['comments'] = array( - '#type' => 'tableselect', - '#header' => $header, - '#options' => $options, - '#empty' => t('No comments available.'), - ); - - $form['pager'] = array('#theme' => 'pager'); - - return $form; -} - -/** - * Form validation handler for comment_admin_overview(). - * - * @see comment_admin_overview_submit() - */ -function comment_admin_overview_validate($form, &$form_state) { - $form_state['values']['comments'] = array_diff($form_state['values']['comments'], array(0)); - // We can't execute any 'Update options' if no comments were selected. - if (count($form_state['values']['comments']) == 0) { - form_set_error('', t('Select one or more comments to perform the update on.')); - } -} - -/** - * Form submission handler for comment_admin_overview(). - * - * Executes the chosen 'Update option' on the selected comments, such as - * publishing, unpublishing or deleting. - * - * @see comment_admin_overview_validate() - */ -function comment_admin_overview_submit($form, &$form_state) { - $operation = $form_state['values']['operation']; - $cids = $form_state['values']['comments']; - - if ($operation == 'delete') { - entity_delete_multiple('comment', $cids); - } - else { - foreach ($cids as $cid => $value) { - $comment = comment_load($value); - - if ($operation == 'unpublish') { - $comment->status->value = COMMENT_NOT_PUBLISHED; - } - elseif ($operation == 'publish') { - $comment->status->value = COMMENT_PUBLISHED; - } - $comment->save(); - } - } - drupal_set_message(t('The update has been performed.')); - $form_state['redirect'] = 'admin/content/comment'; - cache_invalidate_tags(array('content' => TRUE)); -} diff --git a/core/modules/comment/comment.routing.yml b/core/modules/comment/comment.routing.yml index e2343fb..37071ff 100644 --- a/core/modules/comment/comment.routing.yml +++ b/core/modules/comment/comment.routing.yml @@ -2,7 +2,7 @@ comment.admin: path: '/admin/content/comment' defaults: _title: 'Comments' - _content: '\Drupal\comment\Controller\CommentController::adminPage' + _content: '\Drupal\comment\Controller\AdminController::adminPage' type: 'new' requirements: _permission: 'administer comments' @@ -11,7 +11,7 @@ comment.admin_approval: path: '/admin/content/comment/approval' defaults: _title: 'Unapproved comments' - _content: '\Drupal\comment\Controller\CommentController::adminPage' + _content: '\Drupal\comment\Controller\AdminController::adminPage' type: 'approval' requirements: _permission: 'administer comments' diff --git a/core/modules/comment/lib/Drupal/comment/Controller/AdminController.php b/core/modules/comment/lib/Drupal/comment/Controller/AdminController.php index 38260ec..a855537 100644 --- a/core/modules/comment/lib/Drupal/comment/Controller/AdminController.php +++ b/core/modules/comment/lib/Drupal/comment/Controller/AdminController.php @@ -7,11 +7,14 @@ namespace Drupal\comment\Controller; +use Drupal\comment\Form\ConfirmDeleteMultiple; +use Drupal\comment\Form\CommentAdminOverview; +use Drupal\comment\CommentManagerInterface; +use Drupal\field\FieldInfo; use Drupal\Component\Utility\String; use Drupal\Core\Controller\ControllerBase; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; -use Drupal\comment\CommentManagerInterface; -use Drupal\field\FieldInfo; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\DependencyInjection\ContainerInterface; /** @@ -224,4 +227,27 @@ public function bundleTitle($field_name) { return $this->commentManager->getFieldUIPageTitle($field_name); } + /** + * Presents an administrative comment listing. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * The request of the page. + * @param string $type + * The type of the overview form ('approval' or 'new') default to 'new'. + * + * @return array + * Then comment multiple delete confirmation form or the comments overview + * administration form. + */ + public function adminPage(Request $request, $type = 'new') { + $edit = $request->request->all(); + + if (isset($edit['operation']) && ($edit['operation'] == 'delete') && isset($edit['comments']) && $edit['comments']) { + return drupal_get_form(ConfirmDeleteMultiple::create($this->container()), $request); + } + else { + return drupal_get_form(CommentAdminOverview::create($this->container()), $type); + } + } + } diff --git a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php index 1c2ffa9..f24a0d4 100644 --- a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php +++ b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php @@ -14,7 +14,6 @@ use Drupal\Core\Controller\ControllerBase; use Drupal\Core\Entity\EntityInterface; use Drupal\Core\DependencyInjection\ContainerInjectionInterface; -use Drupal\Core\Session\AccountInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\RedirectResponse; @@ -45,13 +44,6 @@ class CommentController extends ControllerBase implements ContainerInjectionInte protected $csrfToken; /** - * The current user service. - * - * @var \Drupal\Core\Session\AccountInterface - */ - protected $currentUser; - - /** * Field info service. * * @var \Drupal\field\FieldInfo @@ -72,17 +64,14 @@ class CommentController extends ControllerBase implements ContainerInjectionInte * HTTP kernel to handle requests. * @param \Drupal\Core\Access\CsrfTokenGenerator $csrf_token * The CSRF token manager service. - * @param \Drupal\Core\Session\AccountInterface $current_user - * The current user service. * @param \Drupal\field\FieldInfo $field_info * Field Info service. * @param \Drupal\comment\CommentManagerInterface $comment_manager * The comment manager service. */ - public function __construct(HttpKernelInterface $httpKernel, CsrfTokenGenerator $csrf_token, AccountInterface $current_user, FieldInfo $field_info, CommentManagerInterface $comment_manager) { + public function __construct(HttpKernelInterface $httpKernel, CsrfTokenGenerator $csrf_token, FieldInfo $field_info, CommentManagerInterface $comment_manager) { $this->httpKernel = $httpKernel; $this->csrfToken = $csrf_token; - $this->currentUser = $current_user; $this->fieldInfo = $field_info; $this->commentManager = $comment_manager; } @@ -94,7 +83,6 @@ public static function create(ContainerInterface $container) { return new static( $container->get('http_kernel'), $container->get('csrf_token'), - $container->get('current_user'), $container->get('field.info'), $container->get('comment.manager') ); @@ -269,7 +257,8 @@ public function getReplyForm(Request $request, $entity_type, $entity_id, $field_ } // Load the parent comment. $comment = $this->entityManager()->getStorageController('comment')->load($pid); - // Check if the parent comment is published and belongs to the current nid. + // Check if the parent comment is published and belongs to the current + // nid. if (($comment->status->value == COMMENT_NOT_PUBLISHED) || ($comment->entity_id->value != $entity->id())) { drupal_set_message($this->t('The comment you are replying to does not exist.'), 'error'); return new RedirectResponse($this->urlGenerator()->generateFromPath($uri['path'], array('absolute' => TRUE))); @@ -315,7 +304,7 @@ public function getReplyForm(Request $request, $entity_type, $entity_id, $field_ * The JSON response. */ public function renderNewCommentsNodeLinks(Request $request) { - if ($this->currentUser->isAnonymous()) { + if ($this->currentUser()->isAnonymous()) { throw new AccessDeniedHttpException(); } @@ -333,7 +322,7 @@ public function renderNewCommentsNodeLinks(Request $request) { $new = comment_num_new($node->id(), 'node'); $query = comment_new_page_count($node->{$field_name}->comment_count, $new, $node); $links[$nid] = array( - 'new_comment_count' => (int)$new, + 'new_comment_count' => (int) $new, 'first_new_comment_link' => $this->urlGenerator()->generateFromPath('node/' . $node->id(), array('query' => $query, 'fragment' => 'new')), ); } @@ -341,12 +330,4 @@ public function renderNewCommentsNodeLinks(Request $request) { return new JsonResponse($links); } - /** - * @todo Remove comment_admin(). - */ - public function adminPage($type) { - module_load_include('admin.inc', 'comment'); - return comment_admin($type); - } - } diff --git a/core/modules/comment/lib/Drupal/comment/Form/CommentAdminOverview.php b/core/modules/comment/lib/Drupal/comment/Form/CommentAdminOverview.php new file mode 100644 index 0000000..204ca02 --- /dev/null +++ b/core/modules/comment/lib/Drupal/comment/Form/CommentAdminOverview.php @@ -0,0 +1,286 @@ +commentStorage = $comment_storage; + $this->connection = $connection; + $this->date = $date; + $this->moduleHandler = $module_handler; + } + + /** + * {@inheritdoc} + */ + public static function create(ContainerInterface $container) { + return new static( + $container->get('entity.manager')->getStorageController('comment'), + $container->get('database'), + $container->get('date'), + $container->get('module_handler') + ); + } + + /** + * {@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 array $form_state + * An associative array containing 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, array &$form_state, $type = 'new') { + + // Build an 'Update options' form. + $form['options'] = array( + '#type' => 'details', + '#title' => $this->t('Update options'), + '#attributes' => array('class' => array('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'] = array( + '#type' => 'select', + '#title' => $this->t('Action'), + '#title_display' => 'invisible', + '#options' => $options, + '#default_value' => 'publish', + ); + $form['options']['submit'] = array( + '#type' => 'submit', + '#value' => $this->t('Update'), + ); + + // Load the comments that need to be displayed. + $status = ($type == 'approval') ? COMMENT_NOT_PUBLISHED : COMMENT_PUBLISHED; + $header = array( + 'subject' => array( + 'data' => $this->t('Subject'), + 'field' => 'subject', + ), + 'author' => array( + 'data' => $this->t('Author'), + 'field' => 'name', + 'class' => array(RESPONSIVE_PRIORITY_MEDIUM), + ), + 'posted_in' => array( + 'data' => $this->t('Posted in'), + 'field' => 'node_title', + 'class' => array(RESPONSIVE_PRIORITY_LOW), + ), + 'changed' => array( + 'data' => $this->t('Updated'), + 'field' => 'c.changed', + 'sort' => 'desc', + 'class' => array(RESPONSIVE_PRIORITY_LOW), + ), + 'operations' => $this->t('Operations'), + ); + + $query = $this->connection->select('comment', 'c') + ->extend('\Drupal\Core\Database\Query\PagerSelectExtender') + ->extend('\Drupal\Core\Database\Query\TableSortExtender'); + $query->join('node_field_data', 'n', 'n.nid = c.nid'); + $result = $query + ->fields('c', array('cid', 'nid', 'subject', 'name', 'changed')) + ->condition('c.status', $status) + ->limit(50) + ->orderByHeader($header) + ->execute(); + + $cids = array(); + + // We collect a sorted list of node_titles during the query to attach to the + // comments later. + foreach ($result as $row) { + $cids[] = $row->cid; + } + $comments = $this->commentStorage->loadMultiple($cids); + + // Build a table listing the appropriate comments. + $options = array(); + $destination = drupal_get_destination(); + + foreach ($comments as $comment) { + // Remove the first node title from the node_titles array and attach to + // the comment. + $node_title = $comment->nid->entity->label(); + $username = array( + '#theme' => 'username', + '#account' => comment_prepare_author($comment), + ); + $options[$comment->id()] = array( + 'title' => array('data' => array('#title' => $comment->subject->value ?: $comment->id())), + 'subject' => array( + 'data' => array( + '#type' => 'link', + '#title' => $comment->subject->value, + '#href' => 'comment/' . $comment->id(), + '#options' => array( + 'attributes' => array( + 'title' => Unicode::truncate($comment->comment_body->value, 128), + ), + 'fragment' => 'comment-' . $comment->id(), + ), + ), + ), + 'author' => drupal_render($username), + 'posted_in' => array( + 'data' => array( + '#type' => 'link', + '#title' => $node_title, + '#href' => 'node/' . $comment->nid->target_id, + ), + ), + 'changed' => $this->date->format($comment->changed->value, 'short'), + ); + $links = array(); + $links['edit'] = array( + 'title' => $this->t('edit'), + 'href' => 'comment/' . $comment->id() . '/edit', + 'query' => $destination, + ); + if ($this->moduleHandler->invoke('content_translation', 'translate_access', array($comment))) { + $links['translate'] = array( + 'title' => $this->t('translate'), + 'href' => 'comment/' . $comment->id() . '/translations', + 'query' => $destination, + ); + } + $options[$comment->id()]['operations']['data'] = array( + '#type' => 'operations', + '#links' => $links, + ); + } + + $form['comments'] = array( + '#type' => 'tableselect', + '#header' => $header, + '#options' => $options, + '#empty' => $this->t('No comments available.'), + ); + + $form['pager'] = array('#theme' => 'pager'); + + return $form; + } + + /** + * {@inheritdoc} + */ + public function validateForm(array &$form, array &$form_state) { + $form_state['values']['comments'] = array_diff($form_state['values']['comments'], array(0)); + // We can't execute any 'Update options' if no comments were selected. + if (count($form_state['values']['comments']) == 0) { + form_set_error('', $this->t('Select one or more comments to perform the update on.')); + } + } + + /** + * {@inheritdoc} + */ + public function submitForm(array &$form, array &$form_state) { + $operation = $form_state['values']['operation']; + $cids = $form_state['values']['comments']; + + if ($operation == 'delete') { + $comments = $this->commentStorage->loadMultiple($cids); + $this->commentStorage->delete($comments); + } + else { + foreach ($cids as $cid) { + $comment = $this->commentStorage->load($cid); + + if ($operation == 'unpublish') { + $comment->status->value = COMMENT_NOT_PUBLISHED; + } + elseif ($operation == 'publish') { + $comment->status->value = COMMENT_PUBLISHED; + } + $comment->save(); + } + } + drupal_set_message($this->t('The update has been performed.')); + $form_state['redirect'] = 'admin/content/comment'; + Cache::invalidateTags(array('content' => TRUE)); + } + +} diff --git a/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php b/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php index 08fb6d0..100fecc 100644 --- a/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php +++ b/core/modules/comment/lib/Drupal/comment/Form/ConfirmDeleteMultiple.php @@ -2,7 +2,7 @@ /** * @file - * Contains \Drupal\comment\Form\DeleteConfirmMultiple. + * Contains \Drupal\comment\Form\ConfirmDeleteMultiple. */ namespace Drupal\comment\Form; @@ -71,6 +71,9 @@ public function getQuestion() { * {@inheritdoc} */ public function getCancelRoute() { + return array( + 'route_name' => 'comment.admin', + ); } /** @@ -111,11 +114,7 @@ public function buildForm(array $form, array &$form_state, Request $request = NU $form_state['redirect'] = 'admin/content/comment'; } - $form = parent::buildForm($form, $form_state); - - // @todo Convert to getCancelRoute() after http://drupal.org/node/1986606. - $form['actions']['cancel']['#href'] = 'admin/content/comment'; - return $form; + return parent::buildForm($form, $form_state); } /**