2021年3月31日水曜日

ファセットに指定があるときに限りリージョンを表示する

 検索ボックスのみのファセットで、値が指定されているときだけ検索結果のリージョンを表示したい、という相談があり、ちょっと実装してみました。

ファセットの項目はページ・アイテムではないのですが、JavaScript APIのapex.itemを使うことで値を取得できました。これをクライアント側の条件に指定することによって、リージョンの表示/非表示を切り替えます。

確認するためにアプリケーションを作成しました。以下より、その作業ログになります。

サンプル・データセットのEMP/DEPTを元に、ファセット検索のページを作成します。

最初に空のアプリケーションを作成します。アプリケーション・ビルダーより、アプリケーション作成ウィザードを実行します。名前は任意ですが、ここでは領域の表示/非表示としています。それ以外は追加の設定をせずに、アプリケーションの作成を実行します。

アプリケーションが作成されたら、ファセット検索のページを作成します。ページの作成をクリックします。


コンポーネントレポートをクリックします。


ファセット検索をクリックします。


ページ名従業員検索とし、ブレッドクラムBreadcrumbを選択します。に進みます。


ナビゲーションのプリファレンスとして新規ナビゲーション・メニュー・エントリの作成を選択します。これでナビゲーション・メニューからファセット検索のページを開くことができるようになります。に進みます。

データ・ソースの設定では、表/ビューの名前としてEMP (表)を選択します。今回は文字列の検索ボックスのみを使うので、ファセットのチェックはすべて外します作成をクリックします。ファセットを選択する部分は画面の下に隠れているはずなので、画面を広げるか、またはスクロールさせて表示させます。


ファセット検索のページが作成されるので、実行してみます。最初に表示されるページでは、検索ボックスに指定がないため、表EMPの全件が表示されます。


検索ボックスに文字列を入力して実行をすると、検索結果が絞り込まれます。このときだけリージョンを表示する、という設定を行います。

ページ・デザイナにてファセット検索のページを開きます。ファセット検索のリージョンで動的アクションの作成を実行します。


作成した動的アクションの名前は任意ですが、ここでは検索結果の表示としています。タイミングイベントファセット変更[ファセット検索]選択タイプリージョンリージョン検索を選択します。

クライアント側の条件として、タイプJavaScript式を選択し、JavaScript式に以下を指定します。

apex.item("P2_SEARCH").getValue() != ""

検索ボックスのファセット名がP2_SEARCHなので、それをapex.itemに渡しています。そのファセットの値が空文字列""でなければ、Trueアクションを実行します。

Trueアクションとして、表示を選択します。影響を受ける要素選択タイプリージョンを選び、リージョンとして、検索結果のリージョンである検索結果を選択します。ページが開いた時にも評価されるように、初期化時に実行ONにします。


 リージョンの表示を行うアクションを作成したので、反対に非表示にするアクションを作成します。表示のアクション上でコンテキスト・メニューを表示させ、その中から反対のアクションの作成を実行します。


検索結果のリージョンを非表示するFalseアクションが作成されます。


以上で今回の実装は完了です。作成したアプリケーションを実行すると、最初のGIF動画のような動作を確認することができます。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/showfacetsearchregion.sql

Oracle APEXのアプリケーション開発の参考になれば幸いです