Comment créer une règle qui annule la publication des commentaires contenant des liens ?

drupal.stackexchange https://drupal.stackexchange.com/questions/180894

  •  29-09-2020
  •  | 
  •  

Question

J'essaie de créer une règle qui fait ce qui suit.

  • Événement : Après avoir enregistré un nouveau type de contenu, le sujet du forum

  • Conditions : L'utilisateur a le rôle "authentifié" et Le corps du contenu contient un lien ( c'est la partie que je ne comprends pas ) Gestes : Annuler la publication du contenu Afficher un message sur le site :

    "Vos autorisations d'utilisateur ne vous permettent actuellement pas de publier un sujet de forum contenant un lien. Veuillez supprimer tous les liens de votre message et le soumettre à nouveau en cliquant sur le lien de modification suivant : [node:edit-url]

    Cette précaution nous aide à garder notre forum et nos commentaires sans spam.Si vous souhaitez pouvoir publier des liens, veuillez envoyer un e-mail à l'administrateur du site : [site:mail]"

L'idée générale est que je souhaite que les utilisateurs s'inscrivent sur le forum et puissent créer de nouveaux sujets de forum, mais ne soient pas autorisés à publier des liens, car c'est tout l'objectif du spam.Une fois qu'ils auront publié quelques publications de qualité, je les déplacerai vers un groupe d'utilisateurs de confiance auquel cette règle ne s'applique pas, ce qui leur permettra de publier des liens.

La raison pour laquelle je ne souhaite pas utiliser les formats de texte pour supprimer les balises est que le message de spam sera toujours publié, moins les liens.Cela conduira à des messages offensants et spammés qui apparaîtront toujours dans l'index du forum.

Était-ce utile?

La solution

Activez le module PHP Filter qui vient dans core.Cela ajoute une nouvelle condition nommée Execute custom PHP code, qui doit renvoyer TRUE ou FALSE.

Ensuite, écrivez un extrait PHP dans cette condition qui utilise le preg_match de PHP sur le champ $node->body.Vous pouvez trouver des modèles regex pour vérifier les URL valides dans de nombreux endroits, par exemple ici.

Autres conseils

Regardez le pot de miel et le capchta caché avant d'impliquer trop de règles.

Je fais confiance à la solution dans la réponse de argiepiano, mais pour toutes sortes de raisons mentionnées dans la réponse à "Quels sont les inconvénients de l'utilisation du code de filtre PHP dans les blocs, les nœuds, les arguments de vue, etc ?", vous devriez essayer d'éviter d'utiliser le filtre PHP autant que possible.

Voici un prototype de règle, au format d'export Règles, qui devrait également répondre à votre question :

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

Quelques détails supplémentaires sur la règle prototype ci-dessus :

  • Événement de règles = Après avoir enregistré un nouveau contenu de type "Article" (adaptez le type en fonction de vos besoins).
  • Conditions de règles : Vérifiez si l'utilisateur actuel est un utilisateur authentifié. Effectuez une comparaison de texte, en utilisant une expression régulière comme opération de comparaison (ce que vous pouvez parfaitement faire dans les règles, sans utiliser le filtre PHP pour cela. Pour l'expression régulière réelle, cette règle utilise http(|s)://+, qui découvrira les chaînes commençant par http://ou https://, et qui devrait être assez proche du " contient un lien " comme dans votre question.Si vous avez des exigences supplémentaires/similaires pour découvrir des variantes de ceci (disons une autre chaîne comme ANotAllowedTextStringInBody), une autre condition de règles (avec un OR )s'en occupera également.
  • Action de règles = Afficher un message sur le site (adapter le message à vos besoins) et ajouter d'autres actions de règles pertinentes.

Voilà , aucun filtre PHP n'est nécessaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à drupal.stackexchange
scroll top