Skip to content

Форма комментария к статье

Компонент, с помощью которого вы можете реализовать форму комментария к статье с отправкой через AJAX-запрос и проверкой полей. Комментарии к статье можно увидеть в админ-панели в разделе "Сайт" > "Блог и статьи".

Назначение атрибутов

data-comments-form-wrapper

Обязательный атрибут для обёртки формы комментария к статье

<form
  class="comment-form"
  method="post"
  data-comments-form-wrapper='{
    "reviews_moderated": {{ account.reviews_moderated? }},
    "url": "{{ article.url }}"
  }'
  action="/blogs/blog/333/comments#comment_form"
>
  <!-- Код формы -->
</form>

data-comments-form-success

Атрибут для элемента, который содержит сообщение об успешной отправке формы. В качестве значения нужно указать, сколько секунд должен отображаться элемент, сообщение, также вы можете указать нужно ли перезагружать страницу после отправки. В случае успешной отправки (получает класс is-show, который удаляется через указанный промежуток времени).

Info

По умолчанию элемент не скрыт

<div
  data-comments-form-success='{
    "showTime": 10000,
    "message": "{{ success_message }}",
    "reloadPage": false
  }'
  class="notice-success"
></div>

data-comments-form-field-area

Атрибут для блока каждого отдельного поля. Нужен для валидации поля и вывода ошибок в элементе с атрибутом data-comments-form-field-error.

<div
  data-comments-form-field-area
  class="form-row form-author is-required {% if review.errors contains 'author' %}is-error{% endif %}"
>
  <label class="form-label">{{ widget_messages.field_name }} <span class="text-error">*</span></label>
  <input
    name="comment[author]"
    placeholder="{{ widget_messages.field_name }}"
    value="{{ review.author }}"
    type="text"
    class="form-control form-control_size-m"
    data-comments-form-field='{"isRequired": true, "errorMessage": "ошибка"}'
  />
  <div
    data-comments-form-field-error
    class="feedback__field-error"
  ></div>
</div>

data-comments-form-field

Атрибут поля ввода.

Виды полей определяются по значению атрибута name. Всего есть несколько видов:

  • comment[author] (имя)
  • comment[email] (e-mail)
  • comment[content] (сообщение)

Для всех полей можно передать текст, который будет выводиться в случае ошибки в элементе с атрибутом data-comments-form-field-error, а также указать обязательность заполнения поля. Все поля являются обязательными.

<input
  name="comment[author]"
  placeholder="{{ widget_messages.field_name }}"
  value="{{ review.author }}"
  type="text"
  class="form-control form-control_size-m"
  data-comments-form-field='{"isRequired": true, "errorMessage": "ошибка"}'
/>
<div data-comments-form-field-error class="feedback__field-error"></div>

data-comments-form-recaptcha

Элемент для вывода кнопки "Я не робот"

{% if comment.captcha_enabled? %}
<div
  data-comments-form-field-area
  class="form-row form-captcha {% if comment.errors contains 'captcha_solution' %}is-error{% endif %}"
>
  <div
    data-comments-form-recaptcha='{
      "isRequired": true,
      "errorMessage": "{{ messages.recaptcha_error | escape }}"
    }'
    id="captcha_challenge"
    class="captcha-recaptcha"
  ></div>
  <div data-comments-form-field-error class="form__field-error"></div>
</div>
{% endif %}

ReCaptcha v3

При использовании ReCaptcha v3 посетителю сайта больше не нужно нажимать на чекбокс "Я не робот". Проверка происходит автоматически при отправке формы.

data-recaptcha-type

Для использования новой версии в блок с атрибутом data-comments-form-recaptcha необходимо добавить атрибут data-recaptcha-type="invisible".

data-badge

В этом атрибуте можно задать где и как должен выводиться блок ReCaptcha. По умолчанию блок выводится в левом нижнем углу экрана (bottomleft).

Возможные значения: - inline - блок выводится как в старой версии, но без чекбокса - bottomleft - фиксированный блок в левом нижнем углу экрана - bottomright - фиксированный блок в правом нижнем углу экрана

Пример:

{% if comment.captcha_enabled? %}
<div
  data-comments-form-field-area
  class="form-row form-captcha {% if comment.errors contains 'captcha_solution' %}is-error{% endif %}"
>
  <div
    data-recaptcha-type="invisible"
    data-badge="bottomleft"
    data-comments-form-recaptcha='{
      "isRequired": true,
      "errorMessage": "{{ messages.recaptcha_error | escape }}"
    }'
    id="captcha_challenge"
    class="captcha-recaptcha"
  ></div>
  <div data-comments-form-field-error class="form__field-error"></div>
