Làm cách nào để hạn chế mỗi người dùng chỉ thực hiện 1 bình luận cho mỗi nút?


7

Có ai biết nếu có bất kỳ cách nào tôi có thể hạn chế mỗi người dùng trang web chỉ đưa ra một nhận xét cho mỗi nút trên trang web Drupal 7 của tôi không? Tôi chưa tìm thấy gì cả.

Tôi vừa thử một thiết lập phức tạp với cờ và quy tắc, kích hoạt và hành động và chuyển hướng. Điều này đã không làm việc quá tốt.

Câu trả lời:


8

Thực hiện hook_form_alter()trong một mô-đun. Nếu biểu mẫu là biểu mẫu nhận xét nút, hãy kiểm tra xem người dùng hiện đang đăng nhập đã nhận xét về nút này trước đó chưa. (Bạn có thể phải viết một chức năng tùy chỉnh cho việc này.) Nếu người dùng đã nhận xét về nút, hãy tắt nút gửi và textarea.


Điều này sẽ vẫn hoạt động nếu hình thức bình luận trên cùng một trang với nút? Ngoài ra, làm thế nào để tôi biết nếu người dùng $ toàn cầu hiện tại đã nhận xét về nó trước đây? Đó là những gì tôi đã không rõ ràng.
BenjaminRH

Tùy thuộc vào mã bạn viết, bạn có thể làm cho nó hoạt động ở bất cứ đâu. Tôi nghĩ rằng nút trong câu hỏi đi kèm với đối tượng $ form hoặc có thể được lấy từ các tham số url. Nhận nút, tải tất cả các nhận xét của nó, phân tích từng tác giả và nếu tác giả uid khớp với người dùng $ thì hãy tắt hoặc ẩn biểu mẫu nhận xét
LSU_JBob

1
Chỉ cần thử một bài kiểm tra trên một hình thức bình luận thực tế. Nó hoạt động rất tốt, vì vậy tôi sẽ có thể làm cho nó hoạt động cho những gì tôi muốn. Cảm ơn!
BenjaminRH

1

Được gắn thẻ Drupal 7, nhưng tôi sẽ thận trọng với gió và đưa ra câu trả lời cho Drupal 8 khắc

Phương pháp của tôi: ẩn hoàn toàn biểu mẫu bằng cách đặt $form['access'] = false;

Đây là một số mã cho mymodule.module xác định nút cha, sau đó thực hiện truy vấn cơ sở dữ liệu về các nhận xét được đính kèm với nó, được lọc bởi người dùng. (Điều này được lấy từ một dự án nơi tôi sẽ tạo loại nhận xét "xếp hạng" bên cạnh các nhận xét tiêu chuẩn).

/*
 * 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;
  }

}

0

5 năm sau ... Nếu bạn không muốn viết mã tùy chỉnh hoặc sử dụng mô-đun giới hạn Nhận xét (chỉ có phiên bản dành cho D7), thì bạn có thể sử dụng mô-đun Quy tắcCờ cho việc này, như được mô tả bên dưới.

Bước 1: gắn cờ các nút với ý kiến

Sử dụng mô-đun Cờ để tạo cờ (không toàn cầu) với nhãn của một cái gì đó như "Nhận xét đã gửi" (và tên máy comment_submitted).

Bước 2: đăng ký nhận xét

Sử dụng Quy tắc để tạo quy tắc tùy chỉnh với Sự kiện quy tắc " Sau khi lưu nhận xét mới. ".

Quy tắc này sẽ thực hiện Quy tắc "Nút cờ" (sử dụng cờ được tạo ở bước 1).

Bước 3: hủy đăng bình luận bổ sung

Sử dụng Quy tắc để tạo quy tắc tùy chỉnh để hủy xuất bản nhận xét bổ sung từ người dùng cho các nút mà người dùng đã nhận xét trước đó (= các nút được đánh dấu bởi tác giả nhận xét). Dưới đây là quy tắc bạn có thể sử dụng cho điều đó (ở định dạng xuất quy tắc, cập nhật tên máy của cờ bạn sử dụng và sau đó nhập nó vào trang web của riêng bạn):

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

Lưu ý : quy tắc này thực hiện như trong tiêu đề của Bước 3 (= không công bố nhận xét bổ sung ). Vì vậy, nó không ẩn hình thức bình luận (cũng không được hỏi rõ ràng trong câu hỏi). Thêm một "thông điệp thiết lập" như một hành động quy tắc bổ sung có thể giúp làm rõ điều đó. Vì vậy, theo nhận xét từ OPer bên dưới câu hỏi, câu trả lời này sẽ minh họa rằng có "cách" để đạt được kết quả tương tự bằng cách sử dụng Quy tắc (mà tôi muốn sử dụng thay vì thêm mô-đun khác chỉ có phiên bản dev).


1
create a (global) flagBạn không muốn sử dụng Cờ toàn cầu ở đây, vì bạn muốn mỗi người dùng có cờ riêng của mình.
Không có Sssweat

Tôi vẫn tìm thấy câu trả lời này một chút iffy. Chính xác thì quy tắc này làm gì? Vì vậy, nó đánh dấu một nút mà người dùng bình luận lần đầu tiên, nhưng nó có ngăn người dùng bình luận lại không? Dường như với tôi rằng nó chỉ không công bố bất kỳ nỗ lực bình luận nào nữa, nhưng nó không ẩn hộp bình luận ... điều này có đúng không?
Không có Sssweat

Đủ công bằng, tôi đoán điều này tốt như một giải pháp mã hóa bằng không.
Không có Sssweat

@NoSssweat: có vẻ như là một bản tóm tắt tốt, mặc dù mã "tùy chỉnh" bằng không (và chỉ có cấu hình mã và quản trị viên đóng góp) có lẽ là một bản tóm tắt chính xác hơn nữa. Ngoài ra, nếu một trang web đang sử dụng Quy tắc (không thể tưởng tượng bất kỳ trang web nào như vậy, nhưng đó là một chủ đề khác ...) vì những lý do khác, điều đó sẽ hạ thấp rào cản đối với phương pháp này Tương tự cho mô-đun Flag. PS: đã đến lúc dọn dẹp một số bình luận (cfr "xin vui lòng tránh ..." ... Tôi không thích trò chuyện ở đây).
Pierre.Vriens
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.