노출 된 필터를 사용하면 필터 선택이 URL에서 이름 / 값 쌍으로 전달됩니다. 예를 들면 다음과 같습니다.
members?field_a=valuea&field_b=valueb
더 많은 "pathauto"스타일 URL을 사용하도록 설정하는 방법 :
members/valuea/valueb
노출 된 필터를 사용하면 필터 선택이 URL에서 이름 / 값 쌍으로 전달됩니다. 예를 들면 다음과 같습니다.
members?field_a=valuea&field_b=valueb
더 많은 "pathauto"스타일 URL을 사용하도록 설정하는 방법 :
members/valuea/valueb
답변:
내 동료가 얼마 전에 경로 데이터 라는 모듈을 만들었습니다 . 그의 의도는 바로이 문제를 해결하는 것이 었습니다. 불행히도 일반 경로 별칭과 충돌하는 것으로 나타 났으므로 drupal.org와 같이 별칭을 사용하지 않는 사이트에서 작동하지만 사이트를 사용하는 경로 별칭의 링크 는 끊어집니다.
현재이 문제를 해결하는 유일한 일반적인 방법은 httpd 레이어에서 URL을 조작하거나 hook_url_inbound_alter 및 hook_url_outbound_alter를 사용하는 것 입니다. 이 질문에서 언급 된 후크 에 대해 조금 더 읽을 수 있습니다 .
그러나이 다른 촬영을 직접한다면, 대신에 특정 솔루션을 시도 할 것입니다.이 문제는 이것에 대한 모듈을 가질 수있을만큼 흔하기 때문에 일반적입니다.
에서 hook_views_pre_build , 하나는 "회원 / valuea / VALUE (단위 : 십억)"와 같은 URL에서 데이터를 취할 수 $ _GET [ 'Q']에이 값을 밀어 전망이의 쿼리 "URL에"가져 오기 인수를 보는을 만들어 보자, 다음 가능성 제거 hook_views_post_build 에서 다시 .
최근에 릴리스 한 Query Parameters To URL 모듈이 있는데 ,이 문제를 설명하는 문제가 있습니다.
이 모듈은 지정된 경로에서 URL 쿼리 매개 변수를 Clean URL 구성 요소로 다시 쓰는 기능을 제공합니다.
간단한 정규식을 사용하거나 모듈 후크를 구현하여 쿼리 인수를 깨끗한 URL 구성 요소로 다시 작성해야하는 경로를 구성 할 수 있습니다.
그렇게하면 다음과 같이 Views 노출 필터 URL을 변환 할 수 있습니다
http://example-site.com/events?field_category_id[0]=100&field_category_id 1 = 101 & field_author_name [0] = John & field_author_surname [0] = Doe
그 아래에는 필요한 경우 리디렉션과 함께 hook_url_inbound_alter, hook_url_outbound_alter 및 hook_init가 사용됩니다.
노출 된 필터는 양식이므로 사용자가 옵션을 선택하기 전에 경로를 재 지정할 위치 ( "action"속성)를 알아야합니다. 그래서 우리는 그의 선택에 대한 정보가 들어있는 예쁜 URL로 그를 리디렉션 할 수 없습니다. 해결 방법 :
자바 스크립트. JavaScript를 사용하여 사용자가 선택한 옵션을 기반으로 노출 된 필터 양식의 "action"속성을 즉시 변경하고 "Context"를 적절한 컨텍스트 필터가 구성된 적절한보기의 URL로 설정하십시오. 그러나 나는 그것이 "SEO friendly"라고 의심합니다 (내가 틀렸다면 누군가 나를 수정하십시오).
이중 리디렉션을 수행하십시오. hook_form_alter를 사용하여 양식을 얻은 후 사용자의 입력을 기반으로 적절한 컨텍스트 필터를 구성하여 사용자를 적절한보기의 URL로 리디렉션하십시오. 실제로 일부 브라우저에서는 사용자 확인이 필요할 수 있으므로 매우 성 가실 수 있습니다.
위의 두 가지 방법 모두 https://drupal.org/project/views_expost 를 사용 하여 해당 양식의 방법을 POST로 변경 해야 하므로 변수가 사용자 URL을 오염시키지 않습니다.
결론은 노출 된 필터가있는 예쁜 URL이 필요하다면 아마도 잘못된 일을하고 있다는 것입니다. 그것들은 단지 데이터를 필터링하기위한 것이며 웹 사이트에서 새 페이지를 정의하는 데 사용해서는 안된다고 생각하기 때문에. 필요한 경우-메뉴로 구성된보기를 만들 수 있으며 해당 메뉴의 URL은 현재와 동일한보기로 다른 컨텍스트 필터를 사용하여 사용자를 리디렉션합니다.
프로그래밍 방식으로 보면 항상 hook_url_inbound_alter () 및 hook_url_outbound_alter () 후크를 사용할 수 있습니다.
URL에 매개 변수 조회 모듈 을 시도 하거나 검색 API 및 패싯을 사용하는 경우 패싯 API 경로를 사용할 수 있습니다 .
경로에서 인수를 사용하고 리디렉션 모듈 을 사용하도록 뷰를 변환 할 수도 있습니다 .
위와는 별도로 Drupal 8의 보류 기능이 아직 남아 있기 때문에이를 쉽게 달성 할 수있는 방법은 없습니다. URL 별명에 쿼리 문자열 허용을 참조하십시오 .
뷰를 사용하는 패널과 더 나은 노출 필터를 사용하는 경우 (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']
}
}
}
자세한 내용 은 패널의 URL에서 인수 전달보기 창 또는 블록을 참조하십시오 .
마지막으로 hook_menu () 를 사용하여 사용자 정의 메뉴 콜백을 정의하고 프로그래밍 방식으로 뷰를로드 할 수 있습니다.
다음 코드를 사용할 수 있습니다.
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;
}