Ẩn chế độ xem nếu ít hơn kết quả N


6

Tôi tự hỏi liệu có thể ẩn chế độ xem (dưới dạng xem khối) nếu nó có ít hơn kết quả X không.

Câu trả lời:


1

Phải mất một chút để tìm hiểu các móc xem. Bạn có biết về xem tập tin mẫu? Nếu vậy, một cách nhanh chóng và bẩn để làm điều đó là kiểm tra xem có bao nhiêu hàng trong tệp mẫu xem mức cao nhất mà đầu ra hiển thị. Nếu bạn đã cài đặt mô-đun dpm($variables)Devel, bạn có thể trong view-view.tpl.php (có thể bạn sẽ muốn sử dụng đầu ra hiển thị duy nhất cho chế độ xem của mình).
Tôi không thể nhớ nơi nào, nhưng một nơi nào đó $variableslà một hàng đếm; bạn có thể thêm logic vào tệp mẫu để không in ra $rowsnếu nó không đáp ứng tiêu chí của bạn.


1
Đặt loại logic này trong tệp mẫu không được khuyến khích. Đề xuất sử dụng tiền xử lý của @ googletorp là tốt hơn.
tim.plunkett

bạn đã bỏ lỡ phần tôi nói về nhanh và bẩn. Bẩn thỉu rằng nó không phải là một thực hành tốt nhất.
Jepedo

8

Dựa trên gợi ý mà googletorp đã đưa ra, giải pháp đơn giản của tôi là đưa cái này vào template.php của tôi:

function MY_THEME_NAME_preprocess_views_view(&$vars) {
  if ($vars['display_id'] == 'MY_DISPLAY_ID' && count($vars['view']->result) < 2) {
    $vars['view']->result = NULL;
  }
}

Trong trường hợp này tôi đang ẩn chế độ xem nếu nó có ít hơn hai kết quả.

Cảm ơn rất nhiều!


2
Nếu bạn sử dụng mã này, trước tiên hãy đảm bảo rằng MY_DISPLAY_ID là toàn bộ trang web duy nhất (bạn có thể chỉnh sửa nó trong chế độ xem dưới Khác - tên máy). Thường thì đó là một cái gì đó rất chung chung như "chặn" bởi vì nó chỉ phải là duy nhất trong một khung nhìn.
Yuri

8

Bạn có thể trong một hàm tiền xử lý mẫu có thể dễ dàng phát hiện số lượng kết quả (hàng) mà một khung nhìn có và đặt đầu ra thành một chuỗi trống nếu đó là trường hợp.

Để làm việc này, bạn có thể cần thực hiện một chút công việc trong mẫu, vì Chế độ xem luôn thêm một số gói HTML mà bạn có thể không muốn nếu chế độ xem trống.

Tôi có thể dễ dàng thực hiện nhất trong hàm tiền xử lý template_pre process_view_view () . Bạn có thể tham khảo giao diện lượt xem để có gợi ý về các mẫu.


Tôi không hiểu điều này cả. Nếu bạn vẫn cần thực hiện công việc bên trong tệp tpl.php để đảm bảo xóa tất cả HTML của trình bao bọc, thì điểm sửa đổi tệp template.php là gì? Có vẻ như bạn đang tạo thêm công việc.
Lester Peabody

1
@LesterPeabody Cách tốt nhất là đặt logic trong quá trình tiền xử lý và chỉ xử lý đánh dấu trong mẫu. Làm cho mã của bạn dễ bảo trì hơn.
googletorp

