検索アクション(search)は、公開サイト側に検索フォームを設置してコンテンツ(ページ・コレクション)を検索できるようにする機能です。 SQL の like を使って検索しますが、MySQL 5.7 以降を使っている場合には、全文検索を使用することもできます。
検索アクションを利用するためには、検索用のクエリを用意して、アクションタイプに search を指定したページコンテンツを設定します。 対象コンテンツの設定では、'search' => 1, を指定して検索用テーブルに検索用データを保存する設定にします。 検索用のテンプレートには、form要素を用意して検索キーワードを入力できるようにします。
検索アクションを利用するためには、ページコンテンツタイプの設定項目 action に 'search' を指定します。 form 項目に検索フォームの入力部品情報を定義します。 options 項目にアクションの設定を定義します。
フォーム設定
項目 | 例 | 説明 |
---|---|---|
inputs |
|
inputs のキーには検索キーワードを指定する検索フォームのinput部品のnameを指定します。 |
オプション設定
項目 | 例 | 説明 |
---|---|---|
query | store_search | クエリ設定ファイルのクエリ名を指定します。 |
route | /store/search_{page_no}.html | 2ページ目以降のパスを定義します。パスに {page_no} を定義してページ番号を受け取れるようにします。 |
per_page | 15 | 1ページに表示する対象コンテンツ数を指定します。無指定の場合のデフォルト値は15です。 |
mid_size | 7 | ページ送りリンクの中央部分のリンク数を指定します。 |
end_size | 1 | ページ送りリンクの前端・後端部分のリンク数を指定します。 |
current_class | active | 現在ページを示すためのクラス名を指定します。 |
link_class | link | ページ番号リストにリンクがある場合のクラス名を指定します。 |
ellipsis_class | disabled | ページ番号リストの範囲外のページを省略していること示すクラス名を指定します。 |
ellipsis_text | ... | ページ番号リストの範囲外のページを省略していること表すテキストを指定します。 |
設定例:検索アクションのコンテンツ
'store_search' => [
'label' => '店舗検索',
'outline' => '店舗検索ページです。',
'dir' => '/store/',
'action' => 'search',
'form' => [
'inputs' => [
'q' => [
'label' => '検索ワード',
'value' => '',
'rule' => '',
],
],
],
'options' => [
'query' => 'store_search',
'route' => '/store/search_{page_no}.html',
'per_page' => 2,
],
'fields' => [
'content' => [
'label' => 'コンテンツ',
'type' => 'content',
],
],
],
検索対象コンテンツで検索用データを保存する指定をする例:
'store' => [
'label' => '店舗',
'outline' => '店舗を管理します。',
// ...省略
'search' => 1,
],
検索アクションで利用するクエリをクエリ設定ファイルに定義します。 検索用クエリでは、type, base_type の基本的なオプション以外に、search, search_mode を指定します。 typeに指定したコンテンツは search => 1, を指定して検索用テーブルにデータが保存されるように設定しておく必要があります。
オプション設定
項目 | 例 | 説明 |
---|---|---|
search | {q} | 検索キーワードを指定します。クエリのクエリパラメータ機能を利用するためプレースホルダを指定します。 |
search_mode | like_and |
検索モードを指定します。
|
クエリ設定ファイル(query.php)の設定例:
'product_search' => [
'type' => 'product_item',
'base_type' => 'page',
'search' => '{q}',
'search_mode' => 'like_and',
],
テンプレートに検索キーワードを入力するためのフォームを定義します。
検索結果はページネーションされるため、pagination変数から情報を取り出すことができます。
<form action="/store/search.html" method="POST">
{{ include('core/views/partials/csrf.twig') }}
<div class="form-group">
<label for="word">キーワード検索</label>
<input type="text" id="q" name="q" class="form-control" value="{{ form.get('q') }}" placeholder="店舗名や住所などを入力">
</div>
<button type="submit" class="btn btn-primary">検索</button>
</form>
{% if pagination.total > 0 %}
<table class="table table-bordered mt-3">
<thead>
<tr>
<th>店舗名</th>
<th>住所 / 電話番号</th>
<th>営業時間</th>
<th>お知らせ</th>
</tr>
</thead>
<tbody>
{% for item in pagination.items %}
<tr>
<td><a href="{{ url_for('store_detail', {'store_code': item.fields.store_code.text}) }}">{{ item.name }}</a>
</td>
<td>
{{ field('address', item) }}<br>
電話番号:{{ field('tel', item) }}
</td>
<td>{{ field('hours', item) }}</td>
<td>{{ field('information', item) }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endif %}
{{ include('core/views/partials/pagination.twig') }}
検索結果はページネーションされます。ページ送り部品テンプレートとPagination クラスは、ページネーションアクションの説明をご覧ください。