Tworzenie linków w Oracle Apex
Oracle Apex posiada mechanizmy bezpieczeństwa które nie pozwalają na łatwe skomponowanie linku który przeniesie nas do rządanej strony w aplikacji. Jest to zabezpieczenie przed tak zwanym "URL tampering". By taki link zadziałał nie wystarczy skleić go wstawiając adres serwera, numer strony, sesje i parametry strony. Oracle Apex wylicza checksums linku specjalnym algorytmem. Zatem jeśli spróbujesz zrobić coś jak "f?p=&APP_ID.:175:&SESSION.:COS::RIR,CIR:IRIN_PARAM:\000040, 000023\" to po prostu nie zadziała. Choć nadal w Google znajdziesz wiele błedny tutoriali że jest inaczej.
Jak zatem tworzyć linki? Poniżej dwa najwygodniejsze sposoby.
Utworzenie linku w procedurze PL/SQL i zwrócenie go jako kolumna
Taka potrzeba pojawia się często przy warunkowym linku; jeśli coś tam to dokądś tam, jeśli inne coś to w inne miejsce...
CASE
WHEN pr.some_column is NULL THEN
'f?p=&APP_ID.:150:&SESSION.:OFFE::RIR,CIR'
ELSE 'f?p=&APP_ID.:150:&SESSION.:OFFE::RIR,CIR:IR_DETAILS:'||lpad(to_char(pr.marker),6,'000000')
END edit_link
Ale nie, tak utworzonej kolumny nie możemy wykorzystać wprost jako link. Użyjemy tę kolumnę jako źródło/parametr linku. Ukrywamy tę kokumnę - Type => Hidden collumn. Potrzebujemy więc jescze jedną wirtualną kolumnę w naszym zapytaniu które jest źródłem naszej strony/raportu w Apex. W SQL dodajemy więc:
'DO_STRONY' AS DO_STRONY
Mamy zatem zatem kolejną wirtualną kolumnę w źródle naszego raportu. Tę kolumnę zamieniamy na link: Type => Link.
Klikamy na "Target" i definiujemy:
Po zapisaniu nasz link będzie funkcjonwać jak należy. Dlaczego tak? Oracle Apex podda źródło tego linku właściwym algorytmom które zrobią z niego użyteczny link.
Sposób nr 2 - użycie apex_util.prepare_url
W poniższym przykładzie zademonstrujemy dwa rozwiązania. Jak otworzyć stronę w używając JavaScript i jak skonstuować właściwy link by to osiągnąć. Zacznijmy od zbudowania właściwej funkcji JavaScript:
var x = apex.item('P313_ARTICLE_NO').getValue();
var url = "f?p=#APP_ID#:314:#SESSION#::NO:RP,314:P314_ARTICLE_NO:#P313_ARTICLE_NO#";
url = url.replace("#APP_ID#", $v("pFlowId"));
url = url.replace("#SESSION#", $v("pInstance"));
url = url.replace("#P313_ARTICLE_NO#", x);
apex.server.process("PREPARE_URL", {
x01: url
}, {
success: function(pData) {
if (pData.success === true) {
apex.navigation.redirect(pData.url);
} else {
console.log("FALSE");
}
},
error: function(request, status, error) {
console.log("status---" + status + " error----" + error);
}
});
Funkcja ta komonuje link i przesyła go do metody apex_util.prepare_url która zwróci działający, poprawny link który użyjemy do przekierowania - apex.navigation.redirect(pData.url). Przygotowanie linku będie zadaniem procesu, Ajax Callback. W menu 'Processing => Ajax Callback' dodaj proces i nazwij go 'PREPARE_URL'. Wybierz typ jako 'PL/SQL Code' i wklej poniższa zawartość:
declare
result varchar2(32767);
begin
result:=apex_util.prepare_url(apex_application.g_x01);
apex_json.open_object;
apex_json.write('success', true);
apex_json.write('url', result);
apex_json.close_object;
exception
when others then
apex_json.open_object;
apex_json.write('success', false);
apex_json.write('message', sqlerrm);
apex_json.close_object;
end;
W sposób jak wyżej możesz otworzyć zarówno okno typu modal jak i zwykłą stronę. Powodzenia!