public function AjaxCommentsController::socialAdd in Open Social 10.0.x
Same name and namespace in other branches
- 8.9 modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
- 8.8 modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
- 10.3.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
- 10.1.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController::socialAdd()
- 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\ControllerCode
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;
}