web-dev-qa-db-ja.com

Drupal 7ファセット検索:常にファセットを表示

Searchapi、facetapi、およびentityapiを使用するファセット検索機能があります。これを開発したのは私ではありませんが、Drupalでの経験はあります。現在、ナビゲーションは選択にリンクを使用しており、以下のようになります(箇条書きの最初のレベルはリンクではありません)。ミキシングを選択すると、サウンドデザインと構成が期待どおりに消えます。

クライアントが望んでいるのは、ユーザーがドリルダウンしても(何も返さない場合でも)すべてのアイテムが表示され、選択可能なままであることです。一度に選択できるのは、カテゴリごとに1つのアイテムだけですが、ユーザーは「前に戻る」ことなくそれを行います。
アドバイスは大歓迎です。

  • 私達がすること_
    • 混合(18)
    • サウンドデザイン(11)
    • 構成(6)
  • 私たちは誰ですか_
    • ジョー・シュモー(17)
    • ジェフ・ブレック(14)
    • デビッドベリー(4)
  • 所属作曲家_
    • ジム・キャリー(3)
    • トニー・マロニ(2)
7
Kevin

admin/config/search/search_apiの下で、検索インデックスの[編集]をクリックし、[ファセット]を選択します。次に、アイテムの説明された動作が必要なすべてのファセットについて、次の手順に従います。

  1. 「ディスプレイの設定」をクリックします。
  2. [グローバル設定]セクションで、[最小ファセット数]を0(ゼロ)に変更します。間違いなく、この入力フィールドは「最小ファセットアイテム数」と呼ばれるべきです…
  3. 「構成の保存」。

これで、一致しないすべてのファセットアイテムがファセットリストに残ります(カウントは0)。すでに述べたように、このようなファセットアイテムをクリックしても、検索結果は返されません。

8
Chriki

このコメント の解決策はあなたの問題の解決策だと思います。 template.phpで、theme_facetapi_link_inactive-関数:

function theme_facetapi_link_inactive($variables) {
  // Builds accessible markup.
  $accessible_vars = array(
    'text' => $variables['text'],
    'active' => FALSE,
  );
  $accessible_markup = theme('facetapi_accessible_markup', $accessible_vars);

  // Sanitizes the link text if necessary.
  $sanitize = empty($variables['options']['html']);
  $variables['text'] = ($sanitize) ? check_plain($variables['text']) : $variables['text'];

  // Adds count to link if one was passed.
  if (isset($variables['count'])) {
    $variables['text'] .= ' ' . theme('facetapi_count', $variables);
  }

  // Add functionality requested in #1669600.
  if (!$variables['count'] && isset($variables['options']['query']['f'])) {
    // We should be getting this from the url processor plugin, however we are
    // making an assumption since this is in our custom theme.
    $params = &$variables['options']['query']['f'];

    // Capture the filter associated with this link and find the field alias.
    $filter = end($params);
    $field_alias = substr($filter, 0, strpos($filter, ':')) . ':';

    // Iterate over params and strip out items that are using the same field
    // alias as this filter. Do not strip out this filter.
    foreach ($params as $key => $param) {
      if (0 === strpos($param, $field_alias) && $param != $filter) {
        unset($params[$key]);
      }
    }
  }

  // Resets link text, sets to options to HTML since we already sanitized the
  // link text and are providing additional markup for accessibility.
  $variables['text'] .= $accessible_markup;
  $variables['options']['html'] = TRUE;
  return theme_link($variables);
}
1
Michiel

すべてのアイテムが表示され、選択可能なままであることを確認するには、グローバル設定検索が「OR」に設定されていることを確認してください。管理メニューから、[設定]> [検索API]> [インデックスの名前]の[編集]リンク>ファセット(タブ)> [ファセットの名前]の[ディスプレイの構成]リンクに移動し、[グローバル設定]で[演算子]または[OR]を選択します。 (「最小ファセット数」を1に維持)

すべてのファセットブロックが表示されたままになるようにするには、各ファセットブロックの構成ページで、ファセットが指定されたページに表示されていることを確認してください。 [構造]> [ブロック]> [ファセットブロックの名前]の[構成]リンクに移動します。例えば:

サービス
サービス/ *

ユーザーはドリルダウンできます。前に戻ることなく、ユーザーはファセットアイテムの選択を解除するだけで済みます。オプション「1つのアクティブなアイテムに制限する」は、私の経験に基づいて、現在設定されているとうまく機能しません。

0
liblogarian

これがこの問題に対する私の回避策です。コーディングは必要ありません。

  • 検索インデックスに基づいてビューを作成する
  • ファセットブロックをビューに追加し、必要なファセットフィールドを使用するように構成します。分類法ツリーがある場合は、すべての親の用語フィールドを使用してトップレベルのみを表示できます。
  • サイトに表示されるようにブロックを構成する

検索がアクティブになっているので、他のファセットブロックもどこにでもあります。必要に応じて、作成したブロックをcssで非表示にできます。

grts

フレデリックwbase

0
user26257