노출 된 필터의 URL 변경


15

노출 된 필터를 사용하면 필터 선택이 URL에서 이름 / 값 쌍으로 전달됩니다. 예를 들면 다음과 같습니다.

members?field_a=valuea&field_b=valueb

더 많은 "pathauto"스타일 URL을 사용하도록 설정하는 방법 :

members/valuea/valueb

훌륭한 질문입니다. AFAIK, 코드를 제외하고는 현재로서는 불가능합니다. 발견 문제를 해결하기 위해 보인다,하지만 아직 테스트하지 않았다.
카운트 제로

당신은 깨끗한 URL에 문제가 있습니다,이 게시물을 읽으십시오 drupal.org/getting-started/clean-urls
subhojit777

1
깨끗한 URL을 사용하도록 설정했습니다. 다른 페이지에서는 seo 친화적 인 표기법이지만 노출 된 필터의 경우 쿼리 문자열입니다. 예를 들어 기사로 이동하면 url은 seo 친화적입니다. 빠진 것이 있으면 알려주세요.
Kalpesh Patel

나는 이것에 대한 어떤 지적이있을 수 있지만 문제에 가기 전에 실제로 증거를 찾을 것입니다. 더 중요한 것은 "SEO 친화적 인 URL"또는 일반적인 검색에 해당하는 콘텐츠입니까? 결과 페이지의 제목이 강하면 URL보다 훨씬 가치가 있다고 생각합니다. 어쨌든 콘텐츠에 먼저 집중할 것입니다.
Alfred Armstrong

답변:


9

내 동료가 얼마 전에 경로 데이터 라는 모듈을 만들었습니다 . 그의 의도는 바로이 문제를 해결하는 것이 었습니다. 불행히도 일반 경로 별칭과 충돌하는 것으로 나타 났으므로 drupal.org와 같이 별칭을 사용하지 않는 사이트에서 작동하지만 사이트를 사용하는 경로 별칭의 링크 끊어집니다.

현재이 문제를 해결하는 유일한 일반적인 방법은 httpd 레이어에서 URL을 조작하거나 hook_url_inbound_alterhook_url_outbound_alter를 사용하는 것 입니다. 이 질문에서 언급 된 후크 대해 조금 더 읽을 수 있습니다 .

그러나이 다른 촬영을 직접한다면, 대신에 특정 솔루션을 시도 할 것입니다.이 문제는 이것에 대한 모듈을 가질 수있을만큼 흔하기 때문에 일반적입니다.

에서 hook_views_pre_build , 하나는 "회원 / valuea / VALUE (단위 : 십억)"와 같은 URL에서 데이터를 취할 수 $ _GET [ 'Q']에이 값을 밀어 전망이의 쿼리 "URL에"가져 오기 인수를 보는을 만들어 보자, 다음 가능성 제거 hook_views_post_build 에서 다시 .


감사. 사소 해 보이지 않습니다. 검색 엔진 스파이더가 양식을 지나서 크롤링하지 않기 때문에 주로 SEO 목적으로 사용하고 싶습니다. 상황에 맞는 필터로 두 번째보기를 사용하고 노출 된 필터 블록을 포함시킬 수 있습니다. 그런 다음 노출 된 필터를 원래보기로 제출하려면 자바 스크립트가 필요합니다.
uwe

흠, 그렇게하면 javascript를 사용하여 page? name1 = value1 & name2 = value2에서 page / value1 / value2 stackoverflow.com/questions/5815995/… 형식으로 GET url 양식을 수정할 수 있습니다 . 자바 스크립트가 비활성화되어 있으면 폴백으로 원래보기가 있습니다.
uwe

@letharion : Drupal 7에 대한 지원이 없습니다.
개발자 React 개발자

4

최근에 릴리스 한 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

http://example-site.com/events/p/field_category_id/0__100--1__101/field_author_name/0__John/field_author_surname/0__Doe

그 아래에는 필요한 경우 리디렉션과 함께 hook_url_inbound_alter, hook_url_outbound_alter 및 hook_init가 사용됩니다.


Drupal 8은 어떻습니까?
InspiredCoder

1

노출 된 필터는 양식이므로 사용자가 옵션을 선택하기 전에 경로를 재 지정할 위치 ( "action"속성)를 알아야합니다. 그래서 우리는 그의 선택에 대한 정보가 들어있는 예쁜 URL로 그를 리디렉션 할 수 없습니다. 해결 방법 :

  1. 자바 스크립트. JavaScript를 사용하여 사용자가 선택한 옵션을 기반으로 노출 된 필터 양식의 "action"속성을 즉시 변경하고 "Context"를 적절한 컨텍스트 필터가 구성된 적절한보기의 URL로 설정하십시오. 그러나 나는 그것이 "SEO friendly"라고 의심합니다 (내가 틀렸다면 누군가 나를 수정하십시오).

  2. 이중 리디렉션을 수행하십시오. hook_form_alter를 사용하여 양식을 얻은 후 사용자의 입력을 기반으로 적절한 컨텍스트 필터를 구성하여 사용자를 적절한보기의 URL로 리디렉션하십시오. 실제로 일부 브라우저에서는 사용자 확인이 필요할 수 있으므로 매우 성 가실 수 있습니다.

위의 두 가지 방법 모두 https://drupal.org/project/views_expost 를 사용 하여 해당 양식의 방법을 POST로 변경 해야 하므로 변수가 사용자 URL을 오염시키지 않습니다.

결론은 노출 된 필터가있는 예쁜 URL이 필요하다면 아마도 잘못된 일을하고 있다는 것입니다. 그것들은 단지 데이터를 필터링하기위한 것이며 웹 사이트에서 새 페이지를 정의하는 데 사용해서는 안된다고 생각하기 때문에. 필요한 경우-메뉴로 구성된보기를 만들 수 있으며 해당 메뉴의 URL은 현재와 동일한보기로 다른 컨텍스트 필터를 사용하여 사용자를 리디렉션합니다.


1

프로그래밍 방식으로 보면 항상 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 () 를 사용하여 사용자 정의 메뉴 콜백을 정의하고 프로그래밍 방식으로 뷰를로드 할 수 있습니다.


-1

다음 코드를 사용할 수 있습니다.

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;
}

뷰는 솔루션의 새로운 URL을 인식하지 못합니다 !!
prabeen giri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.