Как создать правило, которое отменяет публикацию комментариев, содержащих ссылки?
Я пытаюсь создать правило, которое делает следующее.
Событие: После сохранения темы форума нового типа контента
-
Условия:
- У пользователя есть роль "аутентифицированный", и
- Тело содержимого содержит ссылку ( это та часть, которую я не могу понять)
-
Действия:
Неопубликованный Контент
-
Показать сообщение на сайте:
"Ваши права пользователя в настоящее время не позволяют вам публиковать тему форума, содержащую ссылку. Пожалуйста, удалите все ссылки из вашего поста и повторно отправьте, нажав на следующую ссылку для редактирования: [узел: редактировать-URL]
Эта мера предосторожности помогает нам не допускать спама на нашем форуме и в комментариях. Если вы хотите иметь возможность размещать ссылки, пожалуйста, напишите администратору сайта по электронной почте: [сайт:почта]"
Общая идея заключается в том, что я хочу, чтобы пользователи регистрировались на форуме и могли создавайте новые темы форума, но не разрешайте размещать ссылки, так как в этом вся цель спама. Как только они сделают несколько качественных постов, я переведу их в группу надежных пользователей, к которой это правило не применяется, что позволит им размещать ссылки.
Причина, по которой я не хочу использовать текстовые форматы для удаления тегов, заключается в том, что сообщение со спамом все равно будет опубликовано, за вычетом ссылок. Это приведет к тому, что оскорбительные, спам-сообщения все еще будут отображаться в индексе форума.
3 answers
Включите модуль PHP-фильтр , который входит в ядро. Это добавляет новое условие с именем Execute custom PHP code
, которое должно возвращать значение TRUE или FALSE.
Затем напишите фрагмент PHP в этом условии, который использует PHP preg_match
в поле $node->body. Вы можете найти шаблоны регулярных выражений для проверки правильности URL-адресов во многих местах, например, здесь.
Посмотрите на горшочек с медом и скрытую капчту, прежде чем вводить слишком много правил.
Я верю, что решение в ответе 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 не требуется.