web-dev-qa-db-ja.com

リンクを含むコメントを非公開にするルールを作成するにはどうすればよいですか?

次のことを行うルールを作成しようとしています。

  • Event:新しいコンテンツタイプフォーラムトピックを保存した後

  • 条件

    • ユーザーに「認証済み」の役割があり、かつ
    • コンテンツの本文にはリンクが含まれています(これは私が理解できない部分です
  • アクション

    • コンテンツの非公開

    • サイトにメッセージを表示:

      「現在、ユーザー権限により、リンクを含むフォーラムトピックを投稿できません。投稿からすべてのリンクを削除し、次の編集リンクをクリックして再送信してください:[node:edit-url]

      この予防措置により、フォーラムやコメントをスパムから守ることができます。リンクを投稿する機能が必要な場合は、サイト管理者に電子メールを送信してください:[site:mail] "

一般的な考え方は、ユーザーがフォーラムに登録して新しいフォーラムトピックを作成できるようにしたいが、これはスパムの背後にある目的全体であるため、リンクを投稿できないようにすることです。質の高い投稿をいくつか作成したら、このルールが適用されない信頼できるユーザーグループに移動し、リンクを投稿できるようにします。

テキスト形式を使用してタグを削除したくないのは、リンクを除いて、スパム投稿が引き続き公開されるためです。これにより、不快なスパム投稿がフォーラムインデックスに引き続き表示されます。

2
JTB

コアに含まれるモジュールPHPフィルターを有効にします。これにより、Execute custom PHP codeという名前の新しい条件が追加されます。この条件は、TRUEまたはFALSEを返す必要があります。

次に、PHPスニペットを$ node-> bodyフィールドにPHPのpreg_matchを使用する条件で記述します。多くの場所で有効なURLを確認するための正規表現パターンを見つけることができます- ここでは例

0
argiepiano

あまりにも多くのルールが関与する前に、ハニーポットと隠されたキャプチャを見てください。

1
Niall Murphy

私は argiepiano の答えがうまく機能するという解決策を信頼していますが、「 PHPを使用することの欠点は何ですか?ブロック、ノード、views-argsなどのコードをフィルターしますか? "可能な限りPHPフィルターを使用しないようにしてください。

Rules エクスポート形式のルールのプロトタイプを次に示します。これも質問の答えになるはずです。

_{ "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 ..." } }
    ]
  }
}
_

上記のプロトタイプルールの詳細:

  • Rules Event=「Article」タイプの新しいコンテンツを保存した後(ニーズに合わせてタイプを適応させます)。
  • ルール条件
    • 現在のユーザーが認証済みユーザーかどうかを確認します。
    • 正規表現比較演算として使用して、テキスト比較を実行します(- PHPフィルターを使用せずに、ルールで完全に実行できます。実際の正規表現では、このルールはhttp(|s)://+を使用します。これにより、 _http://_または_https://_で、質問のように「contains a link」にかなり近いはずです。これのバリエーションを発見します(たとえば、ANotAllowedTextStringInBodyのような他の文字列)。別のルール条件([〜#〜]または[〜#〜]を使用)は、それも気にします。
  • ルールアクション=サイトにメッセージを表示し(必要に応じてメッセージを調整)、その他の関連ルールアクションを追加します。

Voilà、PHPフィルタは必要ありません。

0
Pierre.Vriens