You are here

public function CommentForm::save in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/comment/src/CommentForm.php \Drupal\comment\CommentForm::save()

Form submission handler for the 'save' action.

Normally this method should be overridden to provide specific messages to the user and redirect the form after the entity has been saved.

Parameters

array $form: An associative array containing the structure of the form.

\Drupal\Core\Form\FormStateInterface $form_state: The current state of the form.

Return value

int Either SAVED_NEW or SAVED_UPDATED, depending on the operation performed.

Overrides EntityForm::save

File

core/modules/comment/src/CommentForm.php, line 372

Class

CommentForm
Base handler for comment forms.

Namespace

Drupal\comment

Code

public function save(array $form, FormStateInterface $form_state) {
  $comment = $this->entity;
  $entity = $comment
    ->getCommentedEntity();
  $field_name = $comment
    ->getFieldName();
  $uri = $entity
    ->toUrl();
  $logger = $this
    ->logger('comment');
  if ($this->currentUser
    ->hasPermission('post comments') && ($this->currentUser
    ->hasPermission('administer comments') || $entity->{$field_name}->status == CommentItemInterface::OPEN)) {
    $comment
      ->save();
    $form_state
      ->setValue('cid', $comment
      ->id());

    // Add a log entry.
    $logger
      ->notice('Comment posted: %subject.', [
      '%subject' => $comment
        ->getSubject(),
      'link' => Link::fromTextAndUrl(t('View'), $comment
        ->toUrl()
        ->setOption('fragment', 'comment-' . $comment
        ->id()))
        ->toString(),
    ]);

    // Explain the approval queue if necessary.
    if (!$comment
      ->isPublished()) {
      if (!$this->currentUser
        ->hasPermission('administer comments')) {
        $this
          ->messenger()
          ->addStatus($this
          ->t('Your comment has been queued for review by site administrators and will be published after approval.'));
      }
    }
    else {
      $this
        ->messenger()
        ->addStatus($this
        ->t('Your comment has been posted.'));
    }
    $query = [];

    // Find the current display page for this comment.
    $field_definition = $this->entityFieldManager
      ->getFieldDefinitions($entity
      ->getEntityTypeId(), $entity
      ->bundle())[$field_name];
    $page = $this->entityTypeManager
      ->getStorage('comment')
      ->getDisplayOrdinal($comment, $field_definition
      ->getSetting('default_mode'), $field_definition
      ->getSetting('per_page'));
    if ($page > 0) {
      $query['page'] = $page;
    }

    // Redirect to the newly posted comment.
    $uri
      ->setOption('query', $query);
    $uri
      ->setOption('fragment', 'comment-' . $comment
      ->id());
  }
  else {
    $logger
      ->warning('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', [
      '%subject' => $comment
        ->getSubject(),
    ]);
    $this
      ->messenger()
      ->addError($this
      ->t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', [
      '%subject' => $comment
        ->getSubject(),
    ]));

    // Redirect the user to the entity they are commenting on.
  }
  $form_state
    ->setRedirectUrl($uri);
}