Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Oracle APEXでソーシャル・メディア・アプリケーションを作成しよう!

oracle4engineer
August 26, 2023
1.3k

Oracle APEXでソーシャル・メディア・アプリケーションを作成しよう!

2023年8月25日に日本オラクル株式会社本社にて実施したハンズオンの手順書です。

本ハンズオンはOracle LiveLabsに掲載されているBuild a Social Media App Using Oracle APEX!のハンズオンを日本語に翻訳したものです。

一部の設定や手順を変更しています。同じ手順ではありません。

apex.oracle.comよりワークスペースを取得して作業を行なうことを想定していますが、Autonomous Databaseやその他の環境でも、ほぼ同じ手順で作業が可能です。

oracle4engineer

August 26, 2023
Tweet

Transcript

  1. アジェンダ 1. Oracle APEXの始め方 2. Oracle APEXの紹介 Lab 1:APEXアプリケーションの新規作成 Lab

    2:データモデルの作成 Lab 3:APEXの開発ツールになれる Lab 4:ホーム・ページのカスタマイズ Lab 5:フォーム・リージョンの作成 Lab 6:カード・リージョンの作成 Lab 7:アクションを呼び出すボタンの作成 Lab 8:動的アクションの作成 Lab 9:⾒た⽬の改善 Lab 10:地図の追加 Lab 11:プッシュ通知の実装 Lab 12:HTML⽣成の仕組み 2 Copyright © 2023, Oracle and/or its affiliates
  2. 無料で始める方法は3通り 4 Copyright © 2023, Oracle and/or its affiliates 1.

    https://apex.oracle.com/go/request-workspaceから無料のワークスペースを取得します。 2. https://signup.cloud.oracle.com/よりOracle Cloudのアカウントを取得し、Always Freeの Autonomous Databaseのインスタンスを作成します。 3. Oracle Database Express Editionのインスタンスを作成し、Oracle APEXをインストールします。 https://apex.oracle.comにアクセスし、今日から無料で開始をクリックします。
  3. 無料のワークスペースの取得 • 以下を入力し、Request Workspaceをクリックします。 • 名(First name)、姓(Last name) • メールアドレス(Email)

    • 国(Your Location) • APEX使用経験の有無(Are you new to Oracle APEX?) • 授業や研修での使用かどうか(Do you plan to use APEX for education or training?) • 利用規約の承諾(I agree to the terms of the Oracle APEX Service Agreements) • 指定したメールアドレスにメールが届くので、Create Workspaceをクリックします。 • 検証用途に限定されています。 • 容量は50MBです。 • 不具合と思われる事象の再現ケースをOracle Supportと 共有するためにも使用できます。 • 利用できる機能の制限はほぼありません。 5 Copyright © 2023, Oracle and/or its affiliates
  4. Oracle CloudのAlways Free Autonomous Database • Oracle Cloud Free Tierのアカウントにサインアップします。

    • 通常、本人確認のためにクレジットカード番号の入力を求 められます。 • アカウントをアップグレードするまでは、クレジットカー ドに課金されることはありません。 • Always FreeのAutonomous Databaseは2インスタンスまで作 成できます。 • 1 OCPU(オーバーサブスクリプションあり) • 容量は20GBまで。 • 機能制限はありません。 • 文字や数値データのみ、少人数での利用であれば、実用に 耐える環境です。 参考: The story behind a COVID-19 exposure-tracking application in Finland https://blogs.oracle.com/database/post/covid-19-tracking-app-finland On the busiest day recorded, the application had 600,000 distinct users, and the peak period had 300,000 users in a two-hour period, which the application was able to handle quickly. 6 Copyright © 2023, Oracle and/or its affiliates
  5. Oracle Database 23c Free + Oracle APEX • Oracle Database

    23c Free – Developer Releaseがインス トールできる環境であれば、どこでも実装可能です。 • AWS、Google Cloud、MS Azure、VirtualBox、手元の LinuxやWindows(21c XE)マシンなど。 • Oracle Database 23c Free – Developer Releaseの制限 • CPUスレッド: 2 • ユーザー・データ: 12 GB • 利用可能なメモリ: 2 GB • 利用可能な機能に制限はありません。 • サポート契約がないため、パッチは適用できません。 • インストール、構成、管理を自分で行う必要がありま す。 • ライセンスについては、Oracle Free Use Terms and Conditionsを参照してください。 7 Copyright © 2023, Oracle and/or its affiliates REST Data Services、APEX、 Databaseが構成済みの VirtualBox仮想アプライアンスも提供されています。 https://www.oracle.com/database/technologies/databaseappdev-vm.html
  6. Oracle APEXとは? 9 Copyright © 2023, Oracle and/or its affiliates

    • Oracle Databaseで動作するエンタープライズ・アプリケーション向けのローコード・アプリケーショ ン・プラットフォーム(Low Code Application Platform – LCAP)です。 • アプリケーション開発ツール、各種ユーティリティ、アプリケーションの実行環境を含みます。 開発者が作成した アプリケーションの実行 開発を支援する 各種ユーティリティ アプリケーションを 開発するツール
  7. 概要 10 Copyright © 2023, Oracle and/or its affiliates すべての処理、データ操作およびビジネス・ロジックは、データベースで実行されます。

    WebブラウザからのHTTPリクエストはOracle REST Data Services (ORDS)に送信され、そこでア クション対象のOracle Databaseに渡されます。データベース内で、リクエストはOracle APEX によって処理されます。処理が完了すると、その結果はORDSを介してブラウザに戻されま す。
  8. ステートレス・アクセス 11 Copyright © 2023, Oracle and/or its affiliates POST

    /ords/wwv_flow.accept GET /ords/r/… Call wwv_flow.show(…) Call wwv_flow.accept(…) POST /ords/wwv_flow.ajax Call wwv_flow.ajax(…) ページの表示 フォームの送信 データの要求 セッションID Oracle REST Data Services (ORDS)は受け取ったURLとパラメータを引数に変えて、PL/SQLのプ ロシージャを呼び出します。セッションIDはつねにパラメータに含まれます。ORDSはス テートを保持しません。
  9. リファレンス・アーキテクチャ 12 Copyright © 2023, Oracle and/or its affiliates 参照(機械翻訳):

    https://docs.oracle.com/ja/solutions/deploy-ords-ha-oci/index.html Oracle REST Data Services(ORDS)は完全にステート レスであるため、ロード・バランサーの配下に複 数配置することで可用性を確保できます。 データベースの可用性は、Real Application Clusters(RAC)やData Guardの構成によって確保しま す。
  10. メタデータ駆動 13 Copyright © 2023, Oracle and/or its affiliates コンポーネント

    テンプレート SQL, PL/SQL セッション・ステート JavaScript, CSS メタデータ SELECT * FROM EMP SQLの実行結果をテンプレートに埋め込む (データベースにて実行)
  11. メタデータとは? Oracle APEXのすべてのデータ(ワークスペース、 アプリケーション、ページ、コンポーネント設 定、etc.)は、APEX_XX0X00(XX0X00はバージョ ン)スキーマに保存されています。 メタデータを参照するビューが提供されていま す。 アプリケーションID 140のページ2にある

    対話モード・レポートに含まれる列とその型を 一覧します。 14 Copyright © 2023, Oracle and/or its affiliates select region_name, form_label, column_type from APEX_APPLICATION_PAGE_IR_COL where application_id = 140 and page_id = 2 order by display_order
  12. Oracle APEXの開発ツールもOracle APEXのアプリケーション 15 Copyright © 2023, Oracle and/or its

    affiliates システム提供の メタデータ APEX_XX0X00スキーマ ユーザー データ アプリケーションの メタデータ ユーザーのスキーマ PL/SQLライブラリ Oracle APEXの開発ツール ユーザーが開発したアプリケーション
  13. はじめに • 本ハンズオンはOracle LiveLabsに掲載されているBuild a Social Media App Using Oracle

    APEX!のハンズオン を日本語に翻訳したものです。 • 一部の設定や手順を変更しています。同じ手順ではありません。 • apex.oracle.comよりワークスペースを取得して作業を行なうことを想定していますが、Autonomous Databaseやその他の環境でも、ほぼ同じ手順で作業が可能です。 Build a Social Media App Using Oracle APEX! https://apexapps.oracle.com/pls/apex/r/dbpm/livelabs/view-workshop?wid=3620 SQL, JavaScriptなどのコピペ用スニペット https://apex.oracle.com/pls/apex/r/japancommunity/simcontents/download?id=apex-social-media- handson-snippet.txt 16 Copyright © 2023, Oracle and/or its affiliates [Date]
  14. Oracle APEXの開発環境にサインインします 1. ワークスペース名を入力します。 2. ユーザー名を入力します。 3. パスワードを入力します。 4. サインインをクリックします。

    apex.oracle.comのワークスペースはあらかじめ取 得しておきます。 19 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4
  15. アプリケーション作成ウィザードが開きます 初期アプリケーションを作成します。 1. アイコンをクリックして変更します。(手順 は後続ページ) 2. 名前はAPEXソーシャルメディアとします。 3. 編集をクリックしページ名をタイムラインに 変更します。(手順は後続ページ)

    4. 機能よりプログレッシブWebアプリケーショ ンのインストールをチェックします。 5. アプリケーションの作成をクリックします。 23 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5
  16. クイックSQLのモデルを記述します 36 Copyright © 2023, Oracle and/or its affiliates [Date]

    # prefix: sm # apex: true # auditcols: true posts post_comment vc4000 photo file lat num lon num post_owner vc80 /nn post_date reactions post_id /fk posts reaction vc16 reaction_owner vc80 /nn reaction_date lat num lon num # prefix: sm # apex: true # auditcols: true posts post_comment vc4000 photo file lat num lon num post_owner vc80 /nn post_date reactions reaction vc16 reaction_owner vc80 /nn reaction_date lat num lon num 親子関係の定義方法が 異なりますが、同じDDLが 生成されます。
  17. モデルから表を作成するSQLスクリプト(DDL)を生成します 1. クイックSQLのモデルを入力します。 2. SQLの生成をクリックします。 37 Copyright © 2023, Oracle

    and/or its affiliates [Date] # prefix: sm # apex: true # auditcols: true posts post_comment vc4000 photo file lat num lon num post_owner vc80 /nn post_date reactions reaction vc16 reaction_owner vc80 /nn reaction_date lat num lon num 1 2
  18. 制約を作成します 1. 制約のタイプとして一意を選択します。 2. 一意列1としてPOST_IDを選択します。 3. 一意列2としてREACTION_OWNERを選択しま す。 4. 適用をクリックします。

    制約の名前はデフォルトのSM_REACTIONS_CONに なります。一般的には制約名は開発規約に従って 命名します。 表SM_REACTIONSに列POST_ID、REACTION_OWNER での一意制約が作成されます。実行されるSQLは 以下です。 alter table "WKSP_QFDA23411"."SM_REACTIONS" add constraint "SM_REACTIONS_CON" unique ( "POST_ID", "REACTION_OWNER" ); 48 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4
  19. APEXのワークスペース・スキーマとデータを保存するスキーマは分けること を推奨します • Oracle APEXでは、アプリケーションの設計情報 (誰がどのようなアプリケーションを作った のか)、稼働情報(作成されたアプリケー ションがどの程度使用されているのか)と いった情報がリレーショナル・データベース に保存されています。

    • APEXが提供しているビューを検索すること で、それらの情報を確認できるため、アプリ ケーション開発の統制を取りやすいです。 • 単純にgrant文によるアクセス制御を行う場合 を含め、Database Vault、仮想プライベート・ データベース、Real Application Security、Data RedactionといったOracle Databaseが提供してい るセキュリティ機能の適用を検討している場 合は、APEXのワークスペース・スキーマ(ア プリケーションが動作しているスキーマ)と は別にデータを保存するスキーマを作成する ことを勧めます。 • リレーショナル・データベースに作成した表 やビューなどのオブジェクトはディクショナ リから参照できるため、アプリケーション開 発の統制をを取りやすいです。 50 Copyright © 2023, Oracle and/or its affiliates [Date]
  20. Lab 5:フォーム・リージョンの作成 59 Copyright © 2023, Oracle and/or its affiliates

    [Date] 写真にコメントを付けて投稿するフォームを作成します。
  21. 不要なページ・アイテムをコメント・アウトします ユーザーによるデータ入力の対象外のページ・ア イテムをコメント・アウトします。 1. ページ・アイテムP1_PHOTO_FILENAME、 P1_PHOTO_MIMETYPE、P1_PHOTO_CHARSET、 P1_PHOTO_LASTUPD、P1_CREATED、 P1_CREATED_BY、P1_UPDATED、 P1_UPDATED_BYを選択します。 2.

    ビルド・オプションをコメント・アウトに変 更します。 ページ・アイテムを削除すると、列の同期化を実 行すると削除したページ・アテイムが再度作成さ れます。コメント・アウトはページ・アイテムは 存在しない扱いですが、列の同期化で再作成はさ れません。 65 Copyright © 2023, Oracle and/or its affiliates [Date] 1 1 2
  22. 写真を投稿できるようにします 1. ページ・アイテムP1_PHOTOを選択します。 2. 属性として以下を設定します。 タイプ:ファイル参照… ラベル:写真 表示形式:Block Dropzone ドロップ・ゾーンのタイトル:投稿する写真を選ぶ

    記憶域タイプ:BLOB column specified in Item Source attribute MIMEタイプ列:PHOTO_MIMETYPE ファイル名列:PHOTO_FILENAME 文字セット列:PHOTO_CHARSET BLOB最終更新列:PHOTO_LASTUPD ダウンロード・リンクの表示:オフ ファイルタイプ:image/* 最大ファイル・サイズ:10000 70 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 2 2 2
  23. 投稿フォームをインライン・ダイアログにします 1. リージョン投稿を選択します。 2. レイアウトの位置をDialogs, Drawers and Popupsに変更します。 3. 外観のテンプレートをInline

    Dialogに変更しま す。 4. テンプレート・オプションをクリックして開 きます。 Dialogs, Drawers and Popupsに配置されたリージョ ンは、デフォルト状態では非表示になります。 74 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4
  24. テンプレート・オプションを調整します 1. Auto Heightにチェックを入れます。 2. SizeはMedium (600x400)を選択します。 3. Heading LevelにH1を選択します。

    4. OKをクリックします。 見た目の調整はいつでも可能です。 75 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4
  25. 投稿を始めるボタンにします 1. 新規に作成されたボタンを選択します。 2. ボタンの属性として以下を設定します。 ボタン名:ADD_POST ラベル:投稿します 位置:After Logo ボタン・テンプレート:Text

    with Icon CSSクラス:new-post-button アイコン:fa-plus 動作/アクション:動的アクションで定義 78 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 2 2 2 2
  26. 投稿フォームを開くアクションを設定します 1. 新規に作成されたTRUEアクション(この時点 では表示)を選択します。 2. 識別の名前として投稿ダイアログを開くを設 定します。 3. アクションとしてリージョンを開くを選択し ます。

    4. 影響を受ける要素の選択タイプとしてリー ジョンを選びます。 5. リージョンとして投稿を選択します。 6. 保存と実行をクリックして、今までの作業結 果を確認します。 81 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 6
  27. ボタンの属性を設定します 1. 新規に作成されたボタンを選択します。 2. 以下のプロパティをボタンに設定します。 ボタン名:SAVE ラベル:投稿 位置:Next ホット:オン CSSクラス:post-button

    動作/アクション:動的アクションで定義 データベース・アクション:SQL INSERT操作 3. テンプレート・オプションを開きます。 84 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 2 2 2 2 2 3
  28. 投稿を保存する動的アクションのプロパティを設定します 1. 作成された動的アクション(この時点では新 規)を選択します。 2. 名前は投稿ボタンをクリックとします。 3. クライアント側の条件としてJavaScript式を選 択します。 4.

    JavaScript式として以下を記述します。 タイミングのイベントはデフォルトのクリックで す。 クライアント側の条件は写真かコメントのどちら かが設定されていないと、ボタンを押しても投稿 しない、という意味です。 87 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 apex.items.P1_PHOTO.value.length > 0 || apex.items.P1_POST_COMMENT.value.length > 0
  29. 投稿された内容をデータベースに保存します 1. 新規に作成されたプロセスを選択します。 2. 識別のタイプとしてフォーム – 行の自動処理 (DML)を選択します。 3. フォーム・リージョンに投稿を選択します。

    4. 名前は投稿の保存とします。 5. 成功メッセージとして投稿しました!を設定 します。 6. サーバー側の条件のボタン押下時にSAVEを選 択します。 90 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 6
  30. 投稿者と投稿日を設定するプロセスを作成します。 1. 先ほどと同様にプロセスを作成し、プロセス 投稿の保存の上に配置します。 2. 識別のタイプはコードを実行です。 3. 名前は投稿者と投稿日の設定とします。 4. ソースのPL/SQLコードとして以下を記述しま

    す。 5. サーバー側の条件のボタン押下時にSAVEを設 定します。 6. 以上で投稿フォームは完成です。保存と実行 をクリックします。 91 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 :P1_POST_OWNER := :APP_USER; :P1_POST_DATE := sysdate; 6
  31. Lab 6:カード・リージョンの作成 96 Copyright © 2023, Oracle and/or its affiliates

    [Date] 投稿された写真とコメントをカードとして一覧します。
  32. カード・リージョンのプロパティを設定します 1. 新規に作成されたリージョンを選択します。 2. 識別の名前はタイムラインとします。 3. タイプとしてカードを選択します。 4. ソースのタイプをSQL問合せに変更します。 5.

    SQL問合せとして以下を記述します。 98 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 select p.id, p.post_owner AS user_name, p.post_comment AS comment_text, p.photo, p.photo_mimetype, p.photo_lastupd, apex_util.get_since(p.post_date) post_date, ( select count(*) from SM_REACTIONS smr where smr.post_id=p.id ) as REACTIONS, ( select 'user-has-liked' from SM_REACTIONS smr where smr.post_id=p.id and smr.reaction_owner=:APP_USER ) USER_REACTION_CSS from SM_POSTS p order by p.post_date desc
  33. カード・リージョンの属性を設定します(写真) 1. メディアの属性を以下のように設定します。 ソース:BLOB列 BLOB列:PHOTO 位置:最初 外観:ワイドスクリーン サイズ指定:カバー CSSクラス:selectDisable イメージの説明:&COMMENT_TEXT.

    2. BLOB属性を以下のように設定します。 MIMEタイプ列:PHOTO_MIMETYPE 最終更新列:PHOTO_LASTUPD 3. 保存と実行をクリックします。 102 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3
  34. Lab 7:アクションを呼び出すボタンの作成 105 Copyright © 2023, Oracle and/or its affiliates

    [Date] カード上に投稿にいいねをするボタンと投稿の削除を行なうボタンを作成します。
  35. 呼び出されるJavaScriptのアクションを指定します 1. URLとして#action$like?id=&ID.を設定します。 2. OKをクリックします。 Oracle APEXは、 apex.actionというJavaScriptを実行 するフレームワークを提供しています。 このapex.actionに、likeという名前で作成したアク

    ションを、引数idとして&ID.(列IDの値)を渡し て呼び出します。 このAPEXアクションのlikeは、後の手順で作成し ます。そのため、現時点ではいいねボタンを押し ても、likeアクションが未定義のためエラーが発 生します。 109 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2
  36. 削除ボタンを作成します 1. カードにアクションを作成します。 2. ラベルを削除とします。 3. レイアウトの位置に2次を選びます。 4. リンクのタイプにURLにリダイレクトを選びま す。

    5. ターゲットに#action$delete?id=&ID.を設定しま す。 6. 外観の表示タイプとしてアイコンを選びま す。 7. アイコンとしてfa-trash-oを設定します。 112 Copyright © 2023, Oracle and/or its affiliates [Date] 2 3 4 5 6 7 1
  37. 削除ボタンの表示条件を設定します 1. サーバー側の条件のタイプとして式を選択し ます。 2. 言語としてPL/SQLを選択します。 3. PL/SQL式として:USER_NAME=:APP_USERを設定 します。 4.

    実行条件として各行を選択します。 5. 保存と実行をクリックします。 削除ボタンは、その投稿をした人にだけ表示され ます。他人の投稿に削除ボタンは表示されませ ん。 113 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5
  38. apex.actionとしてlikeとdeleteを作成します 115 Copyright © 2023, Oracle and/or its affiliates [Date]

    apex.actions.add([ { name: "like", action: (event, element, args) => { apex.items.P1_ACTION_ID.value = args.id; apex.event.trigger(document, 'action-like'); } }, { name: "delete", action: (event, element, args) => { apex.items.P1_ACTION_ID.value = args.id; apex.event.trigger(document, 'action-delete'); } } ]);
  39. Lab 8:動的アクションの作成 121 Copyright © 2023, Oracle and/or its affiliates

    [Date] いいねボタンと削除ボタンをクリックしたときに呼び出される動的アクションを作成します。
  40. カード上のいいねボタンを変更します(jQuery版) 126 Copyright © 2023, Oracle and/or its affiliates [Date]

    const button = $('[data-id="'+ apex.items.P1_ACTION_ID.value +'"] .js-heart-button'); // get the card const label = button.find('.a-CardView-buttonLabel'); // get the likes count section const icon = button.find('.a-CardView-buttonIcon'); // gets the element if its liked already let likeCount = label.text(); // get the like count if (icon.hasClass('user-has-liked')) { // user has liked this already, and they are unliking it now -- decrement label.text(--likeCount); } else { // user is liking the post -- increment label.text(++likeCount); } icon.toggleClass('user-has-liked'); // either add this class or remove it
  41. JavaScript版のコードです 127 Copyright © 2023, Oracle and/or its affiliates [Date]

    const button = document.querySelector('[data-id="' + apex.items.P1_ACTION_ID.value +'"] .js-heart-button'); // get the card const label = button.querySelector(".a-CardView-buttonLabel"); // get the likes count section const icon = button.querySelector(".a-CardView-buttonIcon"); // gets the element if its liked already let likeCount = label.textContent; if (icon.classList.contains("user-has-liked")) { // user has liked this already, and they are unliking it now -- decrement label.textContent = --likeCount; } else { // user is liking the post -- increment label.textContent = ++likeCount; } icon.classList.toggle("user-has-liked"); // either add this class or remove it
  42. TRUEアクションを設定します 1. 作成済みのTRUEアクション(この時点では表 示)を選択します。 2. 識別の名前をいいね – UIの更新(件数 + ハート

    の色)とします。 3. アクションとしてJavaScriptコードの実行を選 択します。 4. 設定のコードに前出のコードを記述します。 128 Copyright © 2023, Oracle and/or its affiliates [Date] 2 3 4 1
  43. データベースに保存されているいいねの数を更新します 129 Copyright © 2023, Oracle and/or its affiliates [Date]

    begin -- try to store this posts' reaction from this user insert into SM_REACTIONS (post_id, reaction, reaction_owner, reaction_date, lat, lon) values (:P1_ACTION_ID, 'LIKED', :APP_USER, sysdate, :P1_LAT, :P1_LON); exception when dup_val_on_index then -- remove it as it already existed delete from SM_REACTIONS where post_id=:P1_ACTION_ID and reaction_owner=:APP_USER; end;
  44. データベースに保存されているいいねの数を更新します 1. 作成されたTRUEアクション(この時点では表 示)を選択します。 2. 識別の名前はいいね – DBの処理とします。 3. アクションとしてサーバー側のコードを実行

    を選択します。 4. 設定の言語はPL/SQLです。 5. PL/SQLコードに前出のコードを記述します。 6. 送信するアイテムとしてP1_ACTION_ID、 P1_LAT、P1_LONを指定します。 7. 保存と実行をクリックします。 131 Copyright © 2023, Oracle and/or its affiliates [Date] 2 1 3 4 5 6 7
  45. 動的アクションのプロパティを設定します 1. 新規に作成された動的アクション(この時点 では新規)を選択します。 2. 識別の名前はaction-deleteとします。 3. タイミングのイベントはカスタムです。 4. カスタム・イベントとしてaction-deleteを指定

    します。 5. 選択タイプはJavaScript式です。 6. JavaScript式としてdocumentを記述します。 apex.actionのdeleteで発行される以下のイベント が、この動的アクションで処理されます。 136 Copyright © 2023, Oracle and/or its affiliates [Date] 2 3 4 5 6 apex.event.trigger(document, 'action-delete'); 1
  46. 確認ダイアログを開くようにTRUEアクションを設定します 1. 作成済みのTRUEアクション(この時点では表 示)を選択します。 2. 識別の名前は削除 – 確認ダイアログとしま す。 3.

    アクションとして確認を選択します。 4. 設定のタイトルは確認とします。 5. メッセージは投稿を削除しようとしていま す。本当に削除しますか?とします。 確認のダイアログが開き、OKをクリックしたとき のみ、後続のTRUEアクションが実行されます。 137 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5
  47. 表SM_POSTSから投稿を削除します 1. 新たに作成されたTRUEアクション(この時点 では表示)を選択します。 2. 識別の名前は削除 – DBの処理とします。 3. アクションとしてサーバー側のコードを実行

    を選択します。 4. 設定の言語はPL/SQLとします。 5. PL/SQLコードとして以下を記述します。 6. 送信するアイテムにP1_ACTION_IDを設定しま す。 139 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 6 delete from SM_POSTS where id=:P1_ACTION_ID and post_owner=:APP_USER;
  48. ページ上のカードを削除します 1. 新たに作成されたTRUEアクション(この時点 では表示)を選択します。 2. 識別の名前は削除 – カードの削除とします。 3. アクションとしてJavaScriptコードの実行を選

    択します。 4. 設定のコードに以下を記述します。 またはjQueryを使わず 5. 保存と実行をクリックします。 141 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 $('[data-id="' + apex.items.P1_ACTION_ID.value + '"]').remove(); 5 document.querySelector('[data-id="' + apex.items.P1_ACTION_ID.value + '"]').remove();
  49. Lab 9:⾒た⽬の改善 146 Copyright © 2023, Oracle and/or its affiliates

    [Date] CSSの追加やレイアウトを調整して見た目を改善します。
  50. 以下のCSSの記述を追加します 147 Copyright © 2023, Oracle and/or its affiliates [Date]

    .user-has-liked { color: red; } @media (max-width: 640px) { .new-post-button { position: fixed; bottom: 24px; right: 24px; z-index: 1000; } }
  51. 写真の投稿を変更します 1. ページ・アイテムP1_PHOTOを選択します。 2. 外観のテンプレートをHiddenに変更します。 3. CSSクラスにfile-uploadを指定します。 4. アイコンにfa-camera-retroを指定します。 5.

    レイアウトのラベル列スパンとして0を指定し ます。 6. テンプレート・オプションを開きます。 150 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 6 5
  52. Lab 10:地図の追加 154 Copyright © 2023, Oracle and/or its affiliates

    [Date] 投稿やいいねをした地点を地図上に表示します。
  53. マップ・リージョンを配置します 中央ペインの下部にあるコンポーネント・パレッ トより、マップ・リージョンをページに配置しま す。 1. 中央ペインでレイアウトを表示します。 2. 左ペインを閉じます。 3. 右ペインを閉じます。

    4. コンポーネント・パレットの領域を広げま す。 5. コンポーネントとしてリージョンを選択しま す。 6. マップを掴みます。 155 Copyright © 2023, Oracle and/or its affiliates [Date] 2 3 1 4 5 6
  54. マップのソースとなるSQLを設定します 1. 作成されたマップ・リージョン(この時点で は新規)を選択します。 2. 識別のタイトルは投稿といいねの地点としま す。 3. ソースの位置としてローカル・データベース を選択します。

    4. タイプにSQL問合せを選択します。 5. SQL問合せに以下を記述します。 158 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 select distinct lat, lon, user_name, apex_util.get_since(cdate) as since from ( select lat, lon, post_owner as user_name, post_date as cdate from SM_POSTS union select lat, lon, reaction_owner as user_name, reaction_date as cdate from SM_REACTIONS )
  55. レイヤーを設定します 1. 作成済みのレイヤー(この時点では新規)を 選択します。 2. 識別の名前は地点とします。 3. ソースの位置としてリージョン・ソースを選 択します。 4.

    列のマッピングのジオメトリ列のデータ型と して経度/緯度を選択します。 5. 経度列としてLONを選択します。 6. 緯度列としてLATを選択します。 160 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 6
  56. マップを開くエントリーを追加します 1. エントリの追加をクリックします。 2. 順序に15を入力します。 3. 名前に地図を入力します。 4. ターゲットに#action$open-mapを入力します。 5.

    アイコンにfa-mapを入力します。 6. 変更の適用をクリックします。 166 Copyright © 2023, Oracle and/or its affiliates [Date] 2 1 3 4 5 6
  57. apex.actionの定義です 169 Copyright © 2023, Oracle and/or its affiliates [Date]

    1 apex.actions.add([ { name: "like", action: (event, element, args) => { apex.items.P1_ACTION_ID.value = args.id; apex.event.trigger(document, 'action-like'); } }, { name: "delete", action: (event, element, args) => { apex.items.P1_ACTION_ID.value = args.id; apex.event.trigger(document, 'action-delete'); } }, { name: "open-map", action: () => { apex.event.trigger(document, 'action-open-map'); } } ]);
  58. 動的アクションのプロパティを設定します 1. 作成された動的アクション(この時点では新 規)を選択します。 2. 識別の名前はaction-open-mapとします。 3. タイミングのカスタム・イベントとして action-open-mapを指定します。 4.

    選択タイプとしてJavaScript式を選びます。 5. JavaScript式としてdocumentを指定します。 APEXアクションopen-mapの以下の記述より呼び 出される動的アクションです。 171 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 apex.event.trigger(document, 'action-open-map');
  59. TRUEアクションで地図を開きます 1. 作成済みのTRUEアクション(この時点では表 示)を選択します。 2. 識別の名前は地図を開くとします。 3. アクションとしてリージョンを開くを選択し ます。 4.

    影響を受ける要素の選択タイプとしてリー ジョンを選びます。 5. リージョンとして投稿といいねの地点を選び ます。 172 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5
  60. TRUEアクションを設定します 1. 作成済みのTRUEアクション(この時点では表 示)を選択します。 2. 識別のアクションとして現在の位置の取得を 選択します。 3. 設定の戻り型としてLatitude and

    Longitudeを選 択します。 4. 緯度アイテムとしてP1_LATを指定します。 5. 経度アイテムとしてP1_LONを指定します。 以上でアプリケーションは完成です。 6. 保存と実行をクリックします。 177 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 6
  61. プッシュ通信を実行します 193 Copyright © 2023, Oracle and/or its affiliates [Date]

    declare l_count number; l_push_to sm_posts.post_owner%type; l_title varchar2(80); begin select count(*) into l_count from sm_reactions where post_id=:P1_ACTION_ID and reaction_owner=:APP_USER; if l_count = 0 then -- いいねの解除なので通知しない。 return; end if; select post_owner into l_push_to from sm_posts where id = :P1_ACTION_ID; l_title := :APP_USER || 'さんがいいねしました。'; apex_pwa.send_push_notification( p_user_name => l_push_to ,p_title => l_title -- body, icon, target_urlの設定は省略。 ); -- apex_pwa.push_queue; end;
  62. TRUEアクションを定義します 1. 作成されたTRUEアクション(この時点では表 示)を選択します。 2. 識別の名前をプッシュ通知の送信とします。 3. アクションとしてサーバー側のコードを実行 を選択します。 4.

    PL/SQLコードに前出のコードを記述します。 5. 送信するアイテムにP1_ACTION_IDを指定しま す。 以上でプッシュ通知の実装は完了です。 6. 保存と実行をクリックします。 194 Copyright © 2023, Oracle and/or its affiliates [Date] 1 2 3 4 5 6
  63. Our mission is to help people see data in new

    ways, discover insights, unlock endless possibilities.