アプリケーションのエクスポートを以下に置きました。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のアプリケーション作成の参考になれば幸いです。
完