diff --git a/core/modules/comment/comment.pages.inc b/core/modules/comment/comment.pages.inc deleted file mode 100644 index 4998f83..0000000 --- a/core/modules/comment/comment.pages.inc +++ /dev/null @@ -1,101 +0,0 @@ -label(), 'node/' . $node->nid))); - $op = Drupal::request()->request->get('op'); - $build = array(); - - // The user is previewing a comment prior to submitting it. - if ($op == t('Preview')) { - if (user_access('post comments')) { - $build['comment_form'] = comment_add($node, $pid); - } - else { - drupal_set_message(t('You are not authorized to post comments.'), 'error'); - return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE))); - } - } - else { - // $pid indicates that this is a reply to a comment. - if ($pid) { - if (user_access('access comments')) { - // Load the parent comment. - $comment = comment_load($pid); - if ($comment->status->value == COMMENT_PUBLISHED) { - // If that comment exists, make sure that the current comment and the - // parent comment both belong to the same parent node. - if ($comment->nid->target_id != $node->nid) { - // Attempting to reply to a comment not belonging to the current nid. - drupal_set_message(t('The comment you are replying to does not exist.'), 'error'); - return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE))); - } - // Display the parent comment - $build['comment_parent'] = comment_view($comment); - } - else { - drupal_set_message(t('The comment you are replying to does not exist.'), 'error'); - return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE))); - } - } - else { - drupal_set_message(t('You are not authorized to view comments.'), 'error'); - return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE))); - } - } - // This is the case where the comment is in response to a node. Display the node. - elseif (user_access('access content')) { - $build['comment_node'] = node_view($node); - } - - // Should we show the reply box? - if ($node->comment != COMMENT_NODE_OPEN) { - drupal_set_message(t("This discussion is closed: you can't post new comments."), 'error'); - return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE))); - } - elseif (user_access('post comments')) { - $build['comment_form'] = comment_add($node, $pid); - } - else { - drupal_set_message(t('You are not authorized to post comments.'), 'error'); - return new RedirectResponse(url("node/$node->nid", array('absolute' => TRUE))); - } - } - - return $build; -} diff --git a/core/modules/comment/comment.routing.yml b/core/modules/comment/comment.routing.yml index eaaeba4..02e638b 100644 --- a/core/modules/comment/comment.routing.yml +++ b/core/modules/comment/comment.routing.yml @@ -12,3 +12,11 @@ comment_approve: entity_type: 'comment' requirements: _entity_access: 'comment.approve' + +comment_reply: + pattern: 'comment/reply/{node}/{pid}' + defaults: + _content: '\Drupal\comment\Controller\CommentController::getReply' + pid : ~ + requirements: + _entity_access: node.view diff --git a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php index 10e61ea..32e7d1d 100644 --- a/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php +++ b/core/modules/comment/lib/Drupal/comment/Controller/CommentController.php @@ -10,7 +10,9 @@ use Drupal\comment\CommentInterface; use Drupal\comment\Plugin\Core\Entity\Comment; use Drupal\Core\Controller\ControllerInterface; +use Drupal\Core\Entity\EntityManager; use Drupal\Core\Routing\PathBasedGeneratorInterface; +use Drupal\Node\NodeInterface; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\RedirectResponse; use Symfony\Component\HttpFoundation\Request; @@ -24,6 +26,13 @@ class CommentController implements ControllerInterface { /** + * The entity manager service. + * + * @var \Drupal\Core\Entity\EntityManager + */ + protected $entityManager; + + /** * The url generator service. * * @var \Drupal\Core\Routing\PathBasedGeneratorInterface @@ -33,17 +42,22 @@ class CommentController implements ControllerInterface { /** * Constructs a CommentController object. * + * @param \Drupal\Core\Entity\EntityManager $entity_manager + * The entity manager. * @param \Drupal\Core\Routing\PathBasedGeneratorInterface $url_generator - * The url generator service. + * The url generator. */ - public function __construct(PathBasedGeneratorInterface $url_generator) { + public function __construct(EntityManager $entity_manager, PathBasedGeneratorInterface $url_generator) { + $this->entityManager = $entity_manager; $this->urlGenerator = $url_generator; } /** * {@inheritdoc} */ public static function create(ContainerInterface $container) { - return new static($container->get('url_generator')); + return new static( + $container->get('plugin.manager.entity'), + $container->get('url_generator')); } /** @@ -77,4 +91,115 @@ public function commentApprove(Request $request, CommentInterface $comment) { return new RedirectResponse($url); } + /** + * Form constructor for the comment reply form. + * + * There are several cases that have to be handled, including: + * - replies to comments + * - replies to nodes + * - attempts to reply to nodes that can no longer accept comments + * - respecting access permissions ('access comments', 'post comments', etc.) + * + * The node or comment that is being replied to must appear above the comment + * form to provide the user context while authoring the comment. + * + * @param \Drupal\node\NodeInterface $node + * Every comment belongs to a node. This is that node. + * @param int $pid + * (optional) Some comments are replies to other comments. In those cases, + * $pid is the parent comment's comment ID. Defaults to NULL. + * + * @param \Symfony\Component\HttpFoundation\Request $request + * The current request object containing the search string. + * + * @return array|Symfony\Component\HttpFoundation\RedirectResponse + * One of the following: + * - An associative array containing: + * - An array for rendering the node or parent comment. + * - comment_node: If the comment is a reply to the node. + * - comment_parent: If the comment is a reply to another comment. + * - comment_form: The comment form as a renderable array. + * - A redirect response to current node: + * - If user is not authorized to post comments. + * - If parent comment doesn't belong to current node. + * - If user is not authorized to view comments. + * - If current node comments are disable. + */ + public function getReply(NodeInterface $node, $pid, Request $request) { + $uri = $node->uri(); + // Set the breadcrumb trail. + drupal_set_breadcrumb(array(l(t('Home'), NULL), l($node->label(), $uri['path']))); + $op = $request->request->get('op'); + $build = array(); + + // The user is previewing a comment prior to submitting it. + if ($op == t('Preview')) { + if (user_access('post comments')) { + $comment = $this->entityManager->getStorageController('comment')->create(array( + 'nid' => $node->id(), + 'pid' => $pid, + 'node_type' => 'comment_node_' . $node->bundle(), + )); + $build['comment_form'] = $this->entityManager->getForm($comment); + } + else { + drupal_set_message(t('You are not authorized to post comments.'), 'error'); + return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE))); + + } + } + else { + // $pid indicates that this is a reply to a comment. + if ($pid) { + if (user_access('access comments')) { + // Load the parent comment. + $comments = $this->entityManager->getStorageController('comment')->load(array($pid)); + $comment = reset($comments); + if ($comment->status->value == COMMENT_PUBLISHED) { + // If that comment exists, make sure that the current comment and the + // parent comment both belong to the same parent node. + if ($comment->nid->target_id != $node->id()) { + // Attempting to reply to a comment not belonging to the current nid. + drupal_set_message(t('The comment you are replying to does not exist.'), 'error'); + return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE))); + } + // Display the parent comment + $build['comment_parent'] = $this->entityManager->getRenderController('comment')->view($comment); + } + else { + drupal_set_message(t('The comment you are replying to does not exist.'), 'error'); + return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE))); + } + } + else { + drupal_set_message(t('You are not authorized to view comments.'), 'error'); + return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE))); + } + } + // This is the case where the comment is in response to a node. Display the node. + elseif (user_access('access content')) { + $build['comment_node'] = $this->entityManager->getRenderController('node')->view($node); + } + + // Should we show the reply box? + if ($node->comment != COMMENT_NODE_OPEN) { + drupal_set_message(t("This discussion is closed: you can't post new comments."), 'error'); + return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE))); + } + elseif (user_access('post comments')) { + $comment = $this->entityManager->getStorageController('comment')->create(array( + 'nid' => $node->id(), + 'pid' => $pid, + 'node_type' => 'comment_node_' . $node->bundle(), + )); + $build['comment_form'] = $this->entityManager->getForm($comment); + } + else { + drupal_set_message(t('You are not authorized to post comments.'), 'error'); + return new RedirectResponse($this->urlGenerator->generateFromPath($uri['path'], array('absolute' => TRUE))); + } + } + return $build; + } + }