Lượt xem sắp xếp tùy chỉnh


8

Làm cách nào tôi có thể tạo một loại mục tùy chỉnh trong chế độ xem? Ví dụ: tôi muốn đặt hàng nội dung bằng cách : (rating * 10) - age in hours. (Xếp hạng là tỷ lệ phần trăm mô-đun 5 sao.)

Tôi đã xem xét mô-đun Trường tính toán và API Lượt xem nhưng tôi không tìm thấy thứ tôi cần.

Câu trả lời:


8

Cuối cùng, tôi đã tạo ra một mô-đun tùy chỉnh với trình xử lý Lượt xem Sắp xếp để viết lệnh sql tùy chỉnh.

function custom_module_views_query_alter(&$view, &$query) {
  if($view->name === 'viewname') {
    /**
     * Order = (rating * 10) – (hours old / 2)
     * Note: the rating field is divided by 2 because in the DB the rating is out of 100
     */
    $view->query->orderby[0]['field'] = "(if(field_data_field_rating.field_rating_rating, field_data_field_rating.field_rating_rating,0) / 2) - ROUND((UNIX_TIMESTAMP(NOW())-created)/60/60/2)";
    $view->query->orderby[0]['direction'] = "DESC";

    $view->query->orderby[1]['field'] = "created";
    $view->query->orderby[1]['direction'] = "DESC";
  }
}

Để làm việc này, bạn phải thêm SQL THAM GIA trong mô-đun này hoặc thêm các trường xếp hạng và ngày đăng dưới dạng 'sắp xếp' trong chế độ xem của bạn.


3

Tôi sẽ sử dụng mô-đun Views PHP cho vấn đề này.

Mô-đun này cho phép tài khoản quản trị viên (người dùng 1) thêm các trường, bộ lọc và sắp xếp vào các chế độ xem sử dụng mã PHP.

  • Cài đặt và kích hoạt mô-đun (cùng với Chế độ xem)
  • Thêm tất cả các trường cần thiết trong chế độ xem của bạn và loại trừ khỏi màn hình
  • Thêm một trường Toàn cầu mới : PHP nơi bạn chỉ định mã bạn cần để tính kết quả mong muốn.
  • Trong mã giá trị thêm: return (($rating * 10) - $age);(cũng tham khảo phần biến có sẵn bị thu gọn ).
  • Trong mã đầu ra thêm: <?php print $value; ?>
  • Thêm một trường toàn cầu mới : PHP sắp xếp với:if ($row1->php < $row2->php) return -1; else return 1;

Xếp hạng đang được cung cấp bởi mô-đun fivestar, làm cách nào tôi có thể truy cập xếp hạng bằng cách sử dụng $ row-> rating chỉ trả về ID nút chứ không phải xếp hạng nút?
Owen

Tôi sợ rằng tôi không biết mô-đun fivestar. Nếu xếp hạng là một trường thích hợp được đính kèm trên thực thể của bạn (ví dụ: nút), thì bạn chỉ cần thêm xếp hạng vào chế độ xem của mình.
Wtower

7
Đừng sử dụng Lượt xem PHP! Sử dụng mã xem tùy chỉnh thực sự cho khả năng bảo trì.
chữ số

0

Bạn chỉ có thể sắp xếp TRANG HIỆN TẠI nếu bạn sử dụng Global:PHPtrường. Tuy nhiên, nếu bạn có một máy nhắn tin và cần truy vấn chọn để sắp xếp theo biểu thức đó, bạn cần triển khai hook_views_query_altervà thêm trường tùy chỉnh.

Trước tiên, bạn cần thêm các trường này vào biểu thức của mình tại phần FIELDS của chế độ xem , sau đó thêm móc như thế này:

function MODULE_NAME_views_query_alter(&$view, &$query){

    if($view->name == 'name' && $view->current_display == 'page'){
        $query->add_field(NULL, 'TABLENAME.rating * 10 - TABLENAME.age', 'sort_field');
        $query->orderby = array(
            array(
                'field' => 'sort_field',
                'direction' => 'DESC',
            ),
        );

    }
}

Tìm chi tiết trong tài liệu add_field củaviews_plugin_query_default


0

Sử dụng một trường có giá trị sắp xếp ((xếp hạng * 10) - tuổi tính theo giờ) sẽ không hoạt động trừ khi bạn cập nhật giá trị trường đó liên tục (vì nó sẽ thay đổi trong khi thời gian trôi qua).

Có lẽ bạn nên viết trình xử lý Lượt xem Sắp xếp của riêng bạn. Trình xử lý sắp xếp Lượt xem cho phép bạn đặt thứ tự sắp xếp trong SQL.

Trong SQL của bạn, bạn sẽ cần:

  • Một cột được tính toán với giá trị sắp xếp của bạn: (xếp hạng * 10) - tuổi tính theo giờ
  • ĐẶT HÀNG theo câu sử dụng cột đó.

Tôi chưa bao giờ viết một trình xử lý sắp xếp nhưng tôi nghĩ nó có thể giải quyết vấn đề của bạn.

Kiểm tra các mô-đun contrib sử dụng trình xử lý sắp xếp riêng của họ.


Cảm ơn bạn đã trả lời, tôi nghĩ rằng tôi sẽ xem xét Trình xử lý sắp xếp lượt xem vì compute_field dường như không cập nhật theo thời gian thực cho mỗi truy vấn và có thể hơi nặng trên máy chủ.
Owen
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.