Článek: AN0002470Aktualizováno:: 30.11.2021
V tomto článku uvádíme konkrétní nastavení a skripty pro popsané řešení.
Nejprve se ale podíváme na schéma komunikace jednotlivých objektů řešení.
Webpart Skript na stránce Aplikační katalog
Záložka Skript
function OnPreRender()
{
//create instance for keeping the text
var script = '<div class="og-apps"></div><div></div>';
//add to page
OGForm.AddControl(OGForm.CreateLiteralControl('lc1', script));
}
Záložka Styly
Url na soubor se styly: modules/OG.AppCatalogue/app-catalogue6.css
Záložka JavaScript
Url na soubor s JavaScriptem: modules/OG.AppCatalogue/app-catalogue-demo2-7.js
Výše uvedené dva soubory nakopírujeme do složky webu ./Modules/OG.AppCatalogue/
Spouštěný skript
V modelu, v němž jsme vytvořili stránku s Katalogem aplikací, vytvoříme objekt Spouštěný skript. Nastavíme mu kód app-cat a vlastnost Skript:
//#block app-cat
OGResponseContent.ContentText = GetData(OGModel);
OGResponseContent.FileName = 'data.json';
Spouštěný skript volá blok skriptu a přebírá od něj data ve formátu json pro zobrazení v katalogu aplikací.
Blok skriptu
V modelu, v němž jsme vytvořili stránku s Katalogem aplikací, vytvoříme objekt Blok skriptu. Nastavíme mu kód app-cat a vlastnost Skript:
var cacheKey = 'og-app-cat';
function GetData(model) {
var showKonfPol = OG.Person.IsUserInRoleByCode('it-architect');
var data = System.Web.HttpContext.Current.Cache.Get(cacheKey);
var cl = model.ClassDefs['business-application'];
var ciCl = model.ClassDefs['ci'];
if (OG.IsNull(data)) {
//read data
var f = OG.DataRow.GetDataRowFilter(cl.Id);
f['display_on_intranet'] = true;
f.Filter_Sort = 'col' + cl.Columns['application_group'].Id + 'T, col' + cl.Columns['name'].Id;
OG.DataRow.PrepareFilterForOptimizeRead(f);
f.PropertiesLoad.Audit = false;
f.PropertiesLoad.ParentShortDescription = false;
f.PropertiesLoad.ColumnIds.Add(cl.Columns['is-module-of'].Id);
f.PropertiesLoad.ColumnIds.Add(cl.Columns['name'].Id);
f.PropertiesLoad.ColumnIds.Add(cl.Columns['description'].Id);
f.PropertiesLoad.ColumnIds.Add(cl.Columns['guarantor'].Id);
f.PropertiesLoad.ColumnIds.Add(cl.Columns['application_url'].Id);
f.PropertiesLoad.ColumnIds.Add(cl.Columns['keyusers'].Id);
f.PropertiesLoad.ColumnIds.Add(cl.Columns['icon'].Id);
f.PropertiesLoad.ColumnIds.Add(cl.Columns['application_group'].Id);
var sb = new System.Text.StringBuilder(100000);
var drl = OG.DataRow.GetDataByFilter(f);
if (drl != null && drl.Count > 0) {
var sep = '"applications": [';
for (var i = 0; i < drl.Count; ++i) {
var dr = drl[i];
var parentId = dr['is-module-of'] == null ? 0 : dr['is-module-of'];
var ag = dr['application_group'] == null ? '' : dr.GetColumnDataAsString2('application_group');
var rn = '';
var license = '';
var keyUsers = OG.TextUtils.ConvertEntitiesToSeparatedString(dr['keyusers'], ', ', '');
var icon = JsonTrimText(dr['icon']);
if (OG.IsNull(icon)) {
icon = '';
}
sb.Append(sep + '{ "id":"' + dr.Id +
'","ciId":"' + dr.RemapId(ciCl.Id) +
'","n":"' + JsonTrimText(dr['name']) +
'","d":"' + JsonTrimText(dr['description']) +
'","pId":"' + parentId +
'","ag":"' + JsonTrimText(ag) +
'","r":"' + JsonTrimText(rn) +
'","l":"' + JsonTrimText(license) +
'","u":"' + JsonTrimText(keyUsers) +
'","g":"' + JsonTrimText(dr['guarantor']) +
'","au":"' + JsonTrimText(dr['application_url']) +
'","i":"' + icon +
'"'
);
sb.Append('}');
sep = ',';
}
sb.Append(']');
}
data = sb.ToString();
System.Web.HttpContext.Current.Cache.Remove(cacheKey);
System.Web.HttpContext.Current.Cache.Add(cacheKey, data, null, OG.DateTime.Now.AddDays(7), System.Web.Caching.Cache.NoSlidingExpiration,
System.Web.Caching.CacheItemPriority.Normal, null);
}
return '{"buss_app_id":"' + cl.Id + '", "showKonfPol":"' + (showKonfPol ? 'Y' : 'N') + '",' + data + '}';
}
function JsonTrimText(text) {
if (OG.IsNull(text)) {
return text;
}
var s = replaceAll(text, "\\", "\\\\");
s = replaceAll(s, "{", " ");
s = replaceAll(s, "}", " ");
s = replaceAll(s, "\"", "'");
s = replaceAll(s, "\n", "<br>");
s = replaceAll(s, "\r", "");
return s;
}
function replaceAll(string, search, replace) {
return string.split(search).join(replace);
}
function ClearCache()
{
System.Web.HttpContext.Current.Cache.Remove(cacheKey);
}
Skript načte data z cache nebo z databáze, pokud je cache prázdná, a vrátí je ve formátu json. Blok skriptu obsahuje také funkci pro vyčištění cache, kterou volají pravidla níže.
Pro optimalizaci velikosti přenášených dat jsme v json datech odstranili mezery a názvy zkrátili na 1-2 znaky. Tím jsme v naší implementaci snížili velikost dat ze 110kB na 80kB.
Pravidla na třídě s aplikacemi
Na třídě s aplikacemi si vytvoříme tři pravidla typu Skript spouštěné po vytvoření nového záznamu ve třídě, aktualizaci záznamu a po smazání záznamu. Ve všech těchto případech vyčistíme cache, aby si aplikace načetla znovu data. Skript v pravidle zavolá funkci v bloku skriptu, která vyčištění cache provede.
//#block app-cat
ClearCache();