Hiển thị nếu có ý kiến ​​'mới' về quan điểm của các điều khoản?


7

Tôi có ý kiến ​​về các nút được phân loại theo các điều khoản. Tôi cần thể hiện quan điểm về các điều khoản và nếu có bất kỳ nhận xét mới nào trong bất kỳ nút nào có thuật ngữ được gắn thẻ.

Vì vậy, nếu tôi có những điều sau đây:

Term1
-NodeA (has new comments)
-NodeB (has new comments) 
Term2
-NodeC (no new comments) 
-NodeD (no new comments) 
Term3
-NodeE (no new comments) 
-NodeF (has new comments)
Term4

Tôi cần quan điểm của tôi để trông như thế này:

Term1  new comments!
Term2
Term3  new comments!
Term4

Đầu tiên tôi đã thử đưa ra một quan điểm về các bình luận để bao gồm trường bình luận mới và sử dụng các mối quan hệ để hiển thị các điều khoản. Tuy nhiên, nếu một thuật ngữ không có nút hoặc nhận xét (Term4 trong ví dụ của tôi) tôi cần thuật ngữ này vẫn được hiển thị.

Vì vậy, sau đó tôi đã cố gắng thực hiện một quan điểm về các điều khoản. Tôi đã thêm các mối quan hệ 'Thuật ngữ phân loại: Nội dung có thuật ngữ' và trường 'Nội dung: Nhận xét mới' sử dụng mối quan hệ này. Điều này không cho thấy số lượng ý kiến ​​mới như mong đợi. Nó mang lại cho tôi kết quả trùng lặp (mà tôi có thể khắc phục bằng cách nhóm các trường) nhưng không ngờ nó cũng ẩn các thuật ngữ không có nhận xét hoặc nút.

Tôi đang đi về điều này đúng cách và nếu vậy làm thế nào tôi có thể ngăn chặn các điều khoản 'trống rỗng' bị ẩn?

CẬP NHẬT Ive đã cập nhật lõi D và một vài mô-đun có phiên bản mới (nhưng không có chế độ xem). Chế độ xem hoạt động tốt với mối quan hệ của 'Cấu hình mối quan hệ: Thuật ngữ phân loại: Nội dung có thuật ngữ' khi trường là 'Nội dung: Tiêu đề (Tiêu đề)'. Tuy nhiên, khi tôi thêm trường 'Nội dung: Nhận xét mới' thì các thuật ngữ không có nhận xét sẽ bị ẩn.

CẬP NHẬT Ive đã thử như sau trong một trường xem:

if(intval($data->node_new_comments) > 0) {
  if(!array_key_exists($data->tid, $static)) {
    print "new comments !";
    $static[$data->tid] = 1;
  }
} else {
  print "here you do whatever you want when there's no new comment";
}

CẬP NHẬT - bởi 'bình luận mới' Ý tôi là những bình luận mà người dùng đã đăng nhập chưa đọc. Đây là một lĩnh vực tiêu chuẩn trong quan điểm. Tôi cần điều này hơn là một ngày tùy tiện bị cắt. Xin lỗi vì sự nhầm lẫn.


Các điều khoản vẫn bị ẩn nếu mối quan hệ lượt xem được đặt thành không bắt buộc?
David Thomas

Đây là những điều gỡ lỗi mà tôi sẽ xem xét nếu là tôi, trả lời những điều này có thể giúp ai đó trả lời điều này: 1) Các thuật ngữ có xuất hiện lại khi xóa trường Nhận xét mới, mối quan hệ và / hoặc cả hai không? 2) Điều gì xảy ra khi bạn sử dụng Tên thuật ngữ làm trường nhóm, hoặc, thêm Id thuật ngữ và sử dụng nó làm trường nhóm? 3) 2) Trường tên thuật ngữ có chắc chắn Taxonomy term: Term name và không Content: -term vocabulary-(dễ mắc lỗi!) 4) Bạn có thấy điều tương tự nếu bạn tạo chế độ xem Điều khoản phân loại mới từ đầu chỉ với mối quan hệ Taxonomy Term: Term NameContent: New Commentskhông?
user56reinstatemonica8

bạn đang làm việc với phiên bản nào của drupal? với phiên bản nào của quan điểm? bạn đang làm việc với mối quan hệ vì một lý do cụ thể? thay vào đó, bạn đã thử tùy chọn "nhóm theo" chưa?
pasine

@notme im sử dụng drupal và mô-đun mới nhất. Khi tôi có quan điểm về các thuật ngữ, tôi cần sử dụng mối quan hệ để đến trường hiển thị nếu các nút có nhận xét mới.
Evans

