Wie kann jeder Benutzer darauf beschränkt werden, nur 1 Kommentar pro Knoten abzugeben?

7

Weiß jemand, ob es eine Möglichkeit gibt, jeden Site-Benutzer darauf zu beschränken, nur einen Kommentar pro Knoten auf meiner Drupal 7-Site abzugeben? Ich habe noch nichts gefunden.

Ich habe gerade ein kompliziertes Setup mit Flags und Regeln sowie Triggern und Aktionen und Weiterleitungen versucht. Das hat nicht so gut funktioniert.

BenjaminRH
quelle

Antworten:

8

hook_form_alter()In einem Modul implementieren . Wenn es sich bei dem Formular um das Knotenkommentarformular handelt, überprüfen Sie, ob der aktuell angemeldete Benutzer diesen Knoten zuvor kommentiert hat. (Möglicherweise müssen Sie hierfür eine benutzerdefinierte Funktion schreiben.) Wenn der Benutzer den Knoten kommentiert hat, deaktivieren Sie die Schaltfläche "Senden" und den Textbereich.

LSU_JBob
quelle
Würde dies immer noch funktionieren, wenn sich das Kommentarformular auf derselben Seite wie der Knoten befindet? Wie kann ich auch sehen, ob der aktuelle globale $ -Benutzer dies zuvor kommentiert hat? Das war mir nicht klar.
BenjaminRH
Abhängig von dem Code, den Sie schreiben, können Sie ihn überall zum Laufen bringen. Ich denke, der betreffende Knoten kommt mit dem $ form-Objekt oder kann aus den URL-Parametern abgerufen werden. Holen Sie sich den Knoten, laden Sie alle Kommentare, analysieren Sie jeden Autor und wenn die Autoren-UID mit $ user übereinstimmt, deaktivieren oder verbergen Sie das Kommentarformular
LSU_JBob
1
Habe gerade einen Test auf einem tatsächlichen Kommentarformular versucht. Es funktioniert großartig, also sollte ich es so machen können, wie ich es will. Vielen Dank!
BenjaminRH
1

Tagged Drupal 7, aber ich werde Vorsicht walten lassen und eine Antwort für Drupal 8 liefern ...

Meine Methode: Verstecke das Formular vollständig durch Einstellen $form['access'] = false;

Hier ist ein Code für mymodule.module , der den übergeordneten Knoten identifiziert und dann eine Datenbankabfrage zu den daran angehängten Kommentaren durchführt, gefiltert nach Benutzer. (Dies stammt aus einem Projekt, in dem ich zusätzlich zu Standardkommentaren einen Kommentartyp "Bewertungen" erstellen würde.)

/*
 * Implements HOOK_form_alter
 */
function mymodule_form_alter(&$form, \Drupal\Core\Form\FormStateInterface $form_state, $form_id) {

  switch ($form_id) {
    // change this to the correct form name for your site
    case 'comment_ratings_form':
      $current_user = \Drupal::currentUser();

      // Find which node this comment form is attached to
      $comment_entity = $form_state->getFormObject()->getEntity();
      $review_nid     = $comment_entity->get('entity_id')->target_id;

      // Remember: the comments field in a node doesn't contain the actual
      // comments, just settings and stats.  We need to do an entity query
      // and find all the comments pointing to the node.

      // Has user already commented?
      $rating_ids = \Drupal::entityTypeManager()
                           ->getStorage('comment')
                           ->getQuery('AND')
                            // attached to the current node
                           ->condition('entity_id', $review_nid)
                           // authored by current user
                           ->condition('uid', $current_user->id())

                           // if you have multiple comment types, you could
                           // filter by those too
                           //->condition('comment_type', 'ratings')

                           ->execute();

      if (!empty($rating_ids)) {
        // already commented, hide the form
        $form['#access'] = FALSE;
      }
      break;
  }

}
William Turrell
quelle
0

5 Jahre später ... Wenn Sie keinen benutzerdefinierten Code schreiben oder das Comment Limit- Modul (das nur eine Dev-Version für D7 enthält) verwenden möchten, können Sie hierfür das Rules and Flag- Modul verwenden, wie unten beschrieben.

