2022年8月2日火曜日

CKEditor5による画像アップロードを実装する(1) - 準備

Louis MoreauxさんがCKEditor5の画像アップロードを行う方法を、CKEditor5 Image Uploadという記事にしていました。Oracle APEX 22.1から使用できます。この機能を使って、画像を含んだ文書の編集を行うアプリケーションを作成してみます。

Oracle APEX 23.1より、リッチ・テキスト・エディタはCKEditor5からTinyMCEに置き換えられています。本記事ではCKEditor5を使った画像アップロードを実装します。

作成するアプリケーションは、以下のような動作になります。機能の実装を目的としていて、細かいユーザー・インターフェースの調整などは省略しています。


元記事の説明は、根幹となる機能の実装方法に限られています。そのため、元記事だけで完全なアプリケーションを作るのは難しいです。できるだけ、手順を追えば同じアプリケーションを作成できるように説明します。


文書と画像を保存する表を作成する



文書を保存する表RTE_DOCUMENTSと画像を保存する表RTE_IMAGESを作成します。表の作成にはクイックSQLの以下のモデルを使います。
# prefix: rte
# pk: guid
documents /auditcols
    title    vc200
    content  clob
    author   vc80
    published date
    
images
    document_id /fk documents
    content_type vc200
    image blob
    created date /nn
    created_by vc255 /nn
SQLワークショップユーティリティクイックSQLを開きます。左側に上記のモデルを記述し、SQLの生成SQLスクリプトを保存レビューおよび実行を順番に実施します。


SQLスクリプトのレビュー画面が開きます。

クイックSQLの不具合だと思われますが、監査列の生成を指定していないにも関わらず、列にCREATED、CREATED_BYが含まれていると、対応したトリガーを作成するCREATE TRIGGER文が生成されます。このトリガーrte_images_biuは不要なので、create trigger文を削除します。

[2024年10月9日追記]
APEX 24.1.5で確認したところ、クイックSQLでトリガーrte_images_biuは作成しなくなりましたが、表rte_imagesの列created_byの型がdateになってしまいます。DDLを実行する前にvarchar2(255 char)に変更する必要があります。

SQLスクリプトの修正後、実行をクリックします。


確認画面が開きます。即時実行をクリックします。


4行の実行が成功し、エラーがなければ表RTE_DOCUMENTSとRTE_IMAGESが問題なく作成されています。


表の作成は以上で完了です。


基本的なアプリケーションを作成する



作成した表RTE_DOCUMENTS、RTE_IMAGESの基本的な操作を行うアプリケーションを作成します。Oracle APEXのアプリケーション作成ウィザードを実行します。

アプリケーションの名前画像付き文書とします。ホーム編集をクリックして開き、削除します。


ホーム・ページの編集画面です。削除をクリックします。確認のダイアログが表示されるので、OKをクリックします。


表RTE_DOCUMENTSを一覧するレポートのページと、編集を行うフォームのページを作成します。ページの追加をクリックします。


対話モード・レポートを選択します。


対話モード・レポートのページ名画像付き文書とします。表またはビュー対話モード・レポートを選択します。

表またはビューとしてRTE_DOCUMENTSを選択し、フォームを含めるチェックを入れます。詳細ホームページとして設定チェックが入っていることを確認します。

以上で、ページの追加をクリックします。


表RTE_IMAGESのメンテナンスを行う画面を追加します。エンド・ユーザーがこの画面を使用する予定はありません。

先ほどと同様に、ページの追加をクリックします。


追加ページを開いて、複数のレポートを選択します。


表名の一覧より、RTE_IMAGESのみにチェックをいれます。ページの追加をクリックします。


追加されたページImages編集をクリックします。


詳細を開き、管理ページとして設定チェックを入れます。以上で、変更の保存をクリックします。


ページImagesのアイコンがスパナに変わります。

以上のページ構成で、アプリケーションの作成を実行します。


アプリケーションが作成されます。これから色々な機能を実装するページは、ページ番号画像付き文書と、Documentです。




アプリケーションを調整する



監査列のコメント・アウトと、フォームに含まれるページ・アイテムのレイアウトを調整します。

ページ番号の対話モード・レポートのページを開き、列CREATEDCREATED_BYUPDATEDUPDATED_BYを選択します。その後にプロパティ・エディタの構成ビルド・オプションとしてコメント・アウトを選択し、保存を実行します。


続いてページ番号のフォームのページを開き、ページ・アイテムP2_CREATEDP2_CREATED_BYP2_UPDATEDP2_UPDATED_BYを選択し、構成ビルド・オプションコメント・アウトを選択します。


ページ・アイテムP2_TITLEタイプテキスト・フィールドであることを確認します。異なる場合はテキスト・フィールドに変更します。


ページ・アイテムP2_CONTENTの位置を、P2_PUBLISHEDの下に移動します。


ページ・アイテムP2_CONTENT識別タイプリッチ・テキスト・エディタに変更します。APEX 23.1よりリッチ・テキスト・エディタの実装としてTinyMCEが採用されていますが、今回は設定ライブラリとしてCKEditor [Deprecated]を選択します

設定書式Markdownを選択します。HTMLも選択できますが(Louis Moreauxさんの記事はHTMLを使っています)、クロスサイト・スクリプティングの影響を軽減するためにMarkdownを選んでいます。最小高はデフォルトの180ピクセルから変更しません。


ページ・アイテムP2_PUBLISHDがP2_AUTHORの右隣に配置されるよう、レイアウト新規行の開始OFFにします。


ページの外観ダイアログ・テンプレートをDrawerからModal Dialogに変更します。

以上で変更を保存します。


この状態でアプリケーションを実行し、動作を確認します。ページ番号2はモーダル・ダイアログのページなので、アプリケーションに一旦戻ってから、アプリケーションを実行します。

これまでの実装では、以下のような動作になります。標準的な対話モード・レポートとフォームの組み合わせです。


準備作業はここまでです。

次の記事では、画像のアップロードとダウンロードを行うREST APIを作成します。