Как создать правило, которое отменяет публикацию комментариев, содержащих ссылки?


Я пытаюсь создать правило, которое делает следующее.

  • Событие: После сохранения темы форума нового типа контента

  • Условия:

    • У пользователя есть роль "аутентифицированный", и
    • Тело содержимого содержит ссылку ( это та часть, которую я не могу понять)
  • Действия:

    • Неопубликованный Контент

    • Показать сообщение на сайте:

      "Ваши права пользователя в настоящее время не позволяют вам публиковать тему форума, содержащую ссылку. Пожалуйста, удалите все ссылки из вашего поста и повторно отправьте, нажав на следующую ссылку для редактирования: [узел: редактировать-URL]

      Эта мера предосторожности помогает нам не допускать спама на нашем форуме и в комментариях. Если вы хотите иметь возможность размещать ссылки, пожалуйста, напишите администратору сайта по электронной почте: [сайт:почта]"

Общая идея заключается в том, что я хочу, чтобы пользователи регистрировались на форуме и могли создавайте новые темы форума, но не разрешайте размещать ссылки, так как в этом вся цель спама. Как только они сделают несколько качественных постов, я переведу их в группу надежных пользователей, к которой это правило не применяется, что позволит им размещать ссылки.

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

Author: Pierre.Vriens, 2015-11-14

3 answers

Включите модуль PHP-фильтр , который входит в ядро. Это добавляет новое условие с именем Execute custom PHP code, которое должно возвращать значение TRUE или FALSE.

Затем напишите фрагмент PHP в этом условии, который использует PHP preg_match в поле $node->body. Вы можете найти шаблоны регулярных выражений для проверки правильности URL-адресов во многих местах, например, здесь.

 0
Author: argiepiano, 2017-05-23 12:41:25

Посмотрите на горшочек с медом и скрытую капчту, прежде чем вводить слишком много правил.

 1
Author: Niall Murphy, 2015-11-14 20:21:13

Я верю, что решение в ответе argiepiano работает, но по всевозможным причинам, упомянутым в ответе на " Каковы недостатки использования кода фильтра PHP в блоках, узлах, представлениях-аргументах и т. Д.?" вы должны стараться избегать использования фильтра PHP, когда это возможно.

Вот прототип правила в формате экспорта Правила, которое также должно ответить на ваш вопрос:

{ "rules_find_links_in_body" : {
    "LABEL" : "Find links in body",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_insert--article" : { "bundle" : "article" } },
    "IF" : [
      { "user_has_role" : {
          "account" : [ "site:current-user" ],
          "roles" : { "value" : { "2" : "2" } }
        }
      },
      { "OR" : [
          { "text_matches" : {
              "text" : [ "node:body:value" ],
              "match" : "http(|s):\/\/+",
              "operation" : "regex"
            }
          },
          { "text_matches" : {
              "text" : [ "node:body:value" ],
              "match" : "ANotAllowedTextStringInBody",
              "operation" : "regex"
            }
          }
        ]
      }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "Node body contains an URL ..." } }
    ]
  }
}

Некоторые дополнительные сведения о вышеупомянутом прототипе правило:

  • Событие правил = После сохранения нового содержимого типа "Статья" (адаптируйте тип в соответствии с вашими потребностями).
  • Правила и условия:
    • Проверьте, является ли текущий пользователь аутентифицированным пользователем.
    • Выполните сравнение текста, используя регулярное выражение в качестве операции сравнения (что вы прекрасно можете сделать в правилах, не используя для этого фильтр PHP. Для фактического регулярного выражения это правило использует http(|s)://+, которое обнаружит строки, которые начинаются либо с http://, либо с https://, и которые должны быть довольно близки к " содержит ссылку", как в вашем вопросе. Если у вас есть дополнительные/аналогичные требования для обнаружения вариантов этого (скажем, какая-то другая строка, например ANotAllowedTextStringInBody), другое условие правил (с ИЛИ ) также позаботится об этом.
  • Действие правил = Показать сообщение на сайте (адаптировать сообщение в соответствии с вашими потребностями) и добавить другие соответствующие правила Действия.

Вуаля, фильтр PHP не требуется.

 0
Author: Pierre.Vriens, 2017-04-13 12:47:02