Douwe en Menno vroegen mij (herhaaldelijk) om mee te gaan bloggen, dus bij deze mijn eerste blog op deze site. Ik ga proberen wat meer op de technische kant van Apex in te gaan, dus om maar van start te gaan, gaan we het vandaag hebben over custom themes. In de meeste situaties zal het uiterlijk van Apex waarschijnlijk worden aangepast aan de wensen van de klant. Dit is allemaal prima te doen, maar de wijze om het thema toe te passen in meerdere applicaties, is omslachtig. Je zult het thema moeten exporteren en in een andere applicatie importeren of de templates via subscriptions koppelen aan een andere applicatie.
Bij Apex zijn standaard 18 themes meegeleverd. Over smaak valt niet te twisten, over functionaliteit wel: in de huidige Apex versie is het niet mogelijk je eigen thema in het lijstje van 18 themes erbij te krijgen. Dat wil zeggen, niet op een normale wijze.
Wanneer we onder de motorkap (dus in het schema van flows_030000) van Apex kijken, zien we een hele reeks packages. De packages (wwv_flow_theme_1 t/m wwv_flow_theme_18) bevatten alle informatie over de 18 themes. Helaas zijn deze wrapped, dus nagenoeg onleesbaar en totaal onmogelijk om aan te passen. Echter verteld de specificatie van elk package ons dat er maar 1 procedure in het package zit: create_theme. Deze procedure doet het volgende:
- Aanmaken van een theme in de applicatie
- Aanmaken van de templates voor het theme in de applicatie
- Het huidige theme van de applicatie wijzigen
We kunnen eenvoudig genoeg een package vervangen door een eigen package met dezelfde procedure definitie, maar hoe krijgen we de functionaliteit van de procedure in ons eigen package? Dit is niet heel moeilijk, elke import doet vrijwel hetzelfde. We kunnen in een export kijken welke API calls er worden gemaakt om de verschillende templates aan te maken, vervolgens moeten we alleen nog de juiste informatie meegeven. Het enige wat daarbij niet gebeurd is het bijwerken van de applicatie, zodat deze het nieuwe thema gebruikt. Maar zoals in het voorbeeld te zien is kan dat met een eenvoudig update statement.
Je hoeft alleen nog maar een screenshot van het resultaat te maken en in de juiste map op de webserver te zetten. Het enige nadeel van het maken van een eigen thema is dat je een bestaand thema moet vervangen, die je dus niet langer kunt gebruiken.
Onderstaand voorbeeld bevat een theme met één template.
create or replace package body wwv_flow_theme_14 is
procedure create_theme (
p_flow_id in number
, p_create_tabs in number
, p_sidebar in varchar2
, p_set_defaults in varchar2 default ‘Y’);
end;
create or replace package body wwv_flow_theme_14 is
procedure create_theme (
p_flow_id in number
, p_create_tabs in number
, p_sidebar in varchar2
, p_set_defaults in varchar2 default ‘Y’) is
begin
/* Maak thema aan */
wwv_flow_api.create_theme (
p_id =>wwv_flow_api.g_id_offset,
p_flow_id =>p_flow_id,
p_theme_id => 14,
p_theme_name=>’Caesar’
);
/* Voeg een page template toe */
declare
c1 varchar2(32767) := null;
c2 varchar2(32767) := null;
c3 varchar2(32767) := null;
l_clob clob;
l_length number := 1;
begin
c1:=c1||’‘||chr(10)||
‘
‘#HEAD#’||chr(10)||
‘ ‘||chr(10)||
‘‘||chr(10)||
‘‘||chr(10)||
‘#FORM_OPEN#’;
c2:=c2||’#FORM_CLOSE#‘||chr(10)||
‘‘;
c3:=c3||’
‘||chr(10)||
‘#BOX_BODY##REGION_POSITION_02##REGION_POSITION_04##REGION_POSITION_05##REGION_POSITION_06##REGION_POSITION_07##REGION_POSITION_08#’||chr(10)||
”;
wwv_flow_api.create_template(
p_id=> wwv_flow_api.g_id_offset,
p_flow_id=> p_flow_id,
p_name=> ‘Popup’,
p_body_title=> ”,
p_header_template=> c1,
p_box=> c3,
p_footer_template=> c2,
p_success_message=> ‘
‘,
p_current_tab=> ”,
p_current_tab_font_attr=> ”,
p_non_current_tab=> ”,
p_non_current_tab_font_attr => ”,
p_top_current_tab=> ”,
p_top_current_tab_font_attr => ”,
p_top_non_curr_tab=> ”,
p_top_non_curr_tab_font_attr=> ”,
p_current_image_tab=> ”,
p_non_current_image_tab=> ”,
p_notification_message=> ‘
‘,
p_navigation_bar=> ‘#BAR_BODY#’,
p_navbar_entry=> ‘#TEXT#‘||chr(10)||
”,
p_app_tab_before_tabs=>”,
p_app_tab_current_tab=>”,
p_app_tab_non_current_tab=>”,
p_app_tab_after_tabs=>”,
p_region_table_cattributes=> ‘width=”100%” border=”0″ cellpadding=”0″ cellspacing=”0″ summary=”" ‘,
p_theme_id => 14,
p_theme_class_id => 4,
p_required_patch => null + wwv_flow_api.g_id_offset,
p_translate_this_template => ‘N’,
p_template_comment => ”);
end;
/* Update de applicatie */
UPDATE wwv_flows set
theme_id = 14,
default_button_template = wwv_flow_theme_globals.g_default_button_template,
default_calendar_template = wwv_flow_theme_globals.g_default_calendar_template,
default_chart_template = wwv_flow_theme_globals.g_default_chart_template,
default_form_template = wwv_flow_theme_globals.g_default_form_template,
default_label_template = wwv_flow_theme_globals.g_default_label_template,
default_list_template = wwv_flow_theme_globals.g_default_list_template,
default_listr_template = wwv_flow_theme_globals.g_default_listr_template,
default_menu_template = wwv_flow_theme_globals.g_default_menu_template,
default_menur_template = wwv_flow_theme_globals.g_default_menur_template,
default_page_template = wwv_flow_theme_globals.g_default_page_template,
default_region_template = wwv_flow_theme_globals.g_default_region_template,
default_report_template = wwv_flow_theme_globals.g_default_report_template,
default_reportr_template = wwv_flow_theme_globals.g_default_reportr_template,
default_tabform_template = wwv_flow_theme_globals.g_default_tabform_template,
default_wizard_template = wwv_flow_theme_globals.g_default_wizard_template,
error_template = wwv_flow_theme_globals.g_error_template,
printer_friendly_template = wwv_flow_theme_globals.g_printer_friendly_template
where id = p_flow_id;
commit;
end;
end;
