2023年12月6日水曜日

読取り専用のページ・アイテムで改行を含んだ文字列を表示する

表題の件で相談があったので調べてみました。確認のために以下のようなAPEXアプリケーションを作成してみました。

アプリケーションのエクスポートを以下に置きました。APEX 23.2です。
https://github.com/ujnak/apexapps/blob/master/exports/readonly-with-newline.zip


表示対象とするデータの入力に使用するページ・アイテムとしてP1_SOURCEを作成します。ソースに改行が含まれているかどうか確認するため、dump関数を適用した結果を表示するページ・アイテムP1_BINARY_DATAを作成しています。

改行を含んだ文字列を表示する4種類のページ・アイテムと、ひとつの動的コンテンツのリージョンを作成します。



ページ・アイテムのソースの設定について


ソースタイプとしてアイテムを選択し、アイテムP1_SOURCEを指定します。使用としてセッション・ステートの既存の値を常に置換を選びます。セッション・ステートデータ型VARCHAR2ストレージリクエストごと(メモリーのみ)を指定します。


以上でP1_SOURCEの値を送信すると、その値がP1_DISPLAY_ONLY(または他のページ・アイテム)のソース(となるデータ)になります。

APEXに詳しい方であれば、使用セッション・ステートの値がNULLの場合のみでも結果は同じじゃない?と思うかもしれません。セッション・ステートストレージリクエストごと(メモリーのみ)であれば、プロセスなどで設定していない限り、セッション・ステートの値はつねにNULLになるため、ソース使用として、どちらの設定を行なっていても結果は同じになります。ページ・アイテムに設定した値が反映されず、ひとつ前の値が表示されるような場合は、大抵はこの設定が原因になっています。

例えば、P1_DISPLAY_ONLY設定ページの送信時に送信オンソース使用セッション・ステートの値がNULLの場合のみセッション・ステートストレージセッションごと(永続)を選択すると、P1_DISPLAY_ONLYに値が設定されている限り、ソースとして設定したP1_SOURCEの値で置き換えられることはありません。


タイプが表示のみ


ページ・アイテムP1_DISPLAY_ONLY表示のみで作成します。設定改行の表示オンにします。


実際に出力されているHTMLを確認すると、SPAN要素としてP1_SOURCEの文字列が表示されています。改行の表示オンなので、改行<br>に置き換えられています。


Oracle APEXでは生成されたHTML要素に属性を設定したり、CSSを適用する方法が提供されています。

SPAN要素の高さを設定し、Y方向に溢れた文字列はスクロールさせるようにします。ページ・プロパティCSSインラインに以下を記述します。
#P1_DISPLAY_ONLY {
    height: 7em;
    overflow-y: scroll;
}

結果としてタイプ表示のみのページ・アイテムで、縦方向のスクロールが行われます。



タイプがテキスト領域で読取り専用が常時



ページ・アイテムP1_TEXTAREA_READONLYを作成します。タイプテキスト領域読取り専用常時にします。


出力結果を確認するとタイプテキスト領域であっても読取り専用常時となっていると、TEXTAREA要素ではなくSPAN要素で文字列が表示されています。つまり、タイプ表示のみと同じです。

TEXTAREA要素のまま読み取りのみにするには、TEXTAREA要素にreadonly属性を指定します。

HTML要素の属性は、設定カスタム属性に設定します。


結果として、タイプテキスト領域ページ・アイテムが変更不可になります。



タイプがMarkdownエディタ



改行の表示だけであれば、タイプMarkdownエディタも利用可能です。ただし、こちらも読取り専用常時に設定するとSPAN要素として出力されています。そのため、テキスト領域と同様に設定カスタム属性としてreadonlyを指定する必要があります。



動的コンテンツのリージョン



ページ・アイテムではなくリージョンで表示することも可能です。

リージョンのタイプとして動的コンテンツを選択し、改行が解釈されるように出力する文字列をPREタグで文字列を囲みます。

ソースCLOBを返すPL/SQLファンクション本体は以下になります。

return '<pre>' || :P1_SOURCE || '</pre>';


テンプレート・オプションBody Heightが設定されていると、リージョンの高さが固定されます。そのため、その高さから文字列の表示が溢れると縦方向にスクロールされます。


改行を含んだ文字列の表示についての説明は、以上になります。

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