Cách sử dụng nhiều giá trị cho bộ lọc được hiển thị qua url


7

Trong thiết lập hiện tại của tôi, tôi đang hiển thị một chế độ xem xuất ra json thông qua một dịch vụ.

Quan điểm có thể được gọi như thế này : http://domain.com/api/books.json.

Tôi cũng đã đưa ra một bộ lọc cho loại nội dung được tham chiếu "Tác giả". Tôi KHÔNG sử dụng context filters, tôi đang sử dụng Filtersbộ lọc cụ thể và tiếp xúc với người dùng đó, bằng cách này tôi có thể đặt cho bộ lọc của mình một tên đối số đẹp author_nid.

Vì vậy, bây giờ tôi có thể gọi đây : http://domain.com/api/books.json?author_nid=38. Và điều này trả về tất cả các cuốn sách của tác giả với nid đó.

Nhưng dường như tôi không thể tìm ra cách lấy danh sách các cuốn sách của cả tác giả 38 hoặc tác giả 32.

Những điều tôi đã thử:

http://domain.com/api/books.json?author_nid=38,32

http://domain.com/api/books.json?author_nid=38+32

http://domain.com/api/books.json?author_nid[]=38,32

http://domain.com/api/books.json?author_nid[]=38+32

http://domain.com/api/books.json?author_nid[0]=38&author_nid[1]=32

Tôi dường như có cảm giác rằng điều này không được hỗ trợ ngay bây giờ. Tôi có đúng không? Nếu vậy, lựa chọn của tôi là gì? Tôi muốn đặt tên cho đối số của mình vì tôi sắp trưng bày 10 đến 15 bộ lọc (một số tùy chọn, một số tùy chọn khác). Sử dụng các bộ lọc ngữ cảnh và lọc như thế này: args[]=2&args[]=43,23&args[]=44không thể đọc / duy trì được.


4
Điều khá lạ là danh sách các bộ lọc cho Nội dung: Nid không bao gồm "là một trong" giống như nhiều bộ lọc khác.
mpdon Arena

thật vậy, một trong những nỗi thất vọng của tôi atm: p
polyclick

1
Xem Con cóc kim loại: Cách vượt qua nhiều giá trị thông qua Bộ lọc tiếp xúc trong Chế độ xem Drupal , đặc biệt là phần mà anh ta thực hiện hook_views_query_alter.
thứ ba

Câu trả lời:


2

Nếu sử dụng ?author_nid[]=38&author_nid[]=32theo đề xuất của milkovsky không hoạt động, bạn có thể cần xem xét sử dụng các bộ lọc theo ngữ cảnh. Hoặc, như tôi nghĩ có thể là tùy chọn duy nhất của bạn, hãy sử dụng hook_view_query_alter nơi bạn có thể xây dựng mệnh đề WHERE của riêng bạn dựa trên các tham số $ _GET.


Vui lòng kiểm tra nhận xét về câu trả lời của milkovsky. Đáng buồn thay, nó không hoạt động. Sử dụng các bộ lọc ngữ cảnh không thực sự là một lựa chọn, hãy kiểm tra câu hỏi ban đầu của tôi. Bất kỳ tài liệu tham khảo hoặc ví dụ làm thế nào tôi nên viết một cái móc như vậy? Chưa bao giờ làm điều này trước đây: p
polyclick

1
Tôi nhận xét một chút quá nhanh. Bây giờ tôi thấy các liên kết thứ ba được đăng như là một nhận xét về câu hỏi của tôi. Tôi sẽ thử nó trước.
cơn bão

0

Có lẽ nó chỉ là một vấn đề với mã hóa. Tôi có cùng cấu trúc (chế độ xem với trường đa trị trong bộ lọc được hiển thị) và đây là kết quả khi tôi áp dụng nút gửi:

http://mywebsite.com/search-housing?field_rooms_value%5B%5D=1&field_rooms_value%5B%5D=2

Bạn có thể thử cái này và cho tôi biết nếu nó hoạt động?

http://domain.com/api/books.json?master_nid%5B%5D=38&master_nid%5B%5D=32


Cảm ơn đã trả lời nhưng điều này không hiệu quả.
cơn bão

0

Tôi đồng ý với Christian và MPD, không có tùy chọn "là một trong" cho NID. Câu trả lời của Christian về hook_view_query_alter sẽ hoạt động.

Là giải pháp thay thế - bạn có thể thay thế trình xử lý bộ lọc bằng một tùy chỉnh. Đây là giải pháp cho truy vấn API tìm kiếm. Trình xử lý tiếp theo sẽ sử dụng tùy chọn "Cho phép nhiều lựa chọn":

class MYMODULESearchApiViewsHandlerFilter extends SearchApiViewsHandlerFilter {

  /**
   * Extends query to handle multiple values.
   */
  public function query() {
    if (!empty($this->options['expose']['multiple'])) {
      $values = array();
      // ...
      // DO YOUR CODE HERE TO GET VALUES FROM $this->value
      // E.g. $values = explode(',', $this->value);
      // ...
      if (!empty($values)) {
        $or = $this->query->createFilter('OR');
        foreach ($values as $value) {
          $or->condition($this->real_field, $value, $this->operator, $this->options['group']);
        }
        $this->query->filter($or);
      }
    }
    else {
      parent::query();
    }
  }

}

Bạn có thể thêm trình xử lý của mình bằng hook_view_data_alter ().

/**
 * Implements hook_views_data_alter().
 */
function MYMODULE_views_data_alter(&$data) {
  $data['search_api_index_MYINDEX']['MYFIELD']['filter']['handler'] = 'MYMODULESearchApiViewsHandlerFilter';
}

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.