class AjaxCommentsController in Open Social 10.3.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
- 8.8 modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController
- 10.0.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController
- 10.1.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController
- 10.2.x modules/custom/social_ajax_comments/src/Controller/AjaxCommentsController.php \Drupal\social_ajax_comments\Controller\AjaxCommentsController
Controller routines for AJAX comments routes.
Hierarchy
- class \Drupal\social_ajax_comments\Controller\AjaxCommentsController extends \Drupal\ajax_comments\Controller\AjaxCommentsController
Expanded class hierarchy of AjaxCommentsController
1 file declares its use of AjaxCommentsController
- SocialPostAlbumAjaxCommentsController.php in modules/
social_features/ social_post/ modules/ social_post_album/ src/ Controller/ SocialPostAlbumAjaxCommentsController.php
File
- modules/
custom/ social_ajax_comments/ src/ Controller/ AjaxCommentsController.php, line 15
Namespace
Drupal\social_ajax_comments\ControllerView source
class AjaxCommentsController extends ContribController {
/**
* The number of errors.
*
* @var int|null
*/
protected $errors = NULL;
/**
* TRUE if temporary storage should be cleared.
*
* @var bool
*/
protected $clearTempStore = TRUE;
/**
* The parent comment's comment ID.
*
* @var int|null
*/
protected $pid;
/**
* Cancel handler for the cancel form.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The current request object.
* @param int $cid
* The id of the comment being edited, or 0 if this is a new comment.
*
* @return \Drupal\Core\Ajax\AjaxResponse
* The Ajax response.
*/
public function socialCancel(Request $request, $cid) {
// This is based on AjaxCommentsController::cancel.
// the only change is we have some more wrappers we need to remove,
// we can't tell this to ajax_comments because we render it in our template
// so instead we will just remove whatever we need.
$response = new AjaxResponse();
// Get the selectors.
$selectors = $this->tempStore
->getSelectors($request, TRUE);
$wrapper_html_id = $selectors['wrapper_html_id'];
$form_html_id = $selectors['form_html_id'];
if ($cid != 0) {
$prefixes = [
// Show the hidden anchor.
'a#comment-',
// Show the hidden comment.
static::getCommentSelectorPrefix(),
];
foreach ($prefixes as $prefix) {
$command = new InvokeCommand($prefix . $cid, 'show', [
200,
'linear',
]);
$response
->addCommand($command);
}
}
// Replace the # from the form_html_id selector and add .social_ so we know
// that we are sure we are just removing our specific form class.
$social_form_id = str_replace('#', '.social_reply_form_wrapper_', $form_html_id);
// Remove the form, based on $variables['comment_wrapper'] in form.inc.
$response
->addCommand(new RemoveCommand($social_form_id));
// Remove any messages, if applicable.
$response
->addCommand(new RemoveCommand($wrapper_html_id . ' .js-ajax-comments-messages'));
// Clear out the tempStore variables.
$this->tempStore
->deleteAll();
return $response;
}
/**
* 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.
*
* @param \Symfony\Component\HttpFoundation\Request $request
* The current request object.
* @param \Drupal\Core\Entity\EntityInterface $entity
* The entity this comment belongs to.
* @param string $field_name
* The field_name to which the comment belongs.
* @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.
*
* @return \Drupal\Core\Ajax\AjaxResponse
* The Ajax response.
*
* @see \Drupal\comment\Controller\CommentController::getReplyForm()
*/
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;
}
/**
* {@inheritdoc}
*/
protected function renderCommentField(EntityInterface $entity, $field_name) {
$comment_display = parent::renderCommentField($entity, $field_name);
$parameters =& $comment_display[0]['comments']['pager']['#route_parameters'];
$parameters['entity_type'] = $entity
->getEntityTypeId();
$parameters['entity'] = $entity
->id();
$parameters['field_name'] = $field_name;
$parameters['pid'] = $this->pid;
return $comment_display;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
AjaxCommentsController:: |
protected | property | TRUE if temporary storage should be cleared. | |
AjaxCommentsController:: |
protected | property | The number of errors. | |
AjaxCommentsController:: |
protected | property | The parent comment's comment ID. | |
AjaxCommentsController:: |
protected | function | ||
AjaxCommentsController:: |
public | function | Builds ajax response for adding a new comment without a parent comment. | 1 |
AjaxCommentsController:: |
public | function | Cancel handler for the cancel form. |