</div>
{% endif %}

data-show-comments-modal

Атрибут для кнопки вызова модального окна. При нажатии происходит публикация события EventBus show-modal-comments:insales:ui_comments.

В качестве значения можно передать ID модального окна. Это может быть удобно, если у вас несколько форм в модальных окнах.

<button data-show-comments-modal='{"modal_id": "123456"}'>Форма комментария к статье</button>
EventBus.subscribe('show-modal-comments:insales:ui_comments', (data) => {
  console.log(data)
});

События

Событие Описание
send-comment:insales:ui_comments Срабатывает при успешной отправке формы
error-comments:insales:ui_comments Срабатывает в случае ошибки при отправке формы
show-modal-comments:insales:ui_comments Срабатывает при нажатии на кнопку с атрибутом data-show-comments-modal

Пример подписки на событие

EventBus.subscribe('send-comment:insales:ui_comments', function (data) {
  console.log('Форма успешно отправлена', data);
});

Пример разметки

{% if blog.comments_enabled? %}
<form
  class="comment-form"
  method="post"
  data-comments-form-wrapper='{
    "reviews_moderated": {{ account.reviews_moderated? }},
    "url": "{{ article.url }}"
  }'
  action="{{ aritcle.url }}/comments#comment_form"
>
  <div
    data-comments-form-success='{
      "showTime": 10000,
      "message": "Добавлен"
    }'
    class="h4 feedback__success-message"
  ></div>

  <div class="reviews-wrapper {% unless comment.errors.size > 0 %}hidden{% endunless%}">
    <div class="review-form-header">
      <div class="review-form-title">{{ widget_messages.review_write_new_title }}</div>
      <span class="button-link hide-form-btn js-hide-form">{{ widget_messages.review_write_new_cancel }}</span>
    </div>
    <div class="reviews-form">
      <div id="comment_form" class="js-review-wrapper">
        <div
          data-comments-form-field-area
          class="form-row form-author is-required {% if review.errors contains 'author' %}is-error{% endif %}"
        >
          <label class="form-label">{{ widget_messages.field_name }} <span class="text-error">*</span></label>
          <input
            name="comment[author]"
            placeholder="{{ widget_messages.field_name }}"
            value="{{ review.author }}"
            type="text"
            class="form-control form-control_size-m"
            data-comments-form-field='{"isRequired": true, "errorMessage": "ошибка"}'
          />
          <div data-comments-form-field-error class="feedback__field-error"></div>
        </div>
        <div
          data-comments-form-field-area
          class="form-row form-email is-required {% if review.errors contains 'email' %}is-error{% endif %}"
        >
          <label class="form-label">{{ widget_messages.field_email }} <span class="text-error">*</span></label>
          <input
            name="comment[email]"
            placeholder="{{ widget_messages.field_email }}"
            value="{{ review.email }}"
            type="text"
            class="form-control form-control_size-m"
            data-comments-form-field='{
              "isRequired": true,
              "errorMessage": "ошибка"
            }'
          />
          <div data-comments-form-field-error class="feedback__field-error"></div>
        </div>
        <div
          data-comments-form-field-area
          class="form-row form-comment is-required {% if review.errors contains 'content' %}is-error{% endif %}"
        >
          <label class="form-label">{{ widget_messages.field_message }} <span class="text-error">*</span></label>
          <textarea
            name="comment[content]"
            placeholder="{{ widget_messages.field_message }}"
            class="form-control form-control_size-m is-textarea"
            data-comments-form-field='{
              "isRequired": true,
              "errorMessage": "ошибка"
            }'
          >{{ comment.content }}</textarea>
          <div data-comments-form-field-error class="feedback__field-error"></div>
        </div>
        {% if comment.captcha_enabled? %}
        <div
          data-comments-form-field-area
          class="form-row form-captcha {% if comment.errors contains 'captcha_solution' %}is-error{% endif %}"
        >
          <div
            data-recaptcha-type="invisible"
            data-comments-form-recaptcha='{
              "isRequired": true,
              "errorMessage": "{{ messages.recaptcha_error | escape }}"
            }'
            id="captcha_challenge"
            class="captcha-recaptcha"
          ></div>
          <div data-comments-form-field-error class="form__field-error"></div>
        </div>
        {% endif %}
        <div class="form-controls">
          <button type="submit" class="button button_size-m">{{ widget_messages.button_submit }}</button>
        </div>
      </div>
      {% if blog.moderated? %}
      <div class="moderation">
        <p>{{ widget_messages.reviews_are_moderated }}</p>
      </div>
      {% endif %}
    </div>
  </div>
</form>
{% endif %}