公開されたフィルターのURLの変更


15

公開されたフィルターを使用した場合、フィルター選択はURLの名前/値のペアとして渡されます。たとえば、次のようになります。

members?field_a=valuea&field_b=valueb

「auto」スタイルのURLをさらに使用するように設定するにはどうすればよいですか:

members/valuea/valueb

素晴らしい質問です。私の知る限り、コードを除いて今のところ不可能です。見つかったこの問題を解決するために思われるが、まだそれをテストしていません。
カウントゼロ

あなたは、きれいなURLで問題が発生したこの記事読まれdrupal.org/getting-started/clean-urls
subhojit777

1
クリーンURLを有効にしました。他のページではseoフレンドリーな表記ですが、公開されたフィルターの場合はクエリ文字列のみです。たとえば、記事にアクセスしたとき、urlはseoフレンドリーです。何か足りない場合は教えてください。
カルペシュパテル

これにはいくつかのポイントがあるかもしれませんが、問題に進む前に実際に証拠を探します。さらに重要なのは、「SEOに優しいURL」または一般的な検索に対応するコンテンツですか?結果ページに強力なタイトルがある場合、そのURLよりもはるかに価値があると思います。いずれにしても、私は確かに最初にコンテンツに集中するでしょう。
アルフレッドアームストロング

回答:


9

私の同僚がしばらく前にパスデータと呼ばれるモジュールを作成しました。彼の意図は、このまさに問題を解決することでした。残念ながら、通常のパスエイリアスと競合することが判明したため、エイリアスを使用しないdrupal.orgのようなサイトで動作しますが、サイトを使用するパスエイリアスのリンク解除されます。

現在、この問題を解決する唯一の一般的な方法は、httpdレイヤーでURLを操作するか、hook_url_inbound_alterhook_url_outbound_alterを使用すること考えています。この質問で言及されたフックについてもう少し読むことができます。

ただし、この別の撮影を自分で行う場合は、代わりにビュー固有のソリューションを試みます。この問題は十分に一般的であるため、このためのモジュールがあると正当化できるからです。

hook_views_pre_build、一つは、「メンバー/ valuea /値b」のようなURLからデータを取ることができる$ _GET [「Q」]にこれらの値をプッシュし、ビューがそれの問合せ「のURLに」GET引数を見に構築でき、その後、おそらくそれらを削除します再びhook_views_post_buildで


ありがとう。些細なことではありません。検索エンジンのスパイダーはフォームをクロールしないため、主にSEOの目的で使用します。コンテキストフィルターで2番目のビューを使用し、公開されたフィルターブロックを埋め込むだけです。次に、公開されたフィルターを元のビューに送信するために、JavaScriptが必要です。
ウーヴェ

うーん、私がしなければ、私はページからフォームGETのURLを変更するためにはJavaScriptを使用することができることを?NAME1 = VALUE1&NAME2 = value2のページへ/をvalue1 / value2のstackoverflow.com/questions/5815995/...。JavaScriptが無効になっている場合、フォールバックとして元のビューがあります。
uwe

@letharionは:Drupalの7のすべてのサポートを参照してくださいいけないです
リアクト開発

4

あなたが説明している問題に対処する、最近リリースしたURLへのクエリパラメータモジュールがあります

このモジュールは、指定されたパスでURLクエリパラメータをクリーン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

公開されたフィルターはフォームです。つまり、ユーザーがオプションを選択する前に、リダイレクトする場所(「アクション」属性)を知る必要があります。したがって、彼の選択に関する情報を含むきれいなURLに彼をリダイレクトすることはできません。回避策:

  1. JavaScript。JavaScriptを使用して、ユーザーが選択したオプションに基づいて公開されたフィルターフォームの「アクション」属性をオンザフライで変更し、適切なコンテキストフィルターが構成された適切なビューのURLに「アクション」を設定します。しかし、その場合は「SEOフレンドリー」になるとは思いません(間違っている場合は誰かが私を修正してください)。

  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モジュールへのパラメーターのクエリを試行するか、Search APIFacetsを使用している場合は、Facet API Pretty Pathsを使用できます。

パスで引数を使用するようにビューを変換し、リダイレクトモジュールを使用することもできます。

上記とは別に、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;
}

Viewsは、ソリューションの新しいURLを認識しません!!
prabeen義理
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.