Khi tôi sử dụng bộ lọc bị lộ, lựa chọn bộ lọc được truyền dưới dạng cặp tên / giá trị trong url, ví dụ:
members?field_a=valuea&field_b=valueb
Làm cách nào tôi có thể thiết lập nó để sử dụng nhiều hơn kiểu url "pathauto":
members/valuea/valueb
Khi tôi sử dụng bộ lọc bị lộ, lựa chọn bộ lọc được truyền dưới dạng cặp tên / giá trị trong url, ví dụ:
members?field_a=valuea&field_b=valueb
Làm cách nào tôi có thể thiết lập nó để sử dụng nhiều hơn kiểu url "pathauto":
members/valuea/valueb
Câu trả lời:
Một đồng nghiệp của tôi đã tạo ra một mô-đun gọi là dữ liệu đường dẫn một lúc trước. Ý định của anh là giải quyết vấn đề này. Thật không may, nó đã chỉ ra rằng nó xung đột với các bí danh đường dẫn thông thường, vì vậy nó sẽ hoạt động trên một trang web như drupal.org không sử dụng bí danh, nhưng sẽ phá vỡ các liên kết trên một bí danh đường dẫn sử dụng trang web.
Hiện tại, tôi tin rằng cách chung duy nhất để giải quyết vấn đề này là thao túng các URL ở lớp httpd hoặc sử dụng hook_url_inbound_alter và hook_url thừng ra_alter . Bạn có thể đọc thêm một chút về các móc được đề cập tại câu hỏi này .
Tuy nhiên, nếu tôi tự thực hiện một cảnh quay khác, tôi sẽ thử một giải pháp cụ thể cho Lượt xem, vì vấn đề này đủ phổ biến để có thể có lý do để có một mô-đun cho việc này.
Trong hook_view_pre_build , người ta có thể lấy dữ liệu từ một url như "thành viên / valuea / valueb", đẩy các giá trị này thành $ _GET ['q'], để chế độ xem xây dựng truy vấn của nó khi thấy các đối số "trong url", sau đó có thể xóa chúng một lần nữa trong hook_view_post_build .
Có một mô-đun, Tham số truy vấn đến URL , gần đây tôi đã phát hành để giải quyết vấn đề bạn đang mô tả:
Mô-đun này cung cấp khả năng viết lại các tham số truy vấn URL thành các thành phần URL sạch trên các đường dẫn được chỉ định.
Bạn có thể định cấu hình các đường dẫn nên viết lại các đối số truy vấn của chúng dưới dạng các thành phần URL sạch bằng cách sử dụng một biểu thức chính quy đơn giản hoặc bằng cách thực hiện một móc mô-đun.
Bằng cách đó, bạn có thể chuyển đổi URL bộ lọc hiển thị như
http://example-site.com/events?field_carget_id[0[=100&field_carget_id 1 = 101 & field_ Author_name [0] = John & field_ Author_surname [0] = Doe
Bên dưới nó sử dụng hook_url_inbound_alter, hook_url thừng hướng_alter và hook_init với các chuyển hướng khi cần thiết.
Các bộ lọc tiếp xúc là các biểu mẫu, có nghĩa là nơi chúng đang chuyển hướng (thuộc tính "hành động"), cần được biết trước khi người dùng chọn bất kỳ tùy chọn nào. Vì vậy, chúng tôi không thể chuyển hướng anh ấy đến bất kỳ URL đẹp nào có chứa thông tin về lựa chọn của anh ấy. Cách giải quyết:
JavaScript. Sử dụng JavaScript để thay đổi thuộc tính "hành động" nhanh của biểu mẫu bộ lọc được hiển thị dựa trên các tùy chọn mà người dùng đã chọn và đặt "hành động" thành URL của chế độ xem phù hợp với các bộ lọc theo ngữ cảnh phù hợp được định cấu hình. Nhưng tôi nghi ngờ nó sẽ "thân thiện với SEO" (xin vui lòng ai đó sửa tôi nếu tôi sai).
Làm chuyển hướng kép. Bằng cách sử dụng hook_form_alter, sau khi nhận được biểu mẫu, hãy chuyển hướng người dùng đến url của chế độ xem phù hợp, với các bộ lọc theo ngữ cảnh phù hợp được định cấu hình, dựa trên đầu vào của anh ta. Điều này thực sự có thể cần một xác nhận người dùng trên một số trình duyệt, vì vậy nó có thể cực kỳ khó chịu.
Trong cả hai phương pháp trên, bạn sẽ cần sử dụng https://drupal.org/project/view_Exost để thay đổi phương thức của các biểu mẫu đó thành POST, vì vậy các biến sẽ không gây ô nhiễm URL của người dùng.
Điểm mấu chốt là nếu bạn cần có các url đẹp với các bộ lọc bị lộ - có lẽ bạn đang làm sai điều gì đó. Bởi vì tôi nghĩ rằng chúng chỉ để lọc dữ liệu và không nên được sử dụng để xác định các trang mới trên trang web. Nếu bạn cần điều đó - bạn có thể tạo một chế độ xem được định cấu hình thành một menu và các url trong menu đó, sẽ chuyển hướng người dùng đến cùng chế độ xem hiện tại, nhưng với các bộ lọc theo ngữ cảnh khác nhau.
Từ phối cảnh theo chương trình, bạn luôn có thể sử dụng hook hook_url_inbound_alter () và hook_url thừng gửi_alter () cho điều đó.
Bạn có thể thử mô-đun truy vấn tham số đến URL hoặc nếu bạn đang sử dụng API tìm kiếm và các khía cạnh , bạn có thể sử dụng các đường dẫn đẹp của API Facet .
Bạn cũng có thể chuyển đổi chế độ xem của mình để sử dụng các đối số trong đường dẫn của mình và sử dụng mô-đun Redirect .
Ngoài những điều trên, không có cách nào dễ dàng để đạt được điều đó, vì vẫn còn tính năng chờ xử lý cho Drupal 8; xem Cho phép chuỗi truy vấn trong bí danh URL .
Khi bạn đang sử dụng bảng điều khiển sử dụng chế độ xem và trong các bộ lọc được hiển thị tốt hơn, bạn có thể thực hiện một số hack như (ví dụ URL: / panel_url? Category = 123):
/**
* Implements hook_url_inbound_alter().
*/
function foo_url_outbound_alter(&$path, &$options, $original_path) {
if (arg(0) == 'panel_url') {
// Convert URL like: /panel_url?category=29 into /panel_url/term_name (SEO friendly)
$path_info = parse_url($path);
switch (@$path_info['path']) {
case 'panel_url/term_name':
case 'panel_url/term_name2':
$path = 'panel_url/all'; // Convert loopy urls into base url
}
if (strpos($path, '?category=') !== FALSE) { // Convert term id into human name
list(, $tid) = explode('=', current(explode('&', $path_info['query']))); // get tid from URL
$term_name = strtolower(taxonomy_term_load((int)$tid)->name);
$path = '/panel_url' . '/' . $term_name; // See also: $path_info['path']
}
}
}
Để biết thêm thông tin, vui lòng xem Truyền đối số từ URL trong Bảng điều khiển để xem ngăn hoặc chặn .
Cuối cùng, bạn có thể sử dụng hook_menu () để xác định các cuộc gọi lại menu tùy chỉnh và tải chế độ xem của bạn theo chương trình.
Bạn có thể sử dụng mã sau đây.
function hook_form_alter(&$form, &$form_state, $form_id) {
if ($form_id == "abcd") {
$form['#submit'] = array('custom_search_redirect');
}
}
function custom_search_redirect($form, &$form_state) {
$form_state['redirect'] = "members/valuea/valueb;
}