公開されたフィルターを使用した場合、フィルター選択はURLの名前/値のペアとして渡されます。たとえば、次のようになります。
members?field_a=valuea&field_b=valueb
「auto」スタイルのURLをさらに使用するように設定するにはどうすればよいですか:
members/valuea/valueb
公開されたフィルターを使用した場合、フィルター選択はURLの名前/値のペアとして渡されます。たとえば、次のようになります。
members?field_a=valuea&field_b=valueb
「auto」スタイルのURLをさらに使用するように設定するにはどうすればよいですか:
members/valuea/valueb
回答:
私の同僚がしばらく前にパスデータと呼ばれるモジュールを作成しました。彼の意図は、このまさに問題を解決することでした。残念ながら、通常のパスエイリアスと競合することが判明したため、エイリアスを使用しないdrupal.orgのようなサイトで動作しますが、サイトを使用するパスエイリアスのリンクは解除されます。
現在、この問題を解決する唯一の一般的な方法は、httpdレイヤーでURLを操作するか、hook_url_inbound_alterとhook_url_outbound_alterを使用することだと考えています。この質問で言及されたフックについてもう少し読むことができます。
ただし、この別の撮影を自分で行う場合は、代わりにビュー固有のソリューションを試みます。この問題は十分に一般的であるため、このためのモジュールがあると正当化できるからです。
でhook_views_pre_build、一つは、「メンバー/ valuea /値b」のようなURLからデータを取ることができる$ _GET [「Q」]にこれらの値をプッシュし、ビューがそれの問合せ「のURLに」GET引数を見に構築でき、その後、おそらくそれらを削除します再びhook_views_post_buildで。
あなたが説明している問題に対処する、最近リリースした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
その下では、必要に応じて、hook_url_inbound_alter、hook_url_outbound_alter、およびhook_initをリダイレクトとともに使用します。
公開されたフィルターはフォームです。つまり、ユーザーがオプションを選択する前に、リダイレクトする場所(「アクション」属性)を知る必要があります。したがって、彼の選択に関する情報を含むきれいなURLに彼をリダイレクトすることはできません。回避策:
JavaScript。JavaScriptを使用して、ユーザーが選択したオプションに基づいて公開されたフィルターフォームの「アクション」属性をオンザフライで変更し、適切なコンテキストフィルターが構成された適切なビューのURLに「アクション」を設定します。しかし、その場合は「SEOフレンドリー」になるとは思いません(間違っている場合は誰かが私を修正してください)。
ダブルリダイレクトを行います。hook_form_alterを使用して、フォームを取得した後、ユーザーの入力に基づいて、適切なコンテキストフィルターが構成された適切なビューのURLにユーザーをリダイレクトします。これには、実際には一部のブラウザでユーザーの確認が必要になる場合があるため、非常に面倒な場合があります。
上記の両方の方法では、https://drupal.org/project/views_expostを使用してこれらのフォームのメソッドをPOSTに変更する必要があるため、変数はユーザーのURLを汚染しません。
一番下の行は、公開されたフィルターできれいなURLが必要な場合-おそらく何か間違ったことをしているということです。なぜなら、それらは単にデータをフィルタリングするためのものであり、ウェブサイトの新しいページを定義するために使用すべきではないからです。それが必要な場合-メニューとして設定されたビューを作成し、そのメニューのURLを使用すると、ユーザーを現在の同じビューにリダイレクトできますが、コンテキストフィルターは異なります。
プログラムの観点からは、常にhook_url_inbound_alter()およびhook_url_outbound_alter()フックを使用できます。
URLモジュールへのパラメーターのクエリを試行するか、Search APIとFacetsを使用している場合は、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()を使用してカスタムメニューコールバックを定義し、プログラムでビューをロードできます。
次のコードを使用できます。
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;
}