検索アクション

検索アクション(search)は、公開サイト側に検索フォームを設置してコンテンツ(ページ・コレクション)を検索できるようにする機能です。 SQL の like を使って検索しますが、MySQL 5.7 以降を使っている場合には、全文検索を使用することもできます。

検索アクションを利用するためには、検索用のクエリを用意して、アクションタイプに search を指定したページコンテンツを設定します。 対象コンテンツの設定では、'search' => 1, を指定して検索用テーブルに検索用データを保存する設定にします。 検索用のテンプレートには、form要素を用意して検索キーワードを入力できるようにします。

設定

検索アクションを利用するためには、ページコンテンツタイプの設定項目 action に 'search' を指定します。 form 項目に検索フォームの入力部品情報を定義します。 options 項目にアクションの設定を定義します。

フォーム設定

項目 説明
inputs
'q' => [
  'label' => '検索ワード',
  'value' => '',
  'rule' => '',
],
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 検索モードを指定します。
like_and
like検索を行います。検索キーワードにスペースがある場合は、各単語をスペースで分割してそれぞれを and 条件で連結します。 search_modeの指定を省略した場合は、この like_and が選択されます。
like_or
like検索を行います。検索キーワードにスペースがある場合は、各単語をスペースで分割してそれぞれを or 条件で連結します。
fulltext
全文検索を行います。N-gram のインデックスを採用しているため、通常では1文字は検索対象外になりますが、スペース区切りで単語を分割して1文字の場合は * を後ろにつけるため、最後の1文字以外は検索対象になります。 検索は BOOLEAN MODE で行われます。複数キーワードを指定した場合は like 検索の or に近い挙動になりますが、検索スコアによって判断されるため、指定した単語を含むコンテンツが結果に表示されない場合もあります。
MySQL 5.7 以降の場合は全文検索を利用できます。MySQLが 5.6 の場合は fulltext は指定しないでください。 CMSインストール後にMySQLのバージョンを5.6から5.7にアップグレードした場合には fulltext index を別途作成しないと全文検索を利用することはできません。

クエリ設定ファイル(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 クラスは、ページネーションアクションの説明をご覧ください。