xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Запретить анонимам ставить флаг чаще одного раза в день с одного ip

Опубликовано в

В модуле Flag анонимный юзер может бесконечно флагать одну сущность просто удаляю куку с сессией, что неприемлемо например при реализации лайков. Чтобы это запретить нужно:

1. В админке добавить флагу текстовое поле field_ip.

2. Написать код:

/**
 * Implements hook_ENTITY_TYPE_presave(): flagging.
 */
function modulename_flagging_presave(FlaggingInterface $flagging) {
  // Save user ip
  if ($flagging->hasField('field_ip')) {
    $flagging->set('field_ip', \Drupal::request()->getClientIp());
  }
 
  // Disable anonym flagging on same ip
  if ($flagging->getFlagId() == 'my_flag' && \Drupal::currentUser()->isAnonymous()) {
    $flagging_count = \Drupal::entityQuery('flagging')
      ->condition('flag_id', $flagging->getFlagId())
      ->condition('field_ip', \Drupal::request()->getClientIp())
      ->condition('entity_id', $flagging->getFlaggableId())
      ->condition('uid', 0)
      ->condition('created', strtotime('-1 day'), '>')
      ->count()
      ->execute();
 
    if ($flagging_count > 0) {
      throw new \LogicException('With your ip today have already voted.');
    }
  }
}

3. Сбросить кэш.

Написанное актуально для Flag 8.x-4.x
Похожие записи

Комментарии RSS

Читаю заголовок и думаю: опять в России какой-то закон приняли против россиян, потом доходит - это же про Drupal :) Ты красавчег, столько нового опять разместил. Я буквально на твоих постах, изучил Друпал и сразу следом за тобой, перешел на Восьмерку, теперь и ее, с тобой изучаю

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании