Có thể tự động đặt cài đặt máy nhắn tin của Lượt xem không?


13

Ví dụ, bạn có chế độ xem hiển thị khi xem một loại nút nhất định, nhưng bạn muốn cài đặt máy nhắn tin khác nhau cho từng nút riêng lẻ. Tôi đã nghĩ đến việc tạo một trường CCK như "cài đặt máy nhắn tin" và sau đó cung cấp cho nó một tùy chọn số nguyên của xy. Nhưng tôi không biết liệu bằng cách nào đó có thể tự động cắm trường đó vào cài đặt của Chế độ xem hay không. Hoặc có một cách khác để làm điều này có thể?

Câu trả lời:


18

Móc khung nhìn mà bạn muốn sử dụng hook_views_pre_buildđược gọi trước khi truy vấn được tạo. Bây giờ điều này là giả sử bạn có một số kinh nghiệm phát triển mô-đun cơ bản và bạn đã quen với api lượt xem.

Bạn sẽ có thể làm:

/*
 * Implementation of hook_views_pre_build().
 */
function hook_views_pre_build(&$view) {

  // Make sure this is only for the specific view you want to modified
  if ($view->name == "foo_bar") {

    // Get the x-y value from where you're storing it (in your example the node object).
    $pager_count = get_count_for_this_node();

    // Lets also make sure that this is a number so we won't destroy our view.
    if (is_numeric($pager_count)) {

      // Now lets set the pager item to what ever out count is.
      $view->pager['items_per_page'] = $pager_count;
    }
  }
}

Ở trên, chúng tôi đang sử dụng móc khung nhìn được gọi trước khi truy vấn chế độ xem được tạo theo cách máy nhắn tin và mọi thứ khác sẽ phản ánh sự thay đổi.

Lời cảnh báo: khung nhìn chỉ nên được sử dụng nếu bạn hiểu chuyện gì đang xảy ra. Đoạn mã trên được viết cho lượt xem-2.x.

Hi vọng điêu nay co ich.


Tuyệt vời, cảm ơn bạn. Tôi chưa có kinh nghiệm phát triển mô-đun nào, nhưng tôi đang bắt đầu với nó cho một vài điều tôi muốn thực hiện. Tôi có một nắm bắt tốt về PHP, vì vậy tôi có thể theo dõi những gì đang xảy ra trong đoạn mã mà bạn đã dán ở trên. Tôi nghĩ rằng điều này cũng giúp tôi rất nhiều. Cảm ơn bạn.
Jay

1
Đối với Lượt xem 3.x, mã liên quan nên được đổi thành$view->items_per_page = $pager_count;
stevenw00

có thể thiết lập offset của từng trang một cách linh hoạt không?
shekoufeh

2

Đối với Drupal 7, chỉ nên viết như sau:

$view->items_per_page = $pager_count;

Trong ví dụ:

/**
 * Implements hook_views_pre_build().
 */
function module_name_views_pre_build(&$view) {
  if ($view->name == "foo_bar" && $view->current_display == 'foo_display') {
    $pager_count = get_count_for_this_node();
    if (is_numeric($pager_count)) {
      $view->items_per_page = $pager_count;
    }
  }
}

Tôi sử dụng ví dụ mã bởi @ericduran.


1

Bạn nên sử dụng chức năng xem tiền xử lý

/*
 * Implementation of hook_views_pre_render().
 */
function MYMODULE_views_pre_render(&$view){
  // $view->name
  // $view->current_display
  // ...
  // look for other variables in $view object
}

"tiền xử lý" là dành cho chủ đề và tiền tố quá muộn (truy vấn của anh ấy đã sẵn sàng chạy) - hook pre_build tốt hơn nhiều.
mojzis

1

Để cập nhật kết quả lượt xem và máy nhắn tin trong hook_view_pre numnder, bạn có thể làm như sau:

<?php

/**
 * Implementation of hook_views_pre_render().
 */
function MODULENAME_views_pre_render(&$view) {
  if ($view->name == 'my_view' && $view->current_display == 'my_display') {
    // View result update logic.
    // e.g.
    // $result = array();
    // foreach ($view->result as $k => $row) {
    //   if (whatever is your condition) {
    //     $result[$k] = $row;
    //   }
    // }

    // Assuming $result has data as per your logic.
    // Update the pager according to result.
    $view->query->pager->total_items = count($result);
    $view->query->pager->update_page_info();
    // Add results to view.
    $view->result = $result;
  }
}

Điều này sẽ làm việc !! ;)


Thông minh! Tôi muốn giới hạn số lượng mục trên một trang nhất định phụ thuộc vào các mục được truy vấn trả về. Sẽ kiểm tra phương pháp này càng sớm càng tốt.
Jens

Nó không chính xác làm việc. Các hàng bạn xả không bật lên trên trang tiếp theo. Vì vậy, bạn kết thúc với nội dung bị thiếu. Cần điều tra thêm.
Jens

0

Mã của @tanmayk đã lừa tôi. Trong hook_view_pre numnder chỉ thêm 2 dòng mã này

$view->query->pager->total_items = $nr;
$view->query->pager->update_page_info();

Nhưng tôi không cần thêm kết quả vào khung nhì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.