Có logic ở mọi nơi trong các tệp mẫu xem ... có lẽ bạn có thể cung cấp một ví dụ? Ví dụ, tôi chỉ đơn giản bao quanh một thể hiện của views-view.tpl.phptệp có <?php if ($rows): ?> ... <?php endif; ?>. My understanding currently is there is no way to eliminate the extraneous wrapper HTML otherwise. If the biến $ rows` đã có sẵn cho tôi trong tệp đó, tại sao tôi lại phải làm thêm template.php?
Lester Peabody

@LesterPeabody Chung, Tìm hiểu xem có gì đó trước khi kết xuất là phổ biến không. Nhưng logic đặc biệt cho một chế độ xem cụ thể không thuộc về tệp mẫu. Khó duy trì hơn và khi xây dựng các trang web phức tạp mà bạn cần duy trì điều này trở nên rõ ràng hơn.
googletorp

1

Nếu lý do cho điều này chủ yếu theo định hướng hiển thị (ví dụ: bạn đang xây dựng lưới và muốn buộc số lượng vật phẩm chẵn / lẻ) thì tôi cho rằng việc thêm logic tùy chỉnh ở lớp chủ đề chắc chắn là logic nhất. Các câu trả lời khác đã bao gồm điều này tôi nghĩ. Tuy nhiên, vấn đề mà chúng tôi tìm thấy là một số biến số xem có thể cần phải thay đổi (ví dụ $view->result = NULL:), không thể thay đổi một cách an toàn như là một phần của chức năng tiền xử lý. Dường như các chế độ lưu trữ nội bộ xem có thể tạo ra một số biến theo cách mà một số kết hợp cài đặt bộ đệm "đầu ra được kết xuất" và "kết quả truy vấn" có thể không tương thích với bất kỳ giải pháp hiện có nào.

Một cách khác là thay đổi kết quả của chính truy vấn được thực hiện, cung cấp điều khiển ở mức thấp hơn nhiều. Điều này cũng có thể giải quyết một số vấn đề với việc ẩn đánh dấu trình bao bọc vì nó mô phỏng kết quả "trống" được đặt ngay cả trước khi đánh dấu được tạo.

/**
 * Implements hook_views_post_execute().
 */
function MYMODULE_views_post_execute(&$view) {
  $view_name = 'myviewname';
  $view_display = 'mydisplay';
  // Don't show the view if there is only one item.
  if ($view->name == $view_name && $view->current_display == $view_display && count($view->result) < 2) {
    $view->result = array();
  }
}

Tất nhiên điều này không thể được thực hiện trong một chủ đề vì nó không liên quan đến chủ đề hoặc thay đổi hook, nhưng tôi nghĩ nó vẫn đáng chú ý cho những người quan tâm đến câu hỏi này.


0

Trong một số trường hợp, loại điều kiện này sẽ được đặt tốt hơn trong chế độ xem, để người xây dựng hiểu những gì đang xảy ra trong bối cảnh xem chỉnh sửa, không phải trong một số mô-đun hoặc móc chủ đề khác.

Nếu bạn muốn có logic này được bao gồm trên trang chỉnh sửa chế độ xem thì bạn có thể làm điều này:

  1. Thêm trường chân trang Văn bản / HTML toàn cầu và tạo định dạng văn bản Mã PHP
  2. Đặt tên quản trị viên của trường này thành một cái gì đó rất rõ ràng, ví dụ: 'Ẩn chế độ xem này nếu ít hơn 5 kết quả', để các nhà xây dựng trang web trong tương lai sẽ không bị nhầm lẫn (tại sao chế độ xem của tôi biến mất!?!?)
  3. Sửa đổi mã PHP dưới đây cho phù hợp với nhu cầu của bạn và sử dụng trong trường:
<?php
$view = views_get_current_view();
if ( count($view->result) < 5 ) {
    $view->result = null;
}
?>

Hừm. Điều này nghe có vẻ như sẽ hoạt động, nhưng việc thêm mã PHP vào cơ sở dữ liệu thường không được mong muốn khi có một cách khác để làm điều đó.
squarecandy

Đồng ý với bạn @squarecandy, chỉ cung cấp như một sự thay thế có thể cho một số trường hợp nhất định.
RogerRoger

0

Bạn cũng có thể làm điều này bằng cách sử dụng khuôn mẫu chủ đề:

  • Sao chép views-view.phpvào thư mục chủ đề / mẫu của bạn
  • tạo một bản sao của tập tin đó và đặt tên cho nó views-view--view-name--display-name.tpl.php
  • (Xem Nâng cao> Khác> Chủ đề: Thông tin để biết thêm chi tiết về tên tệp cần chọn và ghi đè - bạn có thể nhận được nhiều hơn hoặc ít cụ thể hơn tùy theo nhu cầu của bạn)
  • thêm if (count($rows) < $n):vào mã của bạn để thao tác dựa trên số lượng kết quả nếu cần
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.