1
@notme, nếu chế độ xem là danh sách các nút, thì một lần nữa - các thuật ngữ không có nút được đính kèm sẽ không khả dụng, do đó, vấn đề tương tự sẽ xảy ra. jdln, không phải là một giải pháp hoàn hảo, nhưng làm thế nào về việc thêm một tệp đính kèm mới vào chế độ xem của bạn chỉ hiển thị các thuật ngữ không có nút và đính kèm hiển thị dưới chế độ xem trang thông thường của bạn? Liệu điều đó có hiệu quả? Sau đó, các thuật ngữ không có nút sẽ luôn được in ra ở phía dưới, vì vậy việc sắp xếp sẽ không dễ dàng - nhưng có lẽ đó là một lựa chọn.
Boriana Ditcheva

Câu trả lời:


1

Điều này làm việc cho tôi. Tôi có chế độ xem thuật ngữ hiển thị trường tên thuật ngữ và mã của tôi thêm cờ nhận xét mới sau tên thuật ngữ.

Mã đi trong một mô-đun tùy chỉnh.

Bạn cần thay đổi thành VIEW_NAME thành tên xem của bạn và TAXONOMY_FIELD_NAME thành tên của trường của bạn (ví dụ như field_tags).

/**
 * Implements hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view) {
  global $user;
  if ($view->name == 'VIEW_NAME' && $user->uid) {
    // Get all the tids of the views results.
    $tids = array();
    foreach ($view->result as $result) {
      $tids[] = $result->tid;
    }

    // Get all the tids that have recent comments.
    // Only return terms that relate to nodes that have not been viewed by
    // the current user since the last comment.
    $query = db_query("SELECT t.TAXONOMY_FIELD_NAME_tid
                         FROM {node_comment_statistics} c
              LEFT OUTER JOIN {history} h ON c.nid = h.nid AND h.uid = :uid
                   INNER JOIN {field_data_TAXONOMY_FIELD_NAME} t ON t.entity_id = c.nid
                        WHERE c.comment_count > 0
                          AND t.TAXONOMY_FIELD_NAME_tid IN (:tids)
                          AND (h.timestamp IS NULL OR h.timestamp < c.last_comment_timestamp)",
               array(':uid' => $user->uid, ':tids' => $tids));
    $commented_terms = $query->fetchCol();

    // Loop through the results and add the new comments flag where necessary.
    foreach ($view->result as &$result) {
      if (in_array($result->tid, $commented_terms)) {
        $result->taxonomy_term_data_name .= ' new comments!';
      }
    }
  }
}

Bởi 'bình luận' mới, ý tôi là những bình luận mà người dùng đã đăng nhập chưa thấy. Đây là một lĩnh vực tiêu chuẩn trong quan điểm. Mã của bạn có sử dụng điều này không, hay nó là một giá trị ngày tùy ý? Từ nhận xét mã của bạn có vẻ như sau này?
Evanss

Ngoài nhận xét của @ jdln ở trên, historybảng chứa dữ liệu của các nút đọc bởi uid.
AyeshK

Nó đang sử dụng thời gian truy cập cuối cùng của người dùng, vì vậy nó sẽ hiển thị các bình luận được viết từ khi người dùng đăng nhập lần cuối. Đối với người dùng đã đăng xuất, nó đã sử dụng khoảng thời gian cố định là 2 tuần. Bây giờ tôi đã thay đổi nó để nó chỉ hoạt động cho người dùng đã đăng nhập và nó dựa trên lần cuối người dùng xem các nút mà các bình luận được bật.
rooby

0

Thêm trường 'Nội dung: Nhận xét mới' thêm INNER JOINvào bảng node_comment_statistic, có khả năng là nguồn gốc của các vấn đề bạn gặp phải. (Ví dụ: nếu không có mục nào cho NodeC, NodeD và NodeE trong node_comment_statistic vì một số lý do, các thuật ngữ sẽ không được hiển thị do JOINlà một INNER.)

Việc xây dựng lại node_comment_statistic có giúp ích không?


Lý do tôi nhận được kết quả bổ sung là tôi nhận được kết quả cho mỗi nút, vì mỗi nút có một giá trị số cho số lượng nhận xét mới. Thật khó chịu khi tôi không thể có kết quả cho mỗi thuật ngữ và giá trị có / không nếu có bất kỳ nhận xét mới nào về bất kỳ nút nào cho thuật ngữ đó, tuy nhiên tôi không nghĩ đây là lỗi, do thiết kế.
Evans

0

Đây là bản phác thảo một câu trả lời sẽ đưa bạn đến gần hết, tôi nghĩ vậy. Bắt đầu bằng cách tạo chế độ xem các nút, sau đó thêm phân loại và thời gian nhận xét mới nhất dưới dạng các trường.

Bây giờ, bật tổng hợp cho chế độ xem và đặt tổng hợp cho trường phân loại thành "kết quả nhóm với nhau", trên cột "tid".

Thay đổi cài đặt tổng hợp cho trường thời gian nhận xét thành "Tối đa".

Bây giờ bạn sẽ có một chế độ xem liệt kê tất cả các điều khoản phân loại của bạn (ít nhất là các điều khoản có nội dung) với ngày bình luận cuối cùng. Bước cuối cùng sẽ là xử lý dấu thời gian nhận xét trong một khung nhìn hoặc theo chủ đề để làm cho nó hiển thị theo yêu cầu của bạn, điều này tương đối đơn giản.


Làm cách nào để thực hiện bước cuối cùng của 'Thay đổi cài đặt tổng hợp cho trường thời gian nhận xét thành "Tối đa".' ?
Evanss

Khi bạn đã bật cài đặt tổng hợp, mọi trường trong danh sách bên dưới Trường sẽ có liên kết cài đặt tổng hợp bên cạnh. Nhấp vào đó và bạn sẽ thấy một kiểu thả xuống có nhãn "loại tổng hợp". Tối đa là một trong những lựa chọn.
Alfred Armstrong

Tôi đã làm điều này nhưng nó không nhóm các kết quả cho mỗi thuật ngữ phân loại. Tôi vẫn có một kết quả cho mỗi nút.
Evanss

Bạn có đặt tổng hợp cho trường phân loại thành "kết quả nhóm với nhau", trên cột "tid", theo câu trả lời của tôi không? Tôi đã thử nghiệm phương pháp này vì vậy tôi khá tự tin rằng nó hoạt động.
Alfred Armstrong

1
Tôi đã thử cách tiếp cận này trên một bản cài đặt thử nghiệm và nhận được kết quả như mô tả vì vậy phải có một số khác biệt với những gì chúng tôi đã thực hiện. Bạn đã loại bỏ trường tiêu đề nút? Bạn không cần nó và nó sẽ làm hỏng kết quả.
Alfred Armstrong

0

Trước tiên, bạn phải thực hiện một truy vấn khác, để truy xuất các thuật ngữ có các nút có nội dung mới.

Tôi đã được giúp đỡ bởi chủ đề này .

Như tôi đã nói với bạn, tôi đặt tất cả những thứ này vào các trường php; nếu bạn có thời gian, sẽ tốt hơn nếu đặt nó trong một mô-đun, trong lượt xem_query_alter hoặc cách khác.

  1. Thêm một trường php và trong mã thiết lập , hãy lấy danh sách các thuật ngữ có nội dung mới:

    $query = db_select('node_comment_statistics', 'c')
      ->condition('c.last_comment_timestamp', 'history_user.timestamp', '>');
    $query->join('field_data_YOURTERMREFERENCEFIELD', 't', 't.entity_id=c.nid');
    $query->fields('t', array('YOURTERMREFERENCEFIELD_tid'))
      ->groupBy('t.YOURTERMREFERENCEFIELD_tid');
    
    $static = $query->execute()->fetchCol();
  2. Bây giờ trong mã đầu ra , kiểm tra xem thuật ngữ của bạn có trong mảng này không:

    if (in_array($data->tid, $static)) {
      print 'new comments !';
    }

Đây là thứ nhẹ nhất tôi thấy, ngay cả khi truy vấn có thể nặng nếu bạn có số lượng lớn nút và nhận xét.

EDIT: Tôi phải nhớ rằng việc đưa php vào sql với lượt xem php KHÔNG phải là một cách thực hành tốt , tôi mời bạn đưa tất cả những điều đó vào một mô-đun tùy chỉnh trong hook_view_query_alter ngay khi bạn có thể.


Tôi sợ nó không hoạt động. Mỗi thuật ngữ có lĩnh vực 'bình luận mới!' mặc dù chỉ một số thực sự có ý kiến ​​mới về nội dung của họ. Ngoại lệ duy nhất là thuật ngữ doenst có bất kỳ nút nào cả.
Evanss

@kiamlaluno đã chỉnh sửa mã. Nó có hoạt động bây giờ không? Nó làm cho tôi :)
Gregory Kapustin

Tôi đã không thay đổi mã; Tôi chỉ đơn giản là định dạng lại văn bản. :) Nếu nó không hoạt động cho @jdln, nhưng nó hoạt động với bạn, thì có thể bạn đang áp dụng mã khác, hoặc các thuật ngữ phân loại được lấy từ các từ vựng khác nhau (ví dụ: phân loại thẻ).
kiamlaluno
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.