You are here

public function CommentForm::save in Comment Permissions 8

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 CommentForm::save

File

src/CommentForm.php, line 259

Class

CommentForm
Override comment entity default from.

Namespace

Drupal\comment_perm

Code

public function save(array $form, FormStateInterface $form_state) {
  $comment = $this->entity;
  $comment_type = $comment
    ->bundle();
  $entity = $comment
    ->getCommentedEntity();
  $field_name = $comment
    ->getFieldName();
  $uri = $entity
    ->toUrl();
  $logger = $this
    ->logger('comment');
  if ($this
    ->accessPostComment($this->currentUser, $comment_type) && ($this
    ->accessAdministerComment($this->currentUser, $comment_type) || $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
        ->noAccessAdministerComment($this->currentUser, $comment_type)) {
        $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);
}