Schritt 1: Markieren Sie Knoten mit Kommentaren

Verwenden Sie das Flag- Modul, um ein (nicht globales) Flag mit einer Bezeichnung wie "Kommentar gesendet" (und Computername comment_submitted) zu erstellen .

Schritt 2: Kommentarübermittlung registrieren

Verwenden Sie Regeln , um eine benutzerdefinierte Regel mit dem Regelereignis " Nach dem Speichern eines neuen Kommentars " zu erstellen .

Diese Regel sollte eine Regelaktion "Flag-Knoten" ausführen (unter Verwendung des in Schritt 1 erstellten Flags).

Schritt 3: Veröffentlichung weiterer Kommentare aufheben

Verwenden Sie Regeln , um eine benutzerdefinierte Regel zu erstellen, mit der die Veröffentlichung zusätzlicher Kommentare von Benutzern für Knoten aufgehoben wird, zu denen ein Benutzer zuvor Kommentare abgegeben hat (= Knoten, die vom Kommentarautor markiert wurden). Hier ist die Regel, die Sie dafür verwenden können (aktualisieren Sie im Exportformat Regeln den Computernamen des von Ihnen verwendeten Flags und importieren Sie ihn dann in Ihre eigene Site):

{ "rules_unpublish_additional_comments" : {
    "LABEL" : "Unpublish additional comments",
    "PLUGIN" : "reaction rule",
    "ACTIVE" : false,
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "flag", "comment" ],
    "ON" : { "comment_insert" : [] },
    "IF" : [
      { "flag_flagged_node" : {
          "flag" : "comment_submittedr",
          "node" : [ "comment:node" ],
          "flagging_user" : [ "comment:author" ]
        }
      }
    ],
    "DO" : [ { "data_set" : { "data" : [ "comment:status" ], "value" : "0" } } ]
  }
}

Hinweis : Diese Regel entspricht dem Titel von Schritt 3 (= Veröffentlichung zusätzlicher Kommentare aufheben ). Das Kommentarformular wird also nicht ausgeblendet (was auch in der Frage nicht explizit gestellt wird). Das Hinzufügen einer "gesetzten Nachricht" als zusätzliche Regelaktion könnte helfen, dies zu verdeutlichen. Gemäß dem Kommentar von OPer unter der Frage sollte diese Antwort veranschaulichen, dass es "einen" Weg gibt, ein ähnliches Ergebnis mit Regeln zu erzielen (die ich lieber verwenden würde, anstatt ein anderes Modul hinzuzufügen, das nur eine Entwicklungsversion hat).

Pierre.Vriens
quelle
1
create a (global) flagSie möchten hier kein globales Flag verwenden , da jeder Benutzer sein eigenes Flag haben soll.
Kein Sssweat
Ich finde diese Antwort immer noch etwas zweifelhaft. Was genau macht diese Regel? Es markiert also einen Knoten, den der Benutzer zum ersten Mal kommentiert, aber hindert es den Benutzer daran, erneut zu kommentieren? Mir scheint, es werden nur keine weiteren Versuche zum Kommentieren veröffentlicht, aber das Kommentarfeld wird nicht ausgeblendet ... ist das richtig?
Kein Sssweat
Fair genug, ich denke, das ist so gut wie eine Null-Codierungslösung.
Kein Sssweat
@NoSssweat: Das scheint eine gute Zusammenfassung zu sein, obwohl null "benutzerdefinierter" Code (und nur beigesteuerte Code- und Administratorkonfigurationen) wahrscheinlich eine noch genauere Zusammenfassung ist. Wenn eine Site aus anderen Gründen bereits Regeln verwendet (ich kann mir keine solche Site vorstellen, aber das ist ein anderes Thema ...), würde dies die Barriere für diesen Ansatz verringern. Ähnlich für das Flag-Modul. PS: Zeit, einige Kommentare zu bereinigen (siehe "Bitte vermeiden ..." ... Ich mag es nicht, hier herum zu chatten).
Pierre.Vriens