You are here

public function AjaxCommentsController::socialAdd in Open Social 10.3.x

Same name and namespace in other branches
  1. 8.9 modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
  2. 8.8 modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
  3. 10.0.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
  4. 10.1.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
  5. 10.2.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()

Builds ajax response for adding a new comment without a parent comment.

This is copied from AjaxCommentsController::add because a reply on a reply is using the add new Form with a mention. While Ajax comments uses the save function for a reply. This results in status message not being rendered correctly. The only change here is the addMessage is placed above the reply.

Parameters

\Symfony\Component\HttpFoundation\Request $request: The current request object.

\Drupal\Core\Entity\EntityInterface $entity: The entity this comment belongs to.

string $field_name: The field_name to which the comment belongs.

int $pid: (optional) Some comments are replies to other comments. In those cases, $pid is the parent comment's comment ID. Defaults to NULL.

Return value

\Drupal\Core\Ajax\AjaxResponse The Ajax response.

See also

\Drupal\comment\Controller\CommentController::getReplyForm()

1 call to AjaxCommentsController::socialAdd()
SocialPostAlbumAjaxCommentsController::socialAdd in modules/social_features/social_post/modules/social_post_album/src/Controller/SocialPostAlbumAjaxCommentsController.php
Builds ajax response for adding a new comment without a parent comment.
1 string reference to 'AjaxCommentsController::socialAdd'
social_ajax_comments.routing.yml in modules/custom/social_ajax_comments/social_ajax_comments.routing.yml
modules/custom/social_ajax_comments/social_ajax_comments.routing.yml
1 method overrides AjaxCommentsController::socialAdd()
SocialPostAlbumAjaxCommentsController::socialAdd in modules/social_features/social_post/modules/social_post_album/src/Controller/SocialPostAlbumAjaxCommentsController.php
Builds ajax response for adding a new comment without a parent comment.

File

modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php, line 115

Class

AjaxCommentsController
Controller routines for AJAX comments routes.

Namespace

Drupal\social_ajax_comments\Controller

Code

public function socialAdd(Request $request, EntityInterface $entity, $field_name, $pid = NULL) {
  $response = new AjaxResponse();

  // Store the selectors from the incoming request, if applicable.
  // If the selectors are not in the request, the stored ones will
  // not be overwritten.
  $this->tempStore
    ->getSelectors($request, TRUE);

  // Check the user's access to reply.
  // The user should not have made it this far without proper permission,
  // but adding this access check as a fallback.
  $this
    ->replyAccess($request, $response, $entity, $field_name, $pid);

  // If $this->replyAccess() added any commands to the AjaxResponse,
  // it means that access was denied, so we should NOT submit the form
  // and rebuild the comment field. Just return the response with the
  // error message.
  if (!empty($response
    ->getCommands())) {
    return $response;
  }
  $request->request
    ->set('social_ajax_comments', TRUE);

  // Build the comment entity form.
  // This approach is very similar to the one taken in
  // \Drupal\comment\CommentLazyBuilders::renderForm().

  /** @var \Drupal\comment\CommentInterface $comment */
  $comment = $this
    ->entityTypeManager()
    ->getStorage('comment')
    ->create([
    'entity_id' => $entity
      ->id(),
    'pid' => $pid,
    'entity_type' => $entity
      ->getEntityTypeId(),
    'field_name' => $field_name,
  ]);

  // Rebuild the form to trigger form submission.
  $form = $this
    ->entityFormBuilder()
    ->getForm($comment);

  // Check for errors.
  if (!($this->errors = count($this
    ->messenger()
    ->messagesByType('error')))) {

    // If there are no errors, set the ajax-updated
    // selector value for the form.
    $this->tempStore
      ->setSelector('form_html_id', $form['#attributes']['id']);
    $this->pid = $pid;

    // Build the updated comment field and insert into a replaceWith
    // response.
    $response = $this
      ->buildCommentFieldResponse($request, $response, $entity, $field_name);
  }
  else {

    // Retrieve the selector values for use in building the response.
    $selectors = $this->tempStore
      ->getSelectors($request, TRUE);
    $wrapper_html_id = $selectors['wrapper_html_id'];

    // If there are errors, remove old messages.
    $response
      ->addCommand(new RemoveCommand($wrapper_html_id . ' .js-ajax-comments-messages'));
  }

  // This ensures for a reply we will render the comment above the reply.
  if ($comment
    ->isNew()) {

    // Retrieve the comment id of the new comment, which was saved in
    // AjaxCommentsForm::save() during the previous HTTP request.
    $cid = $this->tempStore
      ->getCid();

    // Try to insert the message above the new comment.
    if (!empty($cid) && !$this->errors && $this
      ->currentUser()
      ->hasPermission('skip comment approval')) {
      $selector = static::getCommentSelectorPrefix() . $cid;
      $position = 'before';
    }
    elseif ($comment
      ->hasParentComment()) {
      $selector = static::getCommentSelectorPrefix() . $comment
        ->getParentComment()
        ->id();
      $position = 'after';
    }
    else {

      // If parent comment is not available insert messages to form.
      $selectors = $this->tempStore
        ->getSelectors($request);
      $selector = $selectors['form_html_id'] ?? '';
      $position = 'before';
    }
    $response = $this
      ->addMessages($request, $response, $selector, $position);
  }

  // Clear out the tempStore variables.
  if ($this->clearTempStore) {
    $this->tempStore
      ->deleteAll();
  }

  // Remove the libraries from the response, otherwise when
  // core/misc/drupal.js is reinserted into the DOM, the following line of
  // code will execute, causing Drupal.attachBehaviors() to run on the entire
  // document, and reattach behaviors to DOM elements that already have them:
  // @code
  // // Attach all behaviors.
  // domready(function(){Drupal.attachBehaviors(document,drupalSettings);});
  // @endcode
  $attachments = $response
    ->getAttachments();

  // Need to have only 'core/drupalSettings' in the asset library list.
  // If neither 'core/drupalSettings', nor a library with a dependency on it,
  // is in the list of libraries, drupalSettings will be stripped out of the
  // ajax response by \Drupal\Core\Asset\AssetResolver::getJsAssets().
  $attachments['library'] = [
    'core/drupalSettings',
  ];

  // We need to keep the drupalSettings in the response, otherwise the
  // #ajax properties in the form definition won't be properly attached to
  // the rebuilt comment field returned in the ajax response, and subsequent
  // ajax interactions will be broken.
  $response
    ->setAttachments($attachments);
  return $response;
}