複数の条件を指定可能なウェブサイト内検索

ダイナミック・パブリッシングを利用して、データベース内をキーワード等で検索するテンプレートを作成できます。ウェブサイト内検索を動作させるためには、パラメタ付きリクエストをダイナミック・パブリッシングの対象にしておく必要があります。

サイト内検索テンプレートの作成手順

  • デバッグ・モードを有効にする
  • オブジェクトの一覧画面で、フィルタを作成して実行する
  • ポストされたパラメタのうち、_filterで始まるものを繋げる
  • オブジェクトを一覧表示するテンプレートを作成し、URLマップを「ファイル出力」を「ダイナミック*」にして作成する
  • 作成したページにパラメタを付けてアクセスする
  • ページ分割とページ送りを実装する

* .htaccessなどが適切に設定されている時、静的ページにパラメタ付きリクエストを送ってウェブサイト内検索とすることも可能です。

デバッグモードを有効にすると、管理画面の下部に発行しているSQL文やリクエストパラメタなどが表示されます。デバッグモードを有効にするには、config.jsonのconfig_settingsに以下の記述を追加します。

"debug" : true,

「ページ」モデルの一覧画面に移動します。画面上部の「フィルタ」をクリックして、条件を指定します。以下の例では「タイトル」「本文」に「テーマ」という文字列を含むページを検索するフィルタを作成しています。

一覧画面のフィルタの作成

フィルタを実行すると、以下の画像のようにページ下部に「Query Parameters」が表示されます。

フィルタの実行結果

このうち、_filter_idを除く、「_filter」から始まるパラメタを&で繋ぎます。

_filter=page&_filter_value_title[]=テーマ&_filter_cond_title[]=ct&_filter_value_text[]=テーマ&_filter_cond_text[]=ct

これが、そのまま一覧ページに渡す検索条件のパラメタになります。以下が実際のこのサイト内のドキュメントを当該条件で検索した結果となります。

https://powercmsx.jp/documentation/index.html?_filter=page&_filter_value_title[]=テーマ&_filter_cond_title[]=ct&_filter_value_text[]=テーマ&_filter_cond_text[]=ct

指定可能なパラメタ

各パラメタの役割は以下の通りです。

パラメタ 説明・値
_filter 検索するモデル名
_filter_value_[カラム名][] 検索するカラムに対する検索文字列や数値を指定します。配列(末尾に[]を付与)として指定してください。複数の値が渡せます。
_filter_cond_[カラム名][] 検索条件を指定します。ctはcontains(含む)となります。_filter_value_[カラム名][]に渡した値の数分指定の必要があります。
_filter_and_or_[カラム名] 「AND」または「OR」を指定可能です。管理画面のフィルタは常にAND検索となりますが、代わりにORを指定すると、OR検索となります(配列ではなく、1つのみ指定できます)。
_filter_and_or 複数のカラムを検索対象とするとき、AND検索かOR検索かを指定します(配列ではなく、1つのみ指定できます)。

指定可能な検索条件

パラメタ 説明
ct Contains (含む)
nc Not Contains (含まない)
gt Greater Than (より大きい)
lt Less Than (より小さい)
ge Greater than or Equal (以上)
le Less than or Equal (以下)
eq Equal (等しい)
ne Not Equal (等しくない)
bw Begin with (から始まる)
ew End with (で終わる)

AND検索とOR検索

デフォルトではAND検索となりますが、パラメタを追加することによってOR検索に変更できます。

_filter_and_or=OR

また、カラム毎のAND/OR指定は以下のようにして指定します。以下の例では「タイトル」をOR条件で検索する例です。

_filter_and_or_title=OR

マッチした件数とページネーション

テンプレート変数にマッチした件数やページネーションに利用可能な値が格納されます。また、offsetパラメタ、limitパラメタを追加することでスキップする件数や最大表示件数を指定することができます。詳細は「ページネーション」のページを参照してください。