Tipps & Tricks: Juli 2014 Bereich: APEX Erstellung: 07/2014 BK Versionsinfo: 4.0 Letzte Überarbeitung: 07/2014 BK Informationssystem für APEX-Applikationen Hatten Sie auch schon einmal den Wunsch, den Anwendern einer Applikation etwas mitzuteilen? Und wäre es nicht manchmal gut, wenn jeder Anwender nachweislich die Information gelesen hat? Die Informationen sollen sofort, also auch in einer laufenden Session, in einem modalen Popup- Fenster angezeigt werden. Dieses Problem stellte sich vor einiger Zeit in einem APEX-Projekt und aus diesem Grund haben wir ein Informationssystem für APEX-Anwendungen entwickelt. Um die Anforderungen abzudecken brauchen wir im ersten Schritt zwei Tabellen. In der ersten werden die "Nachrichten" gespeichert, in der zweiten die Information, wer wann das Lesen bestätigt hat. CREATE TABLE INFORMATIONEN ( ID NUMBER, -- Eindeutige ID, Trigger und Sequence APP_ID NUMBER, -- Applikations ID der Apexanwendung STATUS CHAR(1), -- A für aktiv oder I für inaktiv INFORMATION VARCHAR2(500), -- Freitext für die Informationsn CONSTRAINT PK_INFORMATIONEN PRIMARY KEY (ID) ); CREATE TABLE INFORMATION_READ ( INFO_ID NUMBER, -- ID der Information die gelesen wurde APP_USER VARCHAR2(30), -- Welcher User hat gelesen READ_DATE DATE -- Wann wurde gelesen, Trigger mit SYSDATE ); Der nächste Schritt ist, eine Seite in der Applikation zu erstellen auf der die Informationen angezeigt werden sollen. Als Template wählen wir Popup. Im Bereich "Page HTML Body Attribute" kommt noch folgende Anweisung dazu: style="background:none;background-image:none;background-color:transparent;padding:0;margi Jetzt sollte man sich auch überlegen wie viele Informationen gleichzeitig angezeigt werden müssen. Entsprechend viele Items müssen erzeugt werden. Wir benötigen je Info ein "Display only" Item (PX_INFOTEXT_X). Dabei sollte beachtet werden, dass die Eigenschaft "Escape special characters" auf NO steht, dadurch können HTML Formatierungen in den Text integriert werden. Zu jedem Infotext kommt noch eine Checkbox (return 1 when ckecked), damit können die Nachrichten einzeln bestätigt werden. Infotext und Checkbox werden nur angezeigt, wenn Infotext "NOT NULL" ist. Schließlich fehlt noch je ein Hidden Item zum Speichern der ID und ein Button zum Bestätigen der Seite. Jetzt fehlen noch zwei Prozesse, der erste "On Load - Before Header" mit dem die Inhalte gefüllt werden: Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 1 von 4 declare v_cnt number := 1; v_trenner varchar2(30) := '<p><hr><p>'; begin for rec in (select id, information from informationen where app_id = :APP_ID and status = 'A' and id not in (select info_id from information_read where app_user = :APP_USER) order by id) loop if v_cnt = 1 then :PX_ID1 := rec.id; :PX_INFOTEXT_1 := rec.information; end if; if v_cnt = 2 then :PX_ID2 := rec.id; :PX_INFOTEXT_2 := rec.information; end if; v_cnt := v_cnt + 1; end loop; end; Dann kommt der Prozess zum Speichern der Informationen, wenn der Button gedrückt wurde: begin if :PX_CHECK1 = 1 then insert into information_read values(:PX_ID1, :APP_USER, SYSDATE); end if; if :PX_CHECK2 = 1 then insert into information_read values(:PX_ID2, :APP_USER, SYSDATE); end if; :FXXX_HIDE := 'TRUE'; :FXXX_INFO := '0'; end; Hier tauchen erstmals die Applikations Items FXXX_HIDE und FXXX_INFO auf. Diese werden für die Steuerung des Infofensters benötigt. Bei Betätigung des Buttons wird auf jeden Fall das Item HIDE auf TRUE gesetzt, damit wird eine weitere Anzeige innerhalb der gleichen Session verhindert. Die Nachrichten können separat bestätigt werden, das heißt der Anwender kann entscheiden, ob sie in der nächsten Session wieder erscheinen sollen. Nachdem es sich um ein modales Popup-Fenster handelt brauchen wir noch einen Branch, um es nach der Verarbeitung zu schließen. Der Branch Typ ist "Branch to PL/SQL Procedure". begin htp.p('<body>'); htp.p('<script type="text/javascript">'); htp.p('parent.$("#modalDialog").dialog("close");'); htp.p('</script>'); htp.p('</body>'); end; Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 2 von 4 Kommen wir nun zur Steuerung. Bedingung war ja, dass es auch in einer laufenden Session erscheinen soll. Dafür müssen wir bei jedem Neuladen einer Seite nachsehen, ob es eine Nachricht gibt die der jeweilige User noch nicht gelesen hat. Weiterhin soll es die Möglichkeit geben, das modale Fenster zu schließen ohne die Nachrichten zu bestätigen. Dafür werden die Applikationsitems FXXX_HIDE und FXXX_INFO angelegt. Dazu gehört auch ein Applikations Prozess mit dem Zündpunkt "On Load: Before Header". begin select count(*)into :FXXX_INFO from informationen where app_id = :APP_ID and status = 'A' and id not in (select info_id from information_read where app_user = :APP_USER); end; Jetzt der zentrale Punkt: wannund wie zeige ich das modale Fenster an! Dazu wird auf der Seite 0 eine "Dynamic Action" mit folgenden Einstellungen angelegt. When: Event = Page Load Condition = No Condition Advanced: Event Scope = once Condition: Type = PL/SQL Expression Expression1 = NVL(:FXXX_HIDE,'F') != 'TRUE' and :FXXX_INFO > 0 and :APP_PAGE_ID not in (101,X) Es müssen Loginseite und die Seite die als Popup erscheint ausgeschlossen werden. TRUE ACTION: Execute JavaScriptCode (In diesem Beispiel wird in der Applikation 100 die Seite 7 als modales Popup aufgerufen) var ev = this.browserEvent; ev.preventDefault; var horizontalPadding = 20; var verticalPadding = 20; $('<iframe id="modalDialog" src="f?p=100:7:&APP_SESSION.::NO::" />').dialog( {title: "APEX System Info", autoOpen: true, width: 700, hight: 350, modal: true, close: function(event, ui) { $(this).remove();}, overlay: {opacity: 0.5, background: "black"} } ).width(700 - horizontalPadding).height(350 - verticalPadding); return false; Der Anwender bekommt "neue Informationen" auch während einer laufenden Session sofort angezeigt und er muss aktiv werden und die Meldungen bestätigen, um sie dauerhaft auszublenden. Achtung! Ab der APEX Version 4.1 sind aus Sicherheitsgründen Frames per default nicht erlaubt. Damit dieses Beispiel funktioniert muss in den Security Attributen "Embed in Frames" auf "Allow from same origin" umgestellt Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 3 von 4 Ab der APEX Version 4.1 sind aus Sicherheitsgründen Frames per default nicht erlaubt. Damit dieses Beispiel funktioniert muss in den Security Attributen "Embed in Frames" auf "Allow from same origin" umgestellt werden. Weitere Informationen und Tipps zur Entwicklung mit APEX bekommen Sie auch in unseren Schulungen Entwicklung mit Application Express. Muniqsoft GmbH Schulungszentrum, Grünwalder Weg 13a, 82008 Unterhaching, Tel. 089 / 679090-40 IT-Consulting & Support, Witneystraße 1, 82008 Unterhaching, Tel. 089 / 6228 6789-0 Seite 4 von 4