<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="sl">
	<id>https://wiki.sdms.si/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Janez+Trtnik</id>
	<title>SDMS - Uporabnikovi prispevki [sl]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.sdms.si/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Janez+Trtnik"/>
	<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Posebno:Prispevki/Janez_Trtnik"/>
	<updated>2026-05-06T13:17:03Z</updated>
	<subtitle>Uporabnikovi prispevki</subtitle>
	<generator>MediaWiki 1.32.0</generator>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7275</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7275"/>
		<updated>2023-02-01T15:05:55Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
   \SDMS&lt;br /&gt;
     SDMS.exe&lt;br /&gt;
     SDMS.ini&lt;br /&gt;
     \DATABASE&lt;br /&gt;
     \SDMSCL  (client)&lt;br /&gt;
     \SDMSDS  (database service; obvezna za client-server način)&lt;br /&gt;
     \SDMSAS  (automation service; opcijska za client-server način)&lt;br /&gt;
     \SDMSWS  (web service; opcijska za client-server način)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo inštalacijske komponente, ki jih potrebujemo. Razpakiramo jih na zgoraj priporočeno direktorijsko hiearhijo.&lt;br /&gt;
V nadaljevanju bomo predpostavili, da je smo izbrali disk D in namestili sistem v izhodiščno mapo '''D:\SDMS'''.&lt;br /&gt;
*V primeru client-server sistema mapi '''D:\SDMS''' aktivirajte skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Če imate zaščitni ključ za uporabo programa, ga ustavite v USB vrata na računalniku.&lt;br /&gt;
*Če nimate zaščitnega ključa, je potrebno ustvariti programsko zaščito na ta računalnik:&lt;br /&gt;
**'''SDMS.EXE -REGISTER=Vaše_Ime'''&lt;br /&gt;
**Kontaktirajte Softdato, da vam pripravimo licenco za uporabo programa.&lt;br /&gt;
**'''SDMS.EXE -LICENCE=dodeljena_številka'''&lt;br /&gt;
**Na tej mapi se bo ustvarila licenčna datoteka (*.lic).&lt;br /&gt;
*Na namizju si ustvarimo bližnjico do programa '''SDMS.EXE''', ki se nahaja v mapi '''D:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. Preden preidemo na nameščanje strežnika, moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS servisov ==&lt;br /&gt;
SDMS Database Service se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika tako:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''D:\SDMS\SDMSDS''' prenesemo datoteke, ki smo jih prenesli.&lt;br /&gt;
*Kopirajte licenčno datoteko iz '''SDMSCL''' direktorija v '''SDMSDS'''.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''D:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice z administratorskimi pravicami zaženemo ukaz: '''D:\SDMS\SDMSDS\SDMSDSP.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v '''D:\SDMS\SDMSDS'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''D:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMSDS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
Za namestitev SDMS Automation Service in SDMS Web Service je postopek enak kot za SDMS Database Service.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\SDMS.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''SDMS.EXE'''. Vpišete se z dodeljenim uporabniškim imenom in geslom, ki vam je dodeljen. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7274</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7274"/>
		<updated>2023-02-01T14:56:54Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev odjemalcev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
   \SDMS&lt;br /&gt;
     SDMS.exe&lt;br /&gt;
     SDMS.ini&lt;br /&gt;
     \DATABASE&lt;br /&gt;
     \SDMSCL  (client)&lt;br /&gt;
     \SDMSDS  (database service)&lt;br /&gt;
     \SDMSAS  (automation service)&lt;br /&gt;
     \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo inštalacijske komponente, ki jih potrebujemo. Razpakiramo jih na zgoraj priporočeno direktorijsko hiearhijo.&lt;br /&gt;
V nadaljevanju bomo predpostavili, da je smo izbrali disk D in namestili sistem v izhodiščno mapo '''D:\SDMS'''.&lt;br /&gt;
*V primeru client-server sistema mapi '''D:\SDMS''' aktivirajte skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Če imate zaščitni ključ za uporabo programa, ga ustavite v USB vrata na računalniku.&lt;br /&gt;
*Na namizju si ustvarimo bližnjico do programa '''SDMS.EXE''', ki se nahaja v mapi '''D:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. Preden preidemo na nameščanje strežnika, moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS servisov ==&lt;br /&gt;
SDMS Database Service se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika tako:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''D:\SDMS\SDMSDS''' prenesemo datoteke, ki smo jih prenesli.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''D:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice z administratorskimi pravicami zaženemo ukaz: '''D:\SDMS\SDMSDS\SDMSDSP.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v '''D:\SDMS\SDMSDS'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''D:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMSDS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
Za namestitev SDMS Automation Service in SDMS Web Service je postopek enak kot za SDMS Database Service.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\SDMS.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''SDMS.EXE'''. Vpišete se z dodeljenim uporabniškim imenom in geslom, ki vam je dodeljen. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7273</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7273"/>
		<updated>2023-02-01T14:55:30Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev SDMS database strežnika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
   \SDMS&lt;br /&gt;
     SDMS.exe&lt;br /&gt;
     SDMS.ini&lt;br /&gt;
     \DATABASE&lt;br /&gt;
     \SDMSCL  (client)&lt;br /&gt;
     \SDMSDS  (database service)&lt;br /&gt;
     \SDMSAS  (automation service)&lt;br /&gt;
     \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo inštalacijske komponente, ki jih potrebujemo. Razpakiramo jih na zgoraj priporočeno direktorijsko hiearhijo.&lt;br /&gt;
V nadaljevanju bomo predpostavili, da je smo izbrali disk D in namestili sistem v izhodiščno mapo '''D:\SDMS'''.&lt;br /&gt;
*V primeru client-server sistema mapi '''D:\SDMS''' aktivirajte skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Če imate zaščitni ključ za uporabo programa, ga ustavite v USB vrata na računalniku.&lt;br /&gt;
*Na namizju si ustvarimo bližnjico do programa '''SDMS.EXE''', ki se nahaja v mapi '''D:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. Preden preidemo na nameščanje strežnika, moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS servisov ==&lt;br /&gt;
SDMS Database Service se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika tako:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''D:\SDMS\SDMSDS''' prenesemo datoteke, ki smo jih prenesli.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''D:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice z administratorskimi pravicami zaženemo ukaz: '''D:\SDMS\SDMSDS\SDMSDSP.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v '''D:\SDMS\SDMSDS'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''D:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMSDS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
Za namestitev SDMS Automation Service in SDMS Web Service je postopek enak kot za SDMS Database Service.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7272</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7272"/>
		<updated>2023-02-01T14:52:27Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev SDMS strežnika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
   \SDMS&lt;br /&gt;
     SDMS.exe&lt;br /&gt;
     SDMS.ini&lt;br /&gt;
     \DATABASE&lt;br /&gt;
     \SDMSCL  (client)&lt;br /&gt;
     \SDMSDS  (database service)&lt;br /&gt;
     \SDMSAS  (automation service)&lt;br /&gt;
     \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo inštalacijske komponente, ki jih potrebujemo. Razpakiramo jih na zgoraj priporočeno direktorijsko hiearhijo.&lt;br /&gt;
V nadaljevanju bomo predpostavili, da je smo izbrali disk D in namestili sistem v izhodiščno mapo '''D:\SDMS'''.&lt;br /&gt;
*V primeru client-server sistema mapi '''D:\SDMS''' aktivirajte skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Če imate zaščitni ključ za uporabo programa, ga ustavite v USB vrata na računalniku.&lt;br /&gt;
*Na namizju si ustvarimo bližnjico do programa '''SDMS.EXE''', ki se nahaja v mapi '''D:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. Preden preidemo na nameščanje strežnika, moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS database strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika tako:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''D:\SDMS\SDMSDS''' prenesemo datoteke, ki smo jih prenesli.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''D:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice z administratorskimi pravicami zaženemo ukaz: '''D:\SDMS\SDMSDS\SDMSDSP.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v '''D:\SDMS\SDMSDS'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''D:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMSDS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7271</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7271"/>
		<updated>2023-02-01T14:47:14Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Priporočena hiearhija direktorijev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
   \SDMS&lt;br /&gt;
     SDMS.exe&lt;br /&gt;
     SDMS.ini&lt;br /&gt;
     \DATABASE&lt;br /&gt;
     \SDMSCL  (client)&lt;br /&gt;
     \SDMSDS  (database service)&lt;br /&gt;
     \SDMSAS  (automation service)&lt;br /&gt;
     \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo inštalacijske komponente, ki jih potrebujemo. Razpakiramo jih na zgoraj priporočeno direktorijsko hiearhijo.&lt;br /&gt;
V nadaljevanju bomo predpostavili, da je smo izbrali disk D in namestili sistem v izhodiščno mapo '''D:\SDMS'''.&lt;br /&gt;
*V primeru client-server sistema mapi '''D:\SDMS''' aktivirajte skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Če imate zaščitni ključ za uporabo programa, ga ustavite v USB vrata na računalniku.&lt;br /&gt;
*Na namizju si ustvarimo bližnjico do programa '''SDMS.EXE''', ki se nahaja v mapi '''D:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. Preden preidemo na nameščanje strežnika, moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7270</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7270"/>
		<updated>2023-02-01T14:46:27Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev sistema na strežnik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
   \SDMS&lt;br /&gt;
     \DATABASE&lt;br /&gt;
     \SDMSCL  (client)&lt;br /&gt;
     \SDMSDS  (database service)&lt;br /&gt;
     \SDMSAS  (automation service)&lt;br /&gt;
     \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo inštalacijske komponente, ki jih potrebujemo. Razpakiramo jih na zgoraj priporočeno direktorijsko hiearhijo.&lt;br /&gt;
V nadaljevanju bomo predpostavili, da je smo izbrali disk D in namestili sistem v izhodiščno mapo '''D:\SDMS'''.&lt;br /&gt;
*V primeru client-server sistema mapi '''D:\SDMS''' aktivirajte skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Če imate zaščitni ključ za uporabo programa, ga ustavite v USB vrata na računalniku.&lt;br /&gt;
*Na namizju si ustvarimo bližnjico do programa '''SDMS.EXE''', ki se nahaja v mapi '''D:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. Preden preidemo na nameščanje strežnika, moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7269</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7269"/>
		<updated>2023-02-01T14:38:58Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Priporočena hiearhija direktorijev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
   \SDMS&lt;br /&gt;
     \DATABASE&lt;br /&gt;
     \SDMSCL  (client)&lt;br /&gt;
     \SDMSDS  (database service)&lt;br /&gt;
     \SDMSAS  (automation service)&lt;br /&gt;
     \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo na poljubni disk vsebino v enakem imeniškem sistemu kot je zapisana na CD-ROMu. V nadaljevanju bomo predpostavili, da je smo izbrali disk C in namestili sistem v izhodiščno mapo '''C:\SDMS'''.&lt;br /&gt;
*Pri prenosu datotek moramo posebej paziti, da datoteke ne ohranijo '''read-only''' atributa, ki ga imajo nastavljenega na CD-ROMu. Če imajo datoteke na disku slučajno nastavljen ta atribut, ga je treba ročno odstraniti.&lt;br /&gt;
*Priporočamo, da mapi '''C:\SDMS''' aktivirate skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Nato izvedemo namestitev gonilnika za zaščitni ključ. To storimo tako, da zaženemo program '''HLDRV32.EXE''', ki se nahaja v mapi '''C:\SDMS''', in sledimo namestitvi gonilnika, kakor nas vodi program.&lt;br /&gt;
*Po zaključeni namestitvi gonilnika vstavimo zaščitni ključ v LPT vrata na strežniku. Če imate kakšna vrata še prosta, uporabite le-ta, sicer pa priključite tiskalnik preko ključa.&lt;br /&gt;
*Na namizju Oken si ustvarimo bližnjico do programa '''CLIENT.EXE''', ki se nahaja v mapi '''C:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program. Ko prvič vstopamo v sistem, uporabimo uporabniško ime '''Administrator''' (ali krajše '''admin''') in prazno geslo, kasneje pa bo vsak uporabnik vstopal pod svojim imenom.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. To nam za sedaj zadošča. Preden preidemo na nameščanje strežnika moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7268</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7268"/>
		<updated>2023-02-01T14:38:46Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Priporočena hiearhija direktorijev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
 D:&lt;br /&gt;
  \SDMS&lt;br /&gt;
    \DATABASE&lt;br /&gt;
    \SDMSCL  (client)&lt;br /&gt;
    \SDMSDS  (database service)&lt;br /&gt;
    \SDMSAS  (automation service)&lt;br /&gt;
    \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo na poljubni disk vsebino v enakem imeniškem sistemu kot je zapisana na CD-ROMu. V nadaljevanju bomo predpostavili, da je smo izbrali disk C in namestili sistem v izhodiščno mapo '''C:\SDMS'''.&lt;br /&gt;
*Pri prenosu datotek moramo posebej paziti, da datoteke ne ohranijo '''read-only''' atributa, ki ga imajo nastavljenega na CD-ROMu. Če imajo datoteke na disku slučajno nastavljen ta atribut, ga je treba ročno odstraniti.&lt;br /&gt;
*Priporočamo, da mapi '''C:\SDMS''' aktivirate skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Nato izvedemo namestitev gonilnika za zaščitni ključ. To storimo tako, da zaženemo program '''HLDRV32.EXE''', ki se nahaja v mapi '''C:\SDMS''', in sledimo namestitvi gonilnika, kakor nas vodi program.&lt;br /&gt;
*Po zaključeni namestitvi gonilnika vstavimo zaščitni ključ v LPT vrata na strežniku. Če imate kakšna vrata še prosta, uporabite le-ta, sicer pa priključite tiskalnik preko ključa.&lt;br /&gt;
*Na namizju Oken si ustvarimo bližnjico do programa '''CLIENT.EXE''', ki se nahaja v mapi '''C:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program. Ko prvič vstopamo v sistem, uporabimo uporabniško ime '''Administrator''' (ali krajše '''admin''') in prazno geslo, kasneje pa bo vsak uporabnik vstopal pod svojim imenom.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. To nam za sedaj zadošča. Preden preidemo na nameščanje strežnika moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7267</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7267"/>
		<updated>2023-02-01T14:36:44Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
D:&lt;br /&gt;
  \SDMS&lt;br /&gt;
    \DATABASE&lt;br /&gt;
    \SDMSCL  (client)&lt;br /&gt;
    \SDMSDS  (database service)&lt;br /&gt;
    \SDMSAS  (automation service)&lt;br /&gt;
    \SDMSWS  (web service)&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo na poljubni disk vsebino v enakem imeniškem sistemu kot je zapisana na CD-ROMu. V nadaljevanju bomo predpostavili, da je smo izbrali disk C in namestili sistem v izhodiščno mapo '''C:\SDMS'''.&lt;br /&gt;
*Pri prenosu datotek moramo posebej paziti, da datoteke ne ohranijo '''read-only''' atributa, ki ga imajo nastavljenega na CD-ROMu. Če imajo datoteke na disku slučajno nastavljen ta atribut, ga je treba ročno odstraniti.&lt;br /&gt;
*Priporočamo, da mapi '''C:\SDMS''' aktivirate skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Nato izvedemo namestitev gonilnika za zaščitni ključ. To storimo tako, da zaženemo program '''HLDRV32.EXE''', ki se nahaja v mapi '''C:\SDMS''', in sledimo namestitvi gonilnika, kakor nas vodi program.&lt;br /&gt;
*Po zaključeni namestitvi gonilnika vstavimo zaščitni ključ v LPT vrata na strežniku. Če imate kakšna vrata še prosta, uporabite le-ta, sicer pa priključite tiskalnik preko ključa.&lt;br /&gt;
*Na namizju Oken si ustvarimo bližnjico do programa '''CLIENT.EXE''', ki se nahaja v mapi '''C:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program. Ko prvič vstopamo v sistem, uporabimo uporabniško ime '''Administrator''' (ali krajše '''admin''') in prazno geslo, kasneje pa bo vsak uporabnik vstopal pod svojim imenom.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. To nam za sedaj zadošča. Preden preidemo na nameščanje strežnika moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7266</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7266"/>
		<updated>2023-02-01T14:36:14Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev Web strežnika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo na poljubni disk vsebino v enakem imeniškem sistemu kot je zapisana na CD-ROMu. V nadaljevanju bomo predpostavili, da je smo izbrali disk C in namestili sistem v izhodiščno mapo '''C:\SDMS'''.&lt;br /&gt;
*Pri prenosu datotek moramo posebej paziti, da datoteke ne ohranijo '''read-only''' atributa, ki ga imajo nastavljenega na CD-ROMu. Če imajo datoteke na disku slučajno nastavljen ta atribut, ga je treba ročno odstraniti.&lt;br /&gt;
*Priporočamo, da mapi '''C:\SDMS''' aktivirate skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Nato izvedemo namestitev gonilnika za zaščitni ključ. To storimo tako, da zaženemo program '''HLDRV32.EXE''', ki se nahaja v mapi '''C:\SDMS''', in sledimo namestitvi gonilnika, kakor nas vodi program.&lt;br /&gt;
*Po zaključeni namestitvi gonilnika vstavimo zaščitni ključ v LPT vrata na strežniku. Če imate kakšna vrata še prosta, uporabite le-ta, sicer pa priključite tiskalnik preko ključa.&lt;br /&gt;
*Na namizju Oken si ustvarimo bližnjico do programa '''CLIENT.EXE''', ki se nahaja v mapi '''C:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program. Ko prvič vstopamo v sistem, uporabimo uporabniško ime '''Administrator''' (ali krajše '''admin''') in prazno geslo, kasneje pa bo vsak uporabnik vstopal pod svojim imenom.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. To nam za sedaj zadošča. Preden preidemo na nameščanje strežnika moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;br /&gt;
&lt;br /&gt;
== Priporočena hiearhija direktorijev ==&lt;br /&gt;
&lt;br /&gt;
D:&lt;br /&gt;
  \SDMS&lt;br /&gt;
    \DATABASE&lt;br /&gt;
    \SDMSCL  (client)&lt;br /&gt;
    \SDMSDS  (database service)&lt;br /&gt;
    \SDMSAS  (automation service)&lt;br /&gt;
    \SDMSWS  (web service)&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7265</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7265"/>
		<updated>2023-02-01T14:32:16Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev sistema na strežnik */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz spletne strani '''https://www.sdms.si/''' prenesemo na poljubni disk vsebino v enakem imeniškem sistemu kot je zapisana na CD-ROMu. V nadaljevanju bomo predpostavili, da je smo izbrali disk C in namestili sistem v izhodiščno mapo '''C:\SDMS'''.&lt;br /&gt;
*Pri prenosu datotek moramo posebej paziti, da datoteke ne ohranijo '''read-only''' atributa, ki ga imajo nastavljenega na CD-ROMu. Če imajo datoteke na disku slučajno nastavljen ta atribut, ga je treba ročno odstraniti.&lt;br /&gt;
*Priporočamo, da mapi '''C:\SDMS''' aktivirate skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Nato izvedemo namestitev gonilnika za zaščitni ključ. To storimo tako, da zaženemo program '''HLDRV32.EXE''', ki se nahaja v mapi '''C:\SDMS''', in sledimo namestitvi gonilnika, kakor nas vodi program.&lt;br /&gt;
*Po zaključeni namestitvi gonilnika vstavimo zaščitni ključ v LPT vrata na strežniku. Če imate kakšna vrata še prosta, uporabite le-ta, sicer pa priključite tiskalnik preko ključa.&lt;br /&gt;
*Na namizju Oken si ustvarimo bližnjico do programa '''CLIENT.EXE''', ki se nahaja v mapi '''C:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program. Ko prvič vstopamo v sistem, uporabimo uporabniško ime '''Administrator''' (ali krajše '''admin''') in prazno geslo, kasneje pa bo vsak uporabnik vstopal pod svojim imenom.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. To nam za sedaj zadošča. Preden preidemo na nameščanje strežnika moramo program zapreti.&lt;br /&gt;
&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;br /&gt;
&lt;br /&gt;
== Namestitev Web strežnika ==&lt;br /&gt;
Će imate nabavljeno licenco SDMS WebServer, je potrebno instalirati tudi tega kot servis.&lt;br /&gt;
&lt;br /&gt;
C:\SDMS&lt;br /&gt;
  \DATABASE&lt;br /&gt;
  \CLIENT&lt;br /&gt;
  \SERVER&lt;br /&gt;
  \WEBSERVER&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7264</id>
		<title>Namestitev sistema</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Namestitev_sistema&amp;diff=7264"/>
		<updated>2023-02-01T14:30:25Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Zahteve strojne in programske opreme */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:Administracija sistema]]&lt;br /&gt;
== Zahteve strojne in programske opreme ==&lt;br /&gt;
Za uporabo sistema '''SDMS 4''' v omrežni verziji potrebujemo računalnike z operacijskim sistemom Windows.&lt;br /&gt;
&lt;br /&gt;
Za delovanje omrežne verzije je seveda potrebno tudi omrežje.&lt;br /&gt;
&lt;br /&gt;
Ostalih posebnih zahtev po strojni in programski opremi sicer ni. Načeloma sistem deluje na poljubnem sodobnem računalniku, seveda pa velja, da na hitrejšem računalniku deluje hitreje.&lt;br /&gt;
&lt;br /&gt;
== Namestitev sistema na strežnik ==&lt;br /&gt;
Prvi korak je namestitev samega sistema na strežnik. Postopek namestitve je naslednji:&lt;br /&gt;
&lt;br /&gt;
*Na računalnik se prijavimo kot uporabnik z administratorskimi pravicami.&lt;br /&gt;
*Iz namestitvenega CD-ROMa prenesemo na poljubni disk računalnika vsebino v enakem imeniškem sistemu kot je zapisana na CD-ROMu. V nadaljevanju bomo predpostavili, da je smo izbrali disk C in namestili sistem v izhodiščno mapo '''C:\SDMS'''.&lt;br /&gt;
*Pri prenosu datotek moramo posebej paziti, da datoteke ne ohranijo '''read-only''' atributa, ki ga imajo nastavljenega na CD-ROMu. Če imajo datoteke na disku slučajno nastavljen ta atribut, ga je treba ročno odstraniti.&lt;br /&gt;
*Priporočamo, da mapi '''C:\SDMS''' aktivirate skupno rabo (sharing), in sicer pod imenom '''SDMS'''. S tem se bo omogočil enostaven in varen dostop odjemalcev do sistema.&lt;br /&gt;
*Nato izvedemo namestitev gonilnika za zaščitni ključ. To storimo tako, da zaženemo program '''HLDRV32.EXE''', ki se nahaja v mapi '''C:\SDMS''', in sledimo namestitvi gonilnika, kakor nas vodi program.&lt;br /&gt;
*Po zaključeni namestitvi gonilnika vstavimo zaščitni ključ v LPT vrata na strežniku. Če imate kakšna vrata še prosta, uporabite le-ta, sicer pa priključite tiskalnik preko ključa.&lt;br /&gt;
*Na namizju Oken si ustvarimo bližnjico do programa '''CLIENT.EXE''', ki se nahaja v mapi '''C:\SDMS'''. Takšno bližnjico si bomo ustvarili tudi na vsakem računalniku, ki ga bomo uporabljali kot odjemalca.&lt;br /&gt;
*Nato s klikom na ikono programa zaženeno program. Ko prvič vstopamo v sistem, uporabimo uporabniško ime '''Administrator''' (ali krajše '''admin''') in prazno geslo, kasneje pa bo vsak uporabnik vstopal pod svojim imenom.&lt;br /&gt;
*Če je program pravilno nameščen, se nam odpre glavno okno programa. To nam za sedaj zadošča. Preden preidemo na nameščanje strežnika moramo program zapreti.&lt;br /&gt;
== Namestitev SDMS strežnika ==&lt;br /&gt;
SDMS strežnik se namesti kot sistemski servis. To pomeni, da se avtomatsko zažene takoj po zagonu samega računalnika, še preden se uporabnik prijavi v sistem. Strežnik ostane aktiven tudi potem, ko se uporabnik odjavi iz sistema. V tem načinu deluje strežnik popolnoma pritajeno (brez uporabniškega vmesnika).&lt;br /&gt;
&lt;br /&gt;
Ko smo namestili sistem SDMS na strežnik, nadaljujemo z namestitvijo SDMS strežnika takole:&lt;br /&gt;
&lt;br /&gt;
*V sistemsko mapo '''C:\WINNT\SYSTEM32''' prenesemo datoteke SDMS.EXE, SDMS.INI in SDMS.LIC.&lt;br /&gt;
*V urejevalniku besedila (Beležnica oz. Notepad) popravimo vsebino datoteke SDMS.INI tako, da je pot to baze podatkov pravilno navedena (tipično je to '''C:\SDMS\DATABASE''').&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''SDMS.EXE -INSTALL'''.&lt;br /&gt;
*Če se je strežnik pravilno namestil, se nam izpiše sporočilo. Sicer pa nekaj ni v redu, in za vzrok si je treba ogledati datoteko SDMS.LOG, ki se je kreirala v sistemki mapi '''C:\WINNT\SYSTEM32'''. Če te datoteke tam ni, si je potrebno ogledati datoteko SDMS-????-??-??.LOG, ki se je kreirala v mapi, kjer je baza podatkov (tipično '''C:\SDMS\DATABASE'''). Po odpravi vzroka napake ponovimo prejšnji korak.&lt;br /&gt;
*Iz komandne vrstice zaženemo ukaz: '''NET START SDMS'''.&lt;br /&gt;
*Če se je strežnik pravilno zagnal, se nam v komandni vrsici to tudi izpiše.&lt;br /&gt;
*Sedaj je SDMS strežnik pravilno nameščen in aktiven kot sistemski servis. Ob vsakem zagonu računalnika se bo avtomatsko zagnal tudi SDMS strežnik.&lt;br /&gt;
&lt;br /&gt;
== Namestitev odjemalcev ==&lt;br /&gt;
Na vsakem računalniku, kjer se bo uporabljal SDMS kot odjemalec, je priporočeno narediti trajno povezavo na mapo, kjer se nahaja SDMS odjemalec (z &amp;quot;Map network drive&amp;quot;). Primer: deljeno mapo \\SERVER\SDMS si namestimo kot disk G:.&lt;br /&gt;
&lt;br /&gt;
Za lažji zagon programa si lahko ustvarite bližnjico na na namizju (primer: G:\CLIENT.EXE).&lt;br /&gt;
&lt;br /&gt;
Nato poženite program '''CLIENT.EXE'''. Ko prvič vstopate v sistem, vnesite uporabniško ime '''admin''' in pustite geslo prazno, kasneje pa vaše ime in geslo pod katerim vstopate v sistem. Nato lahko (glede na licenčne pogoje) uporabljate aplikacije oz. razvojno orodje.&lt;br /&gt;
&lt;br /&gt;
== Namestitev Web strežnika ==&lt;br /&gt;
Će imate nabavljeno licenco SDMS WebServer, je potrebno instalirati tudi tega kot servis.&lt;br /&gt;
&lt;br /&gt;
C:\SDMS&lt;br /&gt;
  \DATABASE&lt;br /&gt;
  \CLIENT&lt;br /&gt;
  \SERVER&lt;br /&gt;
  \WEBSERVER&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7263</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7263"/>
		<updated>2021-03-12T13:49:03Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* xlsCV - cell value (posebne vrednosti celic) */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // ročno nastavimo širino prvega stolpca&lt;br /&gt;
  XLS.SetColumnWidth('A', 20)&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definicija konstant ==&lt;br /&gt;
=== xlsCV - cell value (posebne vrednosti celic) ===&lt;br /&gt;
  xlscvTrue       // bool TRUE&lt;br /&gt;
  xlscvFalse      // bool FALSE&lt;br /&gt;
  xlscvAutoColSum // avtomatski seštevek vseh numeričnih celic nad to celico&lt;br /&gt;
  xlscvAutoRowSum // avtomatski seštevek vseh numeričnih celic levo od te celice&lt;br /&gt;
&lt;br /&gt;
=== xlsNF - number format ===&lt;br /&gt;
Lahko se uporabi poljuben format namesto konstante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  // text&lt;br /&gt;
  xlsnfText = '@';&lt;br /&gt;
&lt;br /&gt;
  // stevilke&lt;br /&gt;
  xlsnfLong   = '0';&lt;br /&gt;
  xlsnfLongTS   = '#,##0';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1 = '0.0';&lt;br /&gt;
  xlsnfFloat2 = '0.00';&lt;br /&gt;
  xlsnfFloat3 = '0.000';&lt;br /&gt;
  xlsnfFloat4 = '0.0000';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1TS = '#,##0.0';&lt;br /&gt;
  xlsnfFloat2TS = '#,##0.00';&lt;br /&gt;
  xlsnfFloat3TS = '#,##0.000';&lt;br /&gt;
  xlsnfFloat4TS = '#,##0.0000';&lt;br /&gt;
&lt;br /&gt;
  // valute&lt;br /&gt;
  xlsnfEuroS = '#,##0.00 €';&lt;br /&gt;
  xlsnfEuroL = '#,##0.00 &amp;quot;EUR&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
  // datum/cas&lt;br /&gt;
  xlsnfDateTime = 'dd.mm.yyyy hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  xlsnfDateDMY     = 'd.m.yyyy';&lt;br /&gt;
  xlsnfDateDMYD    = 'd.m.yyyy (ddd)';&lt;br /&gt;
  xlsnfDateDDMMYY  = 'dd.mm.yyyy';&lt;br /&gt;
  xlsnfDateDDMMYYD = 'dd.mm.yyyy (dddd)';&lt;br /&gt;
  xlsnfDateIso     = 'yyyy-mm-dd';&lt;br /&gt;
&lt;br /&gt;
  xlsnfTimeHHMM   = 'hh:mm';&lt;br /&gt;
  xlsnfTimeHHMMSS = 'hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  // bool&lt;br /&gt;
  xlsnfBoolDa   = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;;';&lt;br /&gt;
  xlsnfBoolDaNe = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;&amp;quot;ne&amp;quot;;&amp;quot;ne&amp;quot;';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== xlsBT - border type ===&lt;br /&gt;
  xlsbtAll    // vsi robovi&lt;br /&gt;
  xlsbtVer    // vsi vertikalni robovi&lt;br /&gt;
  xlsbtHor    // vsi horizontalni robovi&lt;br /&gt;
  xlsbtLeft   // samo levi robovi&lt;br /&gt;
  xlsbtRight  // samo desni robovi&lt;br /&gt;
  xlsbtTop    // samo zgornji robovi&lt;br /&gt;
  xlsbtBottom // samo spodnji robovi&lt;br /&gt;
&lt;br /&gt;
=== xlsBS - border style ===&lt;br /&gt;
  xlsbsNone&lt;br /&gt;
  xlsbsThin&lt;br /&gt;
  xlsbsMedium&lt;br /&gt;
  xlsbsThick&lt;br /&gt;
  xlsbsUnchanged  // rob se ne spremeni&lt;br /&gt;
&lt;br /&gt;
=== xlsHA - hor align ===&lt;br /&gt;
  xlshaAuto   // poravnava se nastavi glede na vsebino: levo za tekst, desno za številke...&lt;br /&gt;
  xlshaLeft&lt;br /&gt;
  xlshaCenter&lt;br /&gt;
  xlshaRight&lt;br /&gt;
&lt;br /&gt;
=== xlsVA - ver align ===&lt;br /&gt;
  xlsvaTop&lt;br /&gt;
  xlsvaCenter&lt;br /&gt;
  xlsvaBottom&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7262</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7262"/>
		<updated>2021-03-12T13:47:23Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Definicija konstant */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // ročno nastavimo širino prvega stolpca&lt;br /&gt;
  XLS.SetColumnWidth('A', 20)&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definicija konstant ==&lt;br /&gt;
=== xlsCV - cell value (posebne vrednosti celic) ===&lt;br /&gt;
  xlscvTrue       = ':TRUE';&lt;br /&gt;
  xlscvFalse      = ':FALSE';&lt;br /&gt;
  xlscvAutoColSum = ':AUTOCOLSUM';&lt;br /&gt;
  xlscvAutoRowSum = ':AUTOROWSUM';&lt;br /&gt;
&lt;br /&gt;
=== xlsNF - number format ===&lt;br /&gt;
Lahko se uporabi poljuben format namesto konstante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  // text&lt;br /&gt;
  xlsnfText = '@';&lt;br /&gt;
&lt;br /&gt;
  // stevilke&lt;br /&gt;
  xlsnfLong   = '0';&lt;br /&gt;
  xlsnfLongTS   = '#,##0';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1 = '0.0';&lt;br /&gt;
  xlsnfFloat2 = '0.00';&lt;br /&gt;
  xlsnfFloat3 = '0.000';&lt;br /&gt;
  xlsnfFloat4 = '0.0000';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1TS = '#,##0.0';&lt;br /&gt;
  xlsnfFloat2TS = '#,##0.00';&lt;br /&gt;
  xlsnfFloat3TS = '#,##0.000';&lt;br /&gt;
  xlsnfFloat4TS = '#,##0.0000';&lt;br /&gt;
&lt;br /&gt;
  // valute&lt;br /&gt;
  xlsnfEuroS = '#,##0.00 €';&lt;br /&gt;
  xlsnfEuroL = '#,##0.00 &amp;quot;EUR&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
  // datum/cas&lt;br /&gt;
  xlsnfDateTime = 'dd.mm.yyyy hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  xlsnfDateDMY     = 'd.m.yyyy';&lt;br /&gt;
  xlsnfDateDMYD    = 'd.m.yyyy (ddd)';&lt;br /&gt;
  xlsnfDateDDMMYY  = 'dd.mm.yyyy';&lt;br /&gt;
  xlsnfDateDDMMYYD = 'dd.mm.yyyy (dddd)';&lt;br /&gt;
  xlsnfDateIso     = 'yyyy-mm-dd';&lt;br /&gt;
&lt;br /&gt;
  xlsnfTimeHHMM   = 'hh:mm';&lt;br /&gt;
  xlsnfTimeHHMMSS = 'hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  // bool&lt;br /&gt;
  xlsnfBoolDa   = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;;';&lt;br /&gt;
  xlsnfBoolDaNe = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;&amp;quot;ne&amp;quot;;&amp;quot;ne&amp;quot;';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== xlsBT - border type ===&lt;br /&gt;
  xlsbtAll    // vsi robovi&lt;br /&gt;
  xlsbtVer    // vsi vertikalni robovi&lt;br /&gt;
  xlsbtHor    // vsi horizontalni robovi&lt;br /&gt;
  xlsbtLeft   // samo levi robovi&lt;br /&gt;
  xlsbtRight  // samo desni robovi&lt;br /&gt;
  xlsbtTop    // samo zgornji robovi&lt;br /&gt;
  xlsbtBottom // samo spodnji robovi&lt;br /&gt;
&lt;br /&gt;
=== xlsBS - border style ===&lt;br /&gt;
  xlsbsNone&lt;br /&gt;
  xlsbsThin&lt;br /&gt;
  xlsbsMedium&lt;br /&gt;
  xlsbsThick&lt;br /&gt;
  xlsbsUnchanged  // rob se ne spremeni&lt;br /&gt;
&lt;br /&gt;
=== xlsHA - hor align ===&lt;br /&gt;
  xlshaAuto   // poravnava se nastavi glede na vsebino: levo za tekst, desno za številke...&lt;br /&gt;
  xlshaLeft&lt;br /&gt;
  xlshaCenter&lt;br /&gt;
  xlshaRight&lt;br /&gt;
&lt;br /&gt;
=== xlsVA - ver align ===&lt;br /&gt;
  xlsvaTop&lt;br /&gt;
  xlsvaCenter&lt;br /&gt;
  xlsvaBottom&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7261</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7261"/>
		<updated>2021-03-12T13:43:26Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Definicija konstant */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // ročno nastavimo širino prvega stolpca&lt;br /&gt;
  XLS.SetColumnWidth('A', 20)&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definicija konstant ==&lt;br /&gt;
=== CV - cell value (posebne vrednosti celic) ===&lt;br /&gt;
  xlscvTrue       = ':TRUE';&lt;br /&gt;
  xlscvFalse      = ':FALSE';&lt;br /&gt;
  xlscvAutoColSum = ':AUTOCOLSUM';&lt;br /&gt;
  xlscvAutoRowSum = ':AUTOROWSUM';&lt;br /&gt;
&lt;br /&gt;
=== NF - number format ===&lt;br /&gt;
Lahko se uporabi poljuben format namesto konstante.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  // text&lt;br /&gt;
  xlsnfText = '@';&lt;br /&gt;
&lt;br /&gt;
  // stevilke&lt;br /&gt;
  xlsnfLong   = '0';&lt;br /&gt;
  xlsnfLongTS   = '#,##0';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1 = '0.0';&lt;br /&gt;
  xlsnfFloat2 = '0.00';&lt;br /&gt;
  xlsnfFloat3 = '0.000';&lt;br /&gt;
  xlsnfFloat4 = '0.0000';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1TS = '#,##0.0';&lt;br /&gt;
  xlsnfFloat2TS = '#,##0.00';&lt;br /&gt;
  xlsnfFloat3TS = '#,##0.000';&lt;br /&gt;
  xlsnfFloat4TS = '#,##0.0000';&lt;br /&gt;
&lt;br /&gt;
  // valute&lt;br /&gt;
  xlsnfEuroS = '#,##0.00 €';&lt;br /&gt;
  xlsnfEuroL = '#,##0.00 &amp;quot;EUR&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
  // datum/cas&lt;br /&gt;
  xlsnfDateTime = 'dd.mm.yyyy hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  xlsnfDateDMY     = 'd.m.yyyy';&lt;br /&gt;
  xlsnfDateDMYD    = 'd.m.yyyy (ddd)';&lt;br /&gt;
  xlsnfDateDDMMYY  = 'dd.mm.yyyy';&lt;br /&gt;
  xlsnfDateDDMMYYD = 'dd.mm.yyyy (dddd)';&lt;br /&gt;
  xlsnfDateIso     = 'yyyy-mm-dd';&lt;br /&gt;
&lt;br /&gt;
  xlsnfTimeHHMM   = 'hh:mm';&lt;br /&gt;
  xlsnfTimeHHMMSS = 'hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  // bool&lt;br /&gt;
  xlsnfBoolDa   = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;;';&lt;br /&gt;
  xlsnfBoolDaNe = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;&amp;quot;ne&amp;quot;;&amp;quot;ne&amp;quot;';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BT - border type ===&lt;br /&gt;
  xlsbtAll&lt;br /&gt;
  xlsbtVer&lt;br /&gt;
  xlsbtHor&lt;br /&gt;
  xlsbtLeft&lt;br /&gt;
  xlsbtRight&lt;br /&gt;
  xlsbtTop&lt;br /&gt;
  xlsbtBottom&lt;br /&gt;
&lt;br /&gt;
=== BS - border style ===&lt;br /&gt;
  xlsbsNone&lt;br /&gt;
  xlsbsThin&lt;br /&gt;
  xlsbsMedium&lt;br /&gt;
  xlsbsThick&lt;br /&gt;
  xlsbsUnchanged&lt;br /&gt;
&lt;br /&gt;
=== HA - hor align ===&lt;br /&gt;
  xlshaAuto&lt;br /&gt;
  xlshaLeft&lt;br /&gt;
  xlshaCenter&lt;br /&gt;
  xlshaRight&lt;br /&gt;
&lt;br /&gt;
=== VA - ver align ===&lt;br /&gt;
  xlsvaTop&lt;br /&gt;
  xlsvaCenter&lt;br /&gt;
  xlsvaBottom&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7260</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7260"/>
		<updated>2021-03-12T12:36:01Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* NF - number format */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // ročno nastavimo širino prvega stolpca&lt;br /&gt;
  XLS.SetColumnWidth('A', 20)&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definicija konstant ==&lt;br /&gt;
=== CV - cell value (posebne vrednosti celic) ===&lt;br /&gt;
  xlscvTrue       = ':TRUE';&lt;br /&gt;
  xlscvFalse      = ':FALSE';&lt;br /&gt;
  xlscvAutoColSum = ':AUTOCOLSUM';&lt;br /&gt;
  xlscvAutoRowSum = ':AUTOROWSUM';&lt;br /&gt;
&lt;br /&gt;
=== NF - number format ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  // text&lt;br /&gt;
  xlsnfText = '@';&lt;br /&gt;
&lt;br /&gt;
  // stevilke&lt;br /&gt;
  xlsnfLong   = '0';&lt;br /&gt;
  xlsnfLongTS   = '#,##0';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1 = '0.0';&lt;br /&gt;
  xlsnfFloat2 = '0.00';&lt;br /&gt;
  xlsnfFloat3 = '0.000';&lt;br /&gt;
  xlsnfFloat4 = '0.0000';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1TS = '#,##0.0';&lt;br /&gt;
  xlsnfFloat2TS = '#,##0.00';&lt;br /&gt;
  xlsnfFloat3TS = '#,##0.000';&lt;br /&gt;
  xlsnfFloat4TS = '#,##0.0000';&lt;br /&gt;
&lt;br /&gt;
  // valute&lt;br /&gt;
  xlsnfEuroS = '#,##0.00 €';&lt;br /&gt;
  xlsnfEuroL = '#,##0.00 &amp;quot;EUR&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
  // datum/cas&lt;br /&gt;
  xlsnfDateTime = 'dd.mm.yyyy hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  xlsnfDateDMY     = 'd.m.yyyy';&lt;br /&gt;
  xlsnfDateDMYD    = 'd.m.yyyy (ddd)';&lt;br /&gt;
  xlsnfDateDDMMYY  = 'dd.mm.yyyy';&lt;br /&gt;
  xlsnfDateDDMMYYD = 'dd.mm.yyyy (dddd)';&lt;br /&gt;
  xlsnfDateIso     = 'yyyy-mm-dd';&lt;br /&gt;
&lt;br /&gt;
  xlsnfTimeHHMM   = 'hh:mm';&lt;br /&gt;
  xlsnfTimeHHMMSS = 'hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  // bool&lt;br /&gt;
  xlsnfBoolDa   = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;;';&lt;br /&gt;
  xlsnfBoolDaNe = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;&amp;quot;ne&amp;quot;;&amp;quot;ne&amp;quot;';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BT - border type ===&lt;br /&gt;
  xlsbtAll&lt;br /&gt;
  xlsbtVer&lt;br /&gt;
  xlsbtHor&lt;br /&gt;
  xlsbtLeft&lt;br /&gt;
  xlsbtRight&lt;br /&gt;
  xlsbtTop&lt;br /&gt;
  xlsbtBottom&lt;br /&gt;
&lt;br /&gt;
=== BS - border style ===&lt;br /&gt;
  xlsbsNone&lt;br /&gt;
  xlsbsThin&lt;br /&gt;
  xlsbsMedium&lt;br /&gt;
  xlsbsThick&lt;br /&gt;
  xlsbsUnchanged&lt;br /&gt;
&lt;br /&gt;
=== HA - hor align ===&lt;br /&gt;
  xlshaAuto&lt;br /&gt;
  xlshaLeft&lt;br /&gt;
  xlshaCenter&lt;br /&gt;
  xlshaRight&lt;br /&gt;
&lt;br /&gt;
=== VA - ver align ===&lt;br /&gt;
  xlsvaTop&lt;br /&gt;
  xlsvaCenter&lt;br /&gt;
  xlsvaBottom&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7259</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7259"/>
		<updated>2021-03-12T12:33:19Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Definicija konstant */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // ročno nastavimo širino prvega stolpca&lt;br /&gt;
  XLS.SetColumnWidth('A', 20)&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definicija konstant ==&lt;br /&gt;
=== CV - cell value (posebne vrednosti celic) ===&lt;br /&gt;
  xlscvTrue       = ':TRUE';&lt;br /&gt;
  xlscvFalse      = ':FALSE';&lt;br /&gt;
  xlscvAutoColSum = ':AUTOCOLSUM';&lt;br /&gt;
  xlscvAutoRowSum = ':AUTOROWSUM';&lt;br /&gt;
&lt;br /&gt;
=== NF - number format ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  // text&lt;br /&gt;
  xlsnfText = '@';&lt;br /&gt;
&lt;br /&gt;
  // stevilke&lt;br /&gt;
  xlsnfLong   = '0';&lt;br /&gt;
  xlsnfLongTS   = '#,##0';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1 = '0.0';&lt;br /&gt;
  xlsnfFloat2 = '0.00';&lt;br /&gt;
  xlsnfFloat3 = '0.000';&lt;br /&gt;
  xlsnfFloat4 = '0.0000';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1TS = '#,##0.0';&lt;br /&gt;
  xlsnfFloat2TS = '#,##0.00';&lt;br /&gt;
  xlsnfFloat3TS = '#,##0.000';&lt;br /&gt;
  xlsnfFloat4TS = '#,##0.0000';&lt;br /&gt;
&lt;br /&gt;
  // currency&lt;br /&gt;
  xlsnfEuroS = '#,##0.00 €';&lt;br /&gt;
  xlsnfEuroL = '#,##0.00 &amp;quot;EUR&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
  // datum/cas&lt;br /&gt;
  xlsnfDateTime = 'dd.mm.yyyy hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  xlsnfDateDMY     = 'd.m.yyyy';&lt;br /&gt;
  xlsnfDateDMYD    = 'd.m.yyyy (ddd)';&lt;br /&gt;
  xlsnfDateDDMMYY  = 'dd.mm.yyyy';&lt;br /&gt;
  xlsnfDateDDMMYYD = 'dd.mm.yyyy (dddd)';&lt;br /&gt;
  xlsnfDateIso     = 'yyyy-mm-dd';&lt;br /&gt;
&lt;br /&gt;
  xlsnfTimeHHMM   = 'hh:mm';&lt;br /&gt;
  xlsnfTimeHHMMSS = 'hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  // bool&lt;br /&gt;
  xlsnfBoolDa   = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;;';&lt;br /&gt;
  xlsnfBoolDaNe = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;&amp;quot;ne&amp;quot;;&amp;quot;ne&amp;quot;';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== BT - border type ===&lt;br /&gt;
  xlsbtAll&lt;br /&gt;
  xlsbtVer&lt;br /&gt;
  xlsbtHor&lt;br /&gt;
  xlsbtLeft&lt;br /&gt;
  xlsbtRight&lt;br /&gt;
  xlsbtTop&lt;br /&gt;
  xlsbtBottom&lt;br /&gt;
&lt;br /&gt;
=== BS - border style ===&lt;br /&gt;
  xlsbsNone&lt;br /&gt;
  xlsbsThin&lt;br /&gt;
  xlsbsMedium&lt;br /&gt;
  xlsbsThick&lt;br /&gt;
  xlsbsUnchanged&lt;br /&gt;
&lt;br /&gt;
=== HA - hor align ===&lt;br /&gt;
  xlshaAuto&lt;br /&gt;
  xlshaLeft&lt;br /&gt;
  xlshaCenter&lt;br /&gt;
  xlshaRight&lt;br /&gt;
&lt;br /&gt;
=== VA - ver align ===&lt;br /&gt;
  xlsvaTop&lt;br /&gt;
  xlsvaCenter&lt;br /&gt;
  xlsvaBottom&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7258</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7258"/>
		<updated>2021-03-12T12:29:18Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // ročno nastavimo širino prvega stolpca&lt;br /&gt;
  XLS.SetColumnWidth('A', 20)&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Definicija konstant ==&lt;br /&gt;
=== CV - cell value (posebne vrednosti celic) ===&lt;br /&gt;
  xlscvTrue       = ':TRUE';&lt;br /&gt;
  xlscvFalse      = ':FALSE';&lt;br /&gt;
  xlscvAutoColSum = ':AUTOCOLSUM';&lt;br /&gt;
  xlscvAutoRowSum = ':AUTOROWSUM';&lt;br /&gt;
&lt;br /&gt;
=== NF - number format ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  // text&lt;br /&gt;
  xlsnfText = '@';&lt;br /&gt;
&lt;br /&gt;
  // stevilke&lt;br /&gt;
  xlsnfLong   = '0';&lt;br /&gt;
  xlsnfLongTS   = '#,##0';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1 = '0.0';&lt;br /&gt;
  xlsnfFloat2 = '0.00';&lt;br /&gt;
  xlsnfFloat3 = '0.000';&lt;br /&gt;
  xlsnfFloat4 = '0.0000';&lt;br /&gt;
&lt;br /&gt;
  xlsnfFloat1TS = '#,##0.0';&lt;br /&gt;
  xlsnfFloat2TS = '#,##0.00';&lt;br /&gt;
  xlsnfFloat3TS = '#,##0.000';&lt;br /&gt;
  xlsnfFloat4TS = '#,##0.0000';&lt;br /&gt;
&lt;br /&gt;
  // currency&lt;br /&gt;
  xlsnfEuroS = '#,##0.00 €';&lt;br /&gt;
  xlsnfEuroL = '#,##0.00 &amp;quot;EUR&amp;quot;';&lt;br /&gt;
&lt;br /&gt;
  // datum/cas&lt;br /&gt;
  xlsnfDateTime = 'dd.mm.yyyy hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  xlsnfDateDMY     = 'd.m.yyyy';&lt;br /&gt;
  xlsnfDateDMYD    = 'd.m.yyyy (ddd)';&lt;br /&gt;
  xlsnfDateDDMMYY  = 'dd.mm.yyyy';&lt;br /&gt;
  xlsnfDateDDMMYYD = 'dd.mm.yyyy (dddd)';&lt;br /&gt;
  xlsnfDateIso     = 'yyyy-mm-dd';&lt;br /&gt;
&lt;br /&gt;
  xlsnfTimeHHMM   = 'hh:mm';&lt;br /&gt;
  xlsnfTimeHHMMSS = 'hh:mm:ss';&lt;br /&gt;
&lt;br /&gt;
  // bool&lt;br /&gt;
  xlsnfBoolDa   = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;;';&lt;br /&gt;
  xlsnfBoolDaNe = '&amp;quot;da&amp;quot;;&amp;quot;da&amp;quot;;&amp;quot;ne&amp;quot;;&amp;quot;ne&amp;quot;';&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7257</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7257"/>
		<updated>2021-03-11T16:07:14Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Osnovni primer */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // ročno nastavimo širino prvega stolpca&lt;br /&gt;
  XLS.SetColumnWidth('A', 20)&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7256</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7256"/>
		<updated>2021-03-11T16:06:43Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Prenos podatkov iz baze */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
  Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
    // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLS.Table.StyleTitle.HorAlign = xlshaCenter&lt;br /&gt;
  XLS.Table.StyleNormal.FontColor = Gray&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.') // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj' // v footerju bo fiksen tekst&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1') // fiksno nastavimo ime stolpca&lt;br /&gt;
&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2') // ime stolpca je ime polja&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3') // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7255</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7255"/>
		<updated>2021-03-11T15:50:54Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Prenos podatkov iz baze */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Osnovni primer ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub PrimerXLS&lt;br /&gt;
  Dim XLS As TXlsWriter&lt;br /&gt;
  Dim titleStyle, headerStyle, cellStyle, footerStyle As TXlsStyle&lt;br /&gt;
  Dim lefttopCell, rightbottomCell As TXlsCell&lt;br /&gt;
  Dim J As Long&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // spremenimo normal stil&lt;br /&gt;
  XLS.StyleNormal.FontSize = 12&lt;br /&gt;
  XLS.StyleNormal.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  // definiramo ostale stile po potrebi&lt;br /&gt;
  titleStyle = XLS.AddStyle('', XLS.StyleTitle)&lt;br /&gt;
  titleStyle.FontBold = False&lt;br /&gt;
  titleStyle.FontItalic = True&lt;br /&gt;
  titleStyle.FontSize = 20&lt;br /&gt;
  titleStyle.HorAlign = XlshaCenter&lt;br /&gt;
  titleStyle.FontName = 'Arial'&lt;br /&gt;
&lt;br /&gt;
  headerStyle = XLS.AddStyle('', XLS.StyleHeader)&lt;br /&gt;
  headerStyle.FontSize = 12&lt;br /&gt;
  headerStyle.HorAlign = xlshaAuto&lt;br /&gt;
&lt;br /&gt;
  footerStyle = XLS.AddStyle('', XLS.StyleFooter)&lt;br /&gt;
  footerStyle.FontSize = 12&lt;br /&gt;
  footerStyle.HorAlign = XlshaRight&lt;br /&gt;
  footerStyle.TextWrap = false&lt;br /&gt;
&lt;br /&gt;
  // zamrznemo stolpce in/ali vrstice&lt;br /&gt;
  XLS.SetFixedColumns(1)&lt;br /&gt;
  XLS.SetFixedRows(2)&lt;br /&gt;
&lt;br /&gt;
  // dodamo naslov&lt;br /&gt;
  XLS.AddCell('Naslov', xlsnfText, titleStyle)&lt;br /&gt;
  XLS.MergeCells('A1', 'E1') // združimo celice za naslov&lt;br /&gt;
&lt;br /&gt;
  // dodamo header vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('', xlsnfText, headerStyle)&lt;br /&gt;
  lefttopCell = XLS.GetCurCell // nastavimo referenco na zgoraj levo celico tabele&lt;br /&gt;
  XLS.AddCell('Stolpec A', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec B', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Stolpec C', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
&lt;br /&gt;
  // dodamo podatke v tabelo&lt;br /&gt;
  for J = 1 to 5&lt;br /&gt;
    XLS.AddRow&lt;br /&gt;
    XLS.AddCell('Vrstica ' + IntToStr(J), xlsnfText, headerStyle)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(IntToStr(Random(1000)), xlsnfLong, nil)&lt;br /&gt;
    XLS.AddCell(xlscvAutoRowSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic v levo&lt;br /&gt;
  next&lt;br /&gt;
&lt;br /&gt;
  // dodamo footer vrstico&lt;br /&gt;
  XLS.AddRow&lt;br /&gt;
  XLS.AddCell('Seštevek', xlsnfText, headerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle) // dodamo seštevek numeričnih celic navzgor&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  XLS.AddCell(xlscvAutoColSum, xlsnfLong, footerStyle)&lt;br /&gt;
  rightbottomCell = XLS.GetCurCell // nastavimo referenco na spodnjo desno celico tabele&lt;br /&gt;
&lt;br /&gt;
  // narišemo robove okoli headerja, footerja in okoli celotne tabele&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, lefttopCell.RelativeAddress(4,0), xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // header&lt;br /&gt;
  XLS.SetBorders(rightbottomCell.RelativeAddress(-4,0), rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // footer&lt;br /&gt;
  XLS.SetBorders(lefttopCell.Address, rightbottomCell.Address, xlsbtAll, xlsbsThick, xlsbsUnchanged, Black) // cela tabela&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear                                          // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.')                  // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj'                              // v footerju bo fiksen tekst&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1')       // fiksno nastavimo ime stolpca&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2')                   // ime stolpca je ime polja&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3')     // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum                       // v footerju bo vsota stolpca&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum                       // v footerju bo vsota stolpca&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum                       // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(0, -1), XLS.Table.RightTop.RelativeAddress(0, -1), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7254</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7254"/>
		<updated>2021-03-11T13:32:55Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Prenos podatkov iz baze ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Sub TabelaXLS&lt;br /&gt;
  Dim XLS As TXlsWriter, XLSF As TXlsField&lt;br /&gt;
  Dim L as TLayer&lt;br /&gt;
&lt;br /&gt;
  // inicializiramo writer in  prvi list&lt;br /&gt;
  XLS = CreateXlsWriter&lt;br /&gt;
  XLS.AddSheet('List 1')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo definicijo stolpcev&lt;br /&gt;
  XLS.Table.Clear                                          // prvi klic je opcijski, počisti definicijo stolpcev&lt;br /&gt;
  XLSF = XLS.Table.AddCounter('Zap. št.')                  // zapisi bodo oštevilceni&lt;br /&gt;
  XLSF.FooterValue = 'Skupaj'                              // v footerju bo fiksen tekst&lt;br /&gt;
  XLS.Table.AddFieldByName('Naslov polja', 'polje1')       // fiksno nastavimo ime stolpca&lt;br /&gt;
  XLS.Table.AddFieldByName('', 'polje2')                   // ime stolpca je ime polja&lt;br /&gt;
  XLSF = XLS.Table.AddFieldByName('Število', 'polje3')     // numerično polje&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum                       // v footerju bo vsota stolpca&lt;br /&gt;
  XLSF = XLS.Table.AddFormula('Vsota 3 in 4', 'IntToStr([polje3].AsNumber + [polje4].AsNumber)') // Basic formula&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum                       // v footerju bo vsota stolpca&lt;br /&gt;
  XLSF = XLS.Table.AddValue('Vsota levo', xlscvAutoRowSum) // v stolpcu bo vsota številk v vrstici&lt;br /&gt;
  XLSF.FooterValue = xlscvAutoColSum                       // v footerju bo vsota stolpca&lt;br /&gt;
&lt;br /&gt;
  // pripravimo podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 10')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
&lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // dodamo nov list&lt;br /&gt;
  XLS.AddSheet('List 2')&lt;br /&gt;
&lt;br /&gt;
  // pripravimo nove podatke&lt;br /&gt;
  L = [Layer]&lt;br /&gt;
  L.Filter.ExecuteSQL('[polje1] = 20')&lt;br /&gt;
  L.Sort.Load('Default')&lt;br /&gt;
  L.Sort.Execute&lt;br /&gt;
  &lt;br /&gt;
  // zapišemo podatke po dani definiciji&lt;br /&gt;
  XLS.Table.AddRecordList('Naslov', L.FilteredRecords) // naslov je opcijski&lt;br /&gt;
&lt;br /&gt;
  // nastavimo še robove celic&lt;br /&gt;
  RoboviXLS(XLS)&lt;br /&gt;
&lt;br /&gt;
  // shranimo v file in sprostimo writer&lt;br /&gt;
  XLS.SaveToFile('c:\temp\test.xlsx')&lt;br /&gt;
  XLS.Destroy&lt;br /&gt;
EndSub&lt;br /&gt;
&lt;br /&gt;
Sub RoboviXLS(XLS As TXlsWriter)&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.RelativeAddress(-1,0), XLS.Table.RightTop.RelativeAddress(-1,0), xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba naslova&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtHor, xlsbsUnchanged, xlsbsThin, Black) // horizontalne črte jedra tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightTop.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba headerja&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftTop.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba tabele&lt;br /&gt;
  XLS.SetBorders(XLS.Table.LeftBottom.Address, XLS.Table.RightBottom.Address, xlsbtAll, xlsbsMedium, xlsbsUnchanged, Black) // obroba footerja&lt;br /&gt;
EndSub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7253</id>
		<title>Izvoz v XLSX</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Izvoz_v_XLSX&amp;diff=7253"/>
		<updated>2021-03-11T10:21:49Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: Nova stran z vsebino: == CRS*.XML (transformacije koordinatnih sistemov) == Transformacije koordinatnih sistemov so vgrajene v sam program. Parametri za Helmertovo 7-parametrsko transformacijo pa...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CRS*.XML (transformacije koordinatnih sistemov) ==&lt;br /&gt;
Transformacije koordinatnih sistemov so vgrajene v sam program. Parametri za Helmertovo 7-parametrsko transformacijo pa se lahko podajo v XML datoteki.&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;crs&amp;gt;&lt;br /&gt;
  &amp;lt;projection&amp;gt;&lt;br /&gt;
    &amp;lt;prcode&amp;gt;SI-D48&amp;lt;/prcode&amp;gt;&lt;br /&gt;
    &amp;lt;transformation&amp;gt;&lt;br /&gt;
      &amp;lt;trcode&amp;gt;GURS-08&amp;lt;/trcode&amp;gt;&lt;br /&gt;
      &amp;lt;trnote&amp;gt;Cela Slovenija (15-125cm)&amp;lt;/trnote&amp;gt;&lt;br /&gt;
      &amp;lt;trtowgs&amp;gt;409.545, 72.164, 486.872, 3.085957, 5.469110, -11.020289, 17.919665&amp;lt;/trtowgs&amp;gt;&lt;br /&gt;
      &amp;lt;trtocrs&amp;gt;-473.862, -124.587, -413.576, -4.730807, -2.380796, 11.786482, -10.645117&amp;lt;/trtocrs&amp;gt;&lt;br /&gt;
      &amp;lt;trtest&amp;gt;SITRANET, 16, 0, 0, 46, 0, 0, 577825.261, 95579.074&amp;lt;/trtest&amp;gt;&lt;br /&gt;
    &amp;lt;/transformation&amp;gt;&lt;br /&gt;
  &amp;lt;/projection&amp;gt;&lt;br /&gt;
&amp;lt;/crs&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TMS*.XML (definicije tile map servisov) ==&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;tms&amp;gt;&lt;br /&gt;
  &amp;lt;service&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;OSM&amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;OSM - OpenStreetMap&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;server&amp;gt;a.tile.openstreetmap.org&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;server&amp;gt;b.tile.openstreetmap.org&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;server&amp;gt;c.tile.openstreetmap.org&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;levels&amp;gt;&lt;br /&gt;
      &amp;lt;codes&amp;gt;0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19&amp;lt;/codes&amp;gt;&lt;br /&gt;
      &amp;lt;link&amp;gt;/%Z/%X/%Y.png&amp;lt;/link&amp;gt;&lt;br /&gt;
    &amp;lt;/levels&amp;gt;&lt;br /&gt;
    &amp;lt;format&amp;gt;png&amp;lt;/format&amp;gt;&lt;br /&gt;
    &amp;lt;validity&amp;gt;7&amp;lt;/validity&amp;gt;&lt;br /&gt;
  &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/tms&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga SERVICE ===&lt;br /&gt;
*CODE (1) - koda, ki naj bo unikatna in naj se nikoli ne spremeni&lt;br /&gt;
*NAME (1) - opisno ime, tudi unikatno, da se pri izbiri lahko ločijo med sabo&lt;br /&gt;
*CRS (0..1) - koda koordinatnega sistema, za kode poglej v CRS.XML (privzeto WGS-84)&lt;br /&gt;
*ORIGIN (0..1) - izhodišče sistema, TOP za levo-zgoraj ali BOTTOM za levo-spodaj (privzeto TOP)&lt;br /&gt;
*ORIGINX (0..1) - koordinata izhodišča sistema (levo) (privzeto 0)&lt;br /&gt;
*ORIGINY (0..1) - koordinata izhodišča sistema (zgoraj/spodaj) (privzeto 0)&lt;br /&gt;
*PIXELSIZE (0..1) - dimenzije piksla v metrih na prvem nivoju (privzeto 104857.6)&lt;br /&gt;
*TILESIZE (0..1) - dimenzija slike v pikslih (privzeto 256)&lt;br /&gt;
*FORMAT (1) - format slike, JPG, PNG ali TIF&lt;br /&gt;
*VALIDITY (0..1) - število dni do ponovnega preverjanja veljavnosti (privzeto 7)&lt;br /&gt;
*CHROMACOLORHEX (0..1) - barva, ki se naj spremeni v prozorno, npr. FFFFFE (privzeto 0)&lt;br /&gt;
*CHROMATOLERANCE (0..1) - toleranca, za prozornost, npr. 1 (privzeto 0)&lt;br /&gt;
*TOPLEVELINDEX (0..1) - index nivoja, na katerem se začnejo karte (če želimo ignorirati zgornje nivoje) (privzeto 0)&lt;br /&gt;
*SERVER (1..N) - naslovi strežnikov&lt;br /&gt;
*LEVELS (1..N) - definicije nivojev&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga LEVELS ===&lt;br /&gt;
*CODES (1) - seznam šifer nivojev, ločenih z vejico&lt;br /&gt;
*LINK (1) - povezava na sliko, kjer se % sekvence nadomeščajo z dejanskimi vrednosti&lt;br /&gt;
&lt;br /&gt;
=== % sekvence ===&lt;br /&gt;
*%Z se nadomesti s šifro nivoja&lt;br /&gt;
*%X se nadomesti s horizontalnim indeksom slike&lt;br /&gt;
*%Y se nadomesti z vertikalnim indeksom slike&lt;br /&gt;
*%Q se nadomesti s quad-tree nazivom slike&lt;br /&gt;
&lt;br /&gt;
== CTR*.XML (definicije barvnih transformacij) ==&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;cts&amp;gt;&lt;br /&gt;
  &amp;lt;ct&amp;gt;&lt;br /&gt;
    &amp;lt;ctcode&amp;gt;1&amp;lt;/ctcode&amp;gt;&lt;br /&gt;
    &amp;lt;ctname&amp;gt;Cyan, Orange - 8 Bands&amp;lt;/ctname&amp;gt;&lt;br /&gt;
    &amp;lt;ctlinear&amp;gt;true&amp;lt;/ctlinear&amp;gt;&lt;br /&gt;
    &amp;lt;ctshadow&amp;gt;NW&amp;lt;/ctshadow&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;   0, 806000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 100, 808000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 200, A0A000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 300, C0C000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 400, F0F000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 600, CAE8DD&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 800, 55AAFF&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;1000, 4484DD&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;1300, 337CCE&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;1700, 2967AB&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;2100, 1A416C&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;2900, 4A484D&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
  &amp;lt;/ct&amp;gt;&lt;br /&gt;
&amp;lt;/cts&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Parametri taga CT ===&lt;br /&gt;
*CTCODE (1) - koda barvne transformacije&lt;br /&gt;
*CTNAME (1) - opisno ime barvne transformacije&lt;br /&gt;
*CTLINEAR (0..1) - ali se vrednosti med dvema barvama linearno prelivajo (privzeto false)&lt;br /&gt;
*CTSHADOW (0..1) - smer osvetlitve za senčenje NW, N, NE, W, E, SW, S, SE (privzeto se ne senči)&lt;br /&gt;
*CTPAIR (1..N) - seznam parov vrednost,barva (primer 200,FF00FF)&lt;br /&gt;
&lt;br /&gt;
== XML struktura piramide ==&lt;br /&gt;
=== Uporaba ===&lt;br /&gt;
'''PyramidBuildAll(Code As String)''' ponovno naloži XML datoteko, izdela vse nivoje in sestavi piramido.&lt;br /&gt;
&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;store&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;Ortofoto (GURS-50cm)&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;tilesize&amp;gt;512&amp;lt;/tilesize&amp;gt;&lt;br /&gt;
  &amp;lt;crs&amp;gt;SI-D48&amp;lt;/crs&amp;gt;&lt;br /&gt;
  &amp;lt;format&amp;gt;jpg,75&amp;lt;/format&amp;gt;&lt;br /&gt;
  &amp;lt;minscale&amp;gt;100&amp;lt;/minscale&amp;gt;&lt;br /&gt;
  &amp;lt;sourcepath&amp;gt;D:\Podatki\Rasters\DOF-GURS\TM050&amp;lt;/sourcepath&amp;gt;&lt;br /&gt;
  &amp;lt;targetpath&amp;gt;D:\Podatki\Rasters\DOF-GURS\TM050&amp;lt;/targetpath&amp;gt;&lt;br /&gt;
  &amp;lt;level&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;050x001&amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;pixelsize&amp;gt;0.50&amp;lt;/pixelsize&amp;gt;&lt;br /&gt;
    &amp;lt;maxscale&amp;gt;5000&amp;lt;/maxscale&amp;gt;&lt;br /&gt;
    &amp;lt;build&amp;gt;files,,,000000,FFFFFF,1&amp;lt;/build&amp;gt;&lt;br /&gt;
  &amp;lt;/level&amp;gt;&lt;br /&gt;
  &amp;lt;level&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;050x002&amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;pixelsizemul&amp;gt;2&amp;lt;/pixelsizemul&amp;gt;&lt;br /&gt;
    &amp;lt;maxscalemul&amp;gt;2&amp;lt;/maxscalemul&amp;gt;&lt;br /&gt;
    &amp;lt;build&amp;gt;level&amp;lt;/build&amp;gt;&lt;br /&gt;
  &amp;lt;/level&amp;gt;&lt;br /&gt;
&amp;lt;/store&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga STORE ===&lt;br /&gt;
&lt;br /&gt;
*NAME (1) - opisno ime, mora biti unikatno, da se pri izbiri lahko ločijo med sabo&lt;br /&gt;
*CRS (1) - koda koordinatnega sistema, za kode poglej v CRS.XML (privzeto WGS-84), trenutno se še ne uporablja&lt;br /&gt;
*TILESIZE (1) - velikost tilov v pikslih&lt;br /&gt;
*FORMAT (1) - format tilov, TG4, LZW ali JPG (ki ima lahko dodatno še kvaliteto 0-100)&lt;br /&gt;
*MINSCALE (0..1) - minimalno merilo, do katere se piramida izrisuje&lt;br /&gt;
*COLOR (0..1) - barva za črnobele slike pri TG4, na primer FF00FF&lt;br /&gt;
*CHROMA (0..1) - barva in toleraca za prozornost, na primer FFFFFF,10&lt;br /&gt;
*SOURCEPATH (0..1) - predpona, ki se doda mapam vhodnih datotek za build&lt;br /&gt;
*TARGETPATH (0..1) - mapa, kamor se shranijo vmesni rezultati builda (nivoji)&lt;br /&gt;
*BUILDWINDOW (0..1) - okno, ki oklepa piramido, za optimizacijo builda (privzeto 250000,0,750000,250000)&lt;br /&gt;
*LEVEL (1..N) - definicije izdelave nivojev&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga LEVEL ===&lt;br /&gt;
*CODE (1) - unikatna koda nivoja&lt;br /&gt;
*PIXELSIZE (0..1) - velikost piksla v metrih, obvezno podana na prvem nivoju; če ni podana, je dvojna vrednost prejšnjega nivoja &lt;br /&gt;
*PIXELSIZEMUL (0..1) - če je podan PIXELSIZE, se množi s to vrednostjo (privzeto 1)&lt;br /&gt;
*PIXELSIZEDIV (0..1) - če je podan PIXELSIZE, se deli s to vrednostjo (privzeto 1)&lt;br /&gt;
*MAXSCALE (0..1) - največje merilo izrisa tega nivoja, obvezno podana na prvem nivoju; če ni podana, je dvojna vrednost prejšnjega nivoja&lt;br /&gt;
*MAXSCALEMUL (0..1) - če je podan MAXSCALE, se množi s to vrednostjo (privzeto 1)&lt;br /&gt;
*PREPAINT (0..1) - &lt;br /&gt;
*BUILD (0..N) - navodila za kreiranje nivoja, obvezna na prvem nivoju (privzeto LEVEL)&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga BUILD ===&lt;br /&gt;
Parametri so ločeni z vejico. &lt;br /&gt;
*FILES,mapa,filter,barva,chroma,toleranca&lt;br /&gt;
**mapa (0..1) - &lt;br /&gt;
**filter (0..1) - &lt;br /&gt;
**barva (0..1) - &lt;br /&gt;
**chroma (0..1) - &lt;br /&gt;
**toleranca (0..1) - &lt;br /&gt;
*LIST,seznam,barva,chroma,toleranca&lt;br /&gt;
**seznam (1) - ascii datoteka s seznamom kart&lt;br /&gt;
**barva (0..1) - &lt;br /&gt;
**chroma (0..1) - &lt;br /&gt;
**toleranca (0..1) - &lt;br /&gt;
*LEVEL,koda&lt;br /&gt;
**koda (0..1) - koda nivoja, iz katerega se reducira trenutni nivo (privzeto prejšnji nivo)&lt;br /&gt;
*GRID,grid,polje,transformacija&lt;br /&gt;
**grid (1) - ime xml datoteke z definicijo grida&lt;br /&gt;
**polje (1) - indeks polja iz grida, ki naj se uporabi&lt;br /&gt;
**transformacija (1) - koda barvne transformacije&lt;br /&gt;
*DRAW,tematika,ymin,xmin,ymax,xmax&lt;br /&gt;
**tematika (1) - ime tematike, ki naj se izriše&lt;br /&gt;
**ymin, xmin, ymax, xmax (1) - okno izrisa&lt;br /&gt;
&lt;br /&gt;
== XML struktura grida ==&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;grid&amp;gt;&lt;br /&gt;
  &amp;lt;Crs&amp;gt;SI-D48&amp;lt;/Crs&amp;gt;&lt;br /&gt;
  &amp;lt;OriginY&amp;gt;371200&amp;lt;/OriginY&amp;gt;&lt;br /&gt;
  &amp;lt;OriginX&amp;gt;25600&amp;lt;/OriginX&amp;gt;&lt;br /&gt;
  &amp;lt;TileCountY&amp;gt;20&amp;lt;/TileCountY&amp;gt;&lt;br /&gt;
  &amp;lt;TileCountX&amp;gt;14&amp;lt;/TileCountX&amp;gt;&lt;br /&gt;
  &amp;lt;CellCountY&amp;gt;512&amp;lt;/CellCountY&amp;gt;&lt;br /&gt;
  &amp;lt;CellCountX&amp;gt;512&amp;lt;/CellCountX&amp;gt;&lt;br /&gt;
  &amp;lt;CellDimenY&amp;gt;25&amp;lt;/CellDimenY&amp;gt;&lt;br /&gt;
  &amp;lt;CellDimenX&amp;gt;25&amp;lt;/CellDimenX&amp;gt;&lt;br /&gt;
  &amp;lt;CellField&amp;gt;I02,100,-600&amp;lt;/CellField&amp;gt;&lt;br /&gt;
  &amp;lt;CellField&amp;gt;I02,100,+300&amp;lt;/CellField&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Parametri taga GRID ===&lt;br /&gt;
*...&lt;br /&gt;
*...&lt;br /&gt;
=== Parametri taga CELLFIELD ===&lt;br /&gt;
*TIP (1): tip polja, ena od vrednosti: W01,W02,W04,I01,I02,I04,F04,F08&lt;br /&gt;
*FAKTOR (0..1): celoštevilčni množitelj vrednosti, za optimizacijo&lt;br /&gt;
*DELTA (0..1): celoštevilčni dodatek vrednosti, za optimizacijo&lt;br /&gt;
&lt;br /&gt;
Interna vrednost polja se računa po formuli:&lt;br /&gt;
*interna vrednost = (realna vrednost + delta) * faktor&lt;br /&gt;
&lt;br /&gt;
=== Primer grida za transformacijo koordinat ===&lt;br /&gt;
Primer XML datoteke (SI-D96;SI-D48):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;WINDOWS-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
	&amp;lt;Crs&amp;gt;SI-D96&amp;lt;/Crs&amp;gt;&lt;br /&gt;
	&amp;lt;OriginY&amp;gt;370000&amp;lt;/OriginY&amp;gt;&lt;br /&gt;
	&amp;lt;OriginX&amp;gt;25000&amp;lt;/OriginX&amp;gt;&lt;br /&gt;
	&amp;lt;CellDimenY&amp;gt;500&amp;lt;/CellDimenY&amp;gt;&lt;br /&gt;
	&amp;lt;CellDimenX&amp;gt;500&amp;lt;/CellDimenX&amp;gt;&lt;br /&gt;
	&amp;lt;TileCountY&amp;gt;1&amp;lt;/TileCountY&amp;gt;&lt;br /&gt;
	&amp;lt;TileCountX&amp;gt;1&amp;lt;/TileCountX&amp;gt;&lt;br /&gt;
	&amp;lt;CellCountY&amp;gt;520&amp;lt;/CellCountY&amp;gt;&lt;br /&gt;
	&amp;lt;CellCountX&amp;gt;340&amp;lt;/CellCountX&amp;gt;&lt;br /&gt;
	&amp;lt;CellField&amp;gt;I02,1000,-370&amp;lt;/CellField&amp;gt;&lt;br /&gt;
	&amp;lt;CellField&amp;gt;I02,1000,+485&amp;lt;/CellField&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Procedura za izračun grida:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dim G As TGrid, IY, IX As Long, Y1, X1, X2, Y2 As Float&lt;br /&gt;
G = CreateGrid(ProgramPath + 'QTS;SI-D96;SI-D48.XML')&lt;br /&gt;
If Assigned(G) Then&lt;br /&gt;
  CRSToCRSParams('SI-D48', 'SI-D96')&lt;br /&gt;
  For IY = 0 To G.TileCountY * G.CellCountY - 1&lt;br /&gt;
    Y1 = G.OriginY + IY * G.CellDimenY + G.CellDimenY / 2&lt;br /&gt;
    For IX = 0 To G.TileCountX * G.CellCountX - 1&lt;br /&gt;
      X1 = G.OriginX + IX * G.CellDimenX + G.CellDimenX / 2&lt;br /&gt;
      CRSToCRS(Y1, X1, Y2, X2)&lt;br /&gt;
      G.CellValue(Y1, X1, 0) = Y2 - Y1&lt;br /&gt;
      G.CellValue(Y1, X1, 1) = X2 - X1&lt;br /&gt;
    Next&lt;br /&gt;
  Next&lt;br /&gt;
  G.Save&lt;br /&gt;
  G.Destroy&lt;br /&gt;
EndIf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Glavna_stran&amp;diff=7252</id>
		<title>Glavna stran</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Glavna_stran&amp;diff=7252"/>
		<updated>2021-03-11T10:19:51Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__ __NOEDITSECTION__ &lt;br /&gt;
&lt;br /&gt;
{| cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;width:240px; border:1px solid #cef2e0; background-color:#f8ffff; vertical-align:top; padding: 4px;&amp;quot; | &amp;lt;!-- begin1 --&amp;gt;&amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Splošno&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;margin: 0px; padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[O geografskih informacijskih sistemih]] &lt;br /&gt;
&lt;br /&gt;
[[O sistemu SDMS]] &lt;br /&gt;
&lt;br /&gt;
[[Razlike in prednosti proti SDMS-W]] &lt;br /&gt;
&lt;br /&gt;
[[Osnovni principi dela]] &lt;br /&gt;
&lt;br /&gt;
[[Pogosta vprašanja]] &lt;br /&gt;
&lt;br /&gt;
[[Splošno]] &lt;br /&gt;
&lt;br /&gt;
[[Osnovno okno programa]] &lt;br /&gt;
[[Zagon programa in prijava v sistem]]&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Administracija&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Namestitev sistema]] &lt;br /&gt;
&lt;br /&gt;
[[Posodabljanje sistema]] &lt;br /&gt;
&lt;br /&gt;
[[Varovanje podatkov]] &lt;br /&gt;
&lt;br /&gt;
[[Varovanje programa]]&lt;br /&gt;
&lt;br /&gt;
[[Zagonski parametri]]&lt;br /&gt;
&lt;br /&gt;
[[Struktura XML datotek]]&lt;br /&gt;
&lt;br /&gt;
[[Izvoz v XLSX]]&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Razvoj programa&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Zgodovina verzij]]&amp;lt;br&amp;gt; &lt;br /&gt;
&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Razvoj modulov&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Modul Rastri]] &lt;br /&gt;
&lt;br /&gt;
[[Modul Analiza sistema]] &lt;br /&gt;
&lt;br /&gt;
[[Uporabne rutine]] &lt;br /&gt;
&lt;br /&gt;
[[LGB]] &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Razvoj spletnih aplikacij&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[SDMS WebServer]] &lt;br /&gt;
&amp;lt;/div&amp;gt; &amp;lt;!-- end1 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:10px;&amp;quot; | &amp;lt;!-- line1 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:1px; background-color:#000000;&amp;quot; | &amp;lt;!-- line1 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:10px;&amp;quot; | &amp;lt;!-- line1 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:240px; border:1px solid #cef2e0; background-color:#f5fffa; vertical-align:top; padding:4px;&amp;quot; | &amp;lt;!-- begin2 --&amp;gt;&amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Razvoj aplikacij&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Raziskovalec]] &lt;br /&gt;
&lt;br /&gt;
:[[Urejevalnik aplikacije]] &lt;br /&gt;
:[[Urejevalnik hitrih tipk]] &lt;br /&gt;
:'''[[Urejevalnik menija]]''' &lt;br /&gt;
:[[Urejevalnik modula]] &lt;br /&gt;
:[[Urejevalnik orodjarne]] &lt;br /&gt;
:[[Urejevalnik dialoga]]&lt;br /&gt;
&lt;br /&gt;
:[[Urejevalnik tabele]]&lt;br /&gt;
&lt;br /&gt;
:[[Urejevalnik podatkovne plasti]] &lt;br /&gt;
::[[Urejevalnik niza podatkov]] &lt;br /&gt;
::[[Urejevalnik indeksa]] &lt;br /&gt;
::[[Urejevalnik filtra]] &lt;br /&gt;
::[[Urejevalnik sortiranja]] &lt;br /&gt;
::[[Urejevalnik maske]] &lt;br /&gt;
::[[Urejevalnik poročila]] &lt;br /&gt;
::[[Urejevalnik uvoza podatkov]] &lt;br /&gt;
::[[Urejevalnik izvoza podatkov]] &lt;br /&gt;
:[[Urejevalnik predloge izrisa]] &lt;br /&gt;
:[[Urejevalnik tematike]]&lt;br /&gt;
&lt;br /&gt;
:[[Urejevalnik šrafure]] &lt;br /&gt;
:[[Urejevalnik simbola]] &lt;br /&gt;
:[[Urejevalnik tipa linije]]&lt;br /&gt;
&lt;br /&gt;
:[[Urejevalnik skupine uporabnikov]] &lt;br /&gt;
:[[Urejevalnik uporabnika]]&lt;br /&gt;
&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;SDMS BASIC&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[SDMS BASIC]] &lt;br /&gt;
&lt;br /&gt;
[[Operatorji]] &lt;br /&gt;
[[Podpora rastrskih formatov]]&amp;lt;/div&amp;gt;&amp;lt;!-- end2 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:10px;&amp;quot; | &amp;lt;!-- line2 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:1px; background-color:#000000;&amp;quot; | &amp;lt;!-- line2 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:10px;&amp;quot; | &amp;lt;!-- line2 --&amp;gt; &lt;br /&gt;
| style=&amp;quot;width:240px; border:1px solid #cedff2;background-color:#f5faff;vertical-align:top; padding:4px;&amp;quot; | &amp;lt;!-- begin3 --&amp;gt;&amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Uporaba aplikacije&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Aplikacija]] &lt;br /&gt;
&lt;br /&gt;
:[[Tematika]] &lt;br /&gt;
:Pomožna okna: &lt;br /&gt;
:[[Aplikacija - Tematika]] &lt;br /&gt;
:[[Aplikacija - Informacije]] &lt;br /&gt;
:[[Aplikacija - GED]] &lt;br /&gt;
:[[Aplikacija - CC]] &lt;br /&gt;
:[[Aplikacija - AV]] &lt;br /&gt;
:[[Aplikacija - VID]]&lt;br /&gt;
&lt;br /&gt;
[[Analiza - filtiranje podatkov]] &lt;br /&gt;
&lt;br /&gt;
[[Nastavitve ekrana]] &lt;br /&gt;
&lt;br /&gt;
[[Predpregled poročila]] &lt;br /&gt;
&lt;br /&gt;
[[Predpregled pred izrisom na risalnik]] &lt;br /&gt;
&lt;br /&gt;
[[Prostorsko preseki - overlay]] &lt;br /&gt;
&lt;br /&gt;
[[Topologija na splošno]] &lt;br /&gt;
&lt;br /&gt;
[[Ukazna vrstica]] &lt;br /&gt;
&lt;br /&gt;
[[Urejanje atributnih podatkov]] &lt;br /&gt;
&lt;br /&gt;
[[Urejanje podatkov]] &lt;br /&gt;
[[Urejanje vektorskih podatkov]]&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;margin: 0px; background-color:#d2ffff; font-size:120%; font-weight:bold; border:1px solid #a3bfb1; padding:2px 5px;&amp;quot;&amp;gt;Primeri aplikacij&amp;lt;/div&amp;gt; &amp;lt;div style=&amp;quot;padding: 0px 6px 16px 6px;&amp;quot;&amp;gt;&lt;br /&gt;
[[Aplikacija EPRESS]] &lt;br /&gt;
&lt;br /&gt;
[[Aplikacija GEODEZIJA]] &lt;br /&gt;
[[Aplikacija GEOSTAT]]&amp;lt;/div&amp;gt;&amp;lt;!-- end3 --&amp;gt;&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7251</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7251"/>
		<updated>2019-08-23T07:35:03Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podatki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike v clipboard.&lt;br /&gt;
&lt;br /&gt;
Tudi WebServer.AddPyramid ukazi se v novi aplikaciji ignorirajo, tako da je treba  piramid dodati ročno.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke - font: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence;opcijsko xxx;opcijsko merilo&amp;quot;'''&lt;br /&gt;
 Za točke - simbol: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;svg;faktor;xxx;barva simbola;opcijsko xxx;opcijsko xxx;opcijsko rotacija;opcijsko merilo&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije;opcijski stil; opcijsko merilo&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije;opcijski stil; opcijsko merilo&amp;quot;'''&lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;opcijska sirina sence v px;opcijska barva sence;opcijsko merilo&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
 Za zoom: polje '''offline-zoom-offset''' z definicijo '''&amp;quot;offset za zoom&amp;quot;'''&lt;br /&gt;
 Za search: polje '''offline-search''' z definicijo '''&amp;quot;iskalne besede&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
offline-icon &amp;quot;lens;mi;8;n;red;2;white&amp;quot;&lt;br /&gt;
offline-line &amp;quot;4;yellow&amp;quot;&lt;br /&gt;
offline-fill &amp;quot;rgba(0,0,255,0.5);1;blue&amp;quot;&lt;br /&gt;
offline-text &amp;quot;napis;Roboto;12;n;green;2;white&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7248</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7248"/>
		<updated>2019-02-01T14:30:13Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podatki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike v clipboard.&lt;br /&gt;
&lt;br /&gt;
Tudi WebServer.AddPyramid ukazi se v novi aplikaciji ignorirajo, tako da je treba  piramid dodati ročno.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
 Za zoom: polje '''offline-zoom-offset''' z definicijo '''&amp;quot;offset za zoom&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
offline-icon &amp;quot;lens;mi;8;n;red;2;white&amp;quot;&lt;br /&gt;
offline-line &amp;quot;4;yellow&amp;quot;&lt;br /&gt;
offline-fill &amp;quot;rgba(0,0,255,0.5);1;blue&amp;quot;&lt;br /&gt;
offline-text &amp;quot;napis;Roboto;12;n;green;2;white&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7247</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7247"/>
		<updated>2019-01-30T13:49:15Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike v clipboard.&lt;br /&gt;
&lt;br /&gt;
Tudi WebServer.AddPyramid ukazi se v novi aplikaciji ignorirajo, tako da je treba  piramid dodati ročno.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
offline-icon &amp;quot;lens;mi;8;n;red;2;white&amp;quot;&lt;br /&gt;
offline-line &amp;quot;4;yellow&amp;quot;&lt;br /&gt;
offline-fill &amp;quot;rgba(0,0,255,0.5);1;blue&amp;quot;&lt;br /&gt;
offline-text &amp;quot;napis;Roboto;12;n;green;2;white&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7246</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7246"/>
		<updated>2019-01-30T12:50:06Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podatki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike v clipboard.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
offline-icon &amp;quot;lens;mi;8;n;red;2;white&amp;quot;&lt;br /&gt;
offline-line &amp;quot;4;yellow&amp;quot;&lt;br /&gt;
offline-fill &amp;quot;rgba(0,0,255,0.5);1;blue&amp;quot;&lt;br /&gt;
offline-text &amp;quot;napis;Roboto;12;n;green;2;white&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7245</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7245"/>
		<updated>2019-01-30T12:49:42Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike v clipboard.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt; &lt;br /&gt;
offline-icon &amp;quot;lens;mi;8;n;red;2;white&amp;quot;&lt;br /&gt;
offline-line &amp;quot;4;yellow&amp;quot;&lt;br /&gt;
offline-fill &amp;quot;rgba(0,0,255,0.5);1;blue&amp;quot;&lt;br /&gt;
offline-text &amp;quot;napis;Roboto;12;n;green;2;white&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7244</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7244"/>
		<updated>2019-01-30T12:40:30Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podatki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt; &lt;br /&gt;
offline-icon &amp;quot;lens;mi;8;n;red;2;white&amp;quot;&lt;br /&gt;
offline-line &amp;quot;4;yellow&amp;quot;&lt;br /&gt;
offline-fill &amp;quot;rgba(0,0,255,0.5);1;blue&amp;quot;&lt;br /&gt;
offline-text &amp;quot;napis;Roboto;12;n;green;2;white&amp;quot;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7243</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7243"/>
		<updated>2019-01-30T12:37:13Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7242</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7242"/>
		<updated>2019-01-30T12:36:57Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
Obstaja tudi SDMS basic funkcija ConvertWebInfo, ki prenese stare informacije za web iz tematike.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7241</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7241"/>
		<updated>2019-01-30T12:35:10Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podloge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'opcijski filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7240</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7240"/>
		<updated>2019-01-30T11:29:44Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podatki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za font simbolov se lahko vnese '''mi''' za Material Icons [https://material.io/tools/icons/?style=baseline] ali '''fa''' za FontAwesome [https://origin.fontawesome.com/icons].&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija [https://www.w3schools.com/cssref/css_colors.asp]: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0).&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7239</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7239"/>
		<updated>2019-01-30T11:22:45Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podatki */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom '''WI.SetOfflineData([plast], 'iskanje')'''&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
V sami plasti je potrebno dodati polja, ki določajo, kako se podatki v offline načinu izrisujejo.&lt;br /&gt;
&lt;br /&gt;
 Za točke: polje '''offline-icon''' z definicijo '''&amp;quot;ime simbola;font mi ali fa;velikost v px;stil n ali b;barva simbola;opcijska sirina sence v px;opcijska barva sence&amp;quot;'''&lt;br /&gt;
 Za polilinije: polje '''offline-line''' z definicijo '''&amp;quot;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 Za poligone: polje '''offline-fill''' z definicijo '''&amp;quot;barva polnjenja;debelina linije v px;barva linije&amp;quot;'''&lt;br /&gt;
 &lt;br /&gt;
 Za napise: polje '''offline-text''' z definicijo '''&amp;quot;napis;Roboto;velikost v px;stil n ali b;barva napisa;sirina sence v px;barva sence&amp;quot;'''&lt;br /&gt;
&lt;br /&gt;
Za barve se lahko vnese katerakoli veljavna CSS notacija: LightRed, #FF0000, rgb(255,0,0), rgba(255,0,0,1.0), glej šš[[https://www.w3schools.com/cssref/css_colors.asp]]&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7238</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7238"/>
		<updated>2019-01-30T11:09:28Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Splošna opravila */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna dodatna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7237</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7237"/>
		<updated>2019-01-30T11:09:03Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Splošno */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošna opravila ==&lt;br /&gt;
Na mapi Database\WebServer se ustvari novo mapo 2018.&lt;br /&gt;
Nanjo se prekopira logo-*.png datoteke, ki so bile pri stari aplikaciji na rootu.&lt;br /&gt;
Nanjo se prekopira custom.js in custom.css iz mape SDMSWSP\WebServer\2018 in se ju primerno prilagodi.&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7236</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7236"/>
		<updated>2019-01-30T11:04:44Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Offline podloge */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošno ==&lt;br /&gt;
2018/logo*&lt;br /&gt;
2018/custom.js&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), ne pozabite tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline pologe enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, minpixdim).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakokrat, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja s klicom povezave &amp;quot;http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7235</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7235"/>
		<updated>2019-01-30T11:02:33Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošno ==&lt;br /&gt;
2018/logo*&lt;br /&gt;
2018/custom.js&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline elemente piramid enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, limit).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakič, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja klicom &amp;quot;povezave http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7234</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7234"/>
		<updated>2019-01-30T11:00:30Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošno ==&lt;br /&gt;
2018/logo*&lt;br /&gt;
2018/custom.js&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
  WI = WebServer.AddWebItem('',         'g-maps',   'Osnovne karte',     '',       True,  1.0, '*', '*')&lt;br /&gt;
  WI = WebServer.AddWebItem('g-maps',   'm:gm-m',     'Google Maps',     'Google', False, 1.0, '*', '-') WI.SetTms('GM-M')&lt;br /&gt;
  WI = WebServer.AddWebItem('g-maps',   'm:dof',      'DOF Slovenija',   'GURS',   True,  1.0, '*', '*') WI.SetPyramid('DOF-GURS')&lt;br /&gt;
  WI = WebServer.AddWebItem('g-maps',   'm:dmr',      'DMR Slovenija',   'GURS',   False, 1.0, '*', '-') WI.SetPyramid('DMR-GURS')&lt;br /&gt;
&lt;br /&gt;
  WI = WebServer.AddWebItem('',         'g-sp',     'Splošne vsebine',   '',       True,  1.0, '*', '-')&lt;br /&gt;
  WI = WebServer.AddWebItem('g-sp',     'dkn',        'Dkn',             'pa',     False, 1.0, '*', '-') WI.SetDrawItem('dkn')&lt;br /&gt;
  WI = WebServer.AddWebItem('g-sp',     'op',         'Opombe',          'op',     True,  1.0, '*', '*') WI.SetDrawItem('op')&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline elemente piramid enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, limit).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakič, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja klicom &amp;quot;povezave http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7233</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7233"/>
		<updated>2019-01-30T10:56:33Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošno ==&lt;br /&gt;
2018/logo*&lt;br /&gt;
2018/custom.js&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
 Parametri funkcije AddWebItem&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline elemente piramid enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, limit).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakič, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja klicom &amp;quot;povezave http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7232</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7232"/>
		<updated>2019-01-30T10:55:32Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018: Tematika */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošno ==&lt;br /&gt;
2018/logo*&lt;br /&gt;
2018/custom.js&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se pripravi kot prej, le da se v njej ne vnaša polja 'Informacije za web'. To polje se ignorira. Še vedno pa se uporabljata polji 'Dodatno ime' (obvezno) in 'Pravice' (opcijsko).&lt;br /&gt;
&lt;br /&gt;
Kar je bilo prej določeno v informacijah za web, se sedaj določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Parametri funkcije AddWebItem:&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Priporočamo striktno poravnavanje parametrov po kolonah, da se ohrani preglednost.&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline elemente piramid enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, limit).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakič, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja klicom &amp;quot;povezave http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7231</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7231"/>
		<updated>2019-01-30T10:16:04Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* 2018 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Splošno ==&lt;br /&gt;
2018/logo*&lt;br /&gt;
2018/custom.js&lt;br /&gt;
&lt;br /&gt;
== 2018: Tematika ==&lt;br /&gt;
Tematika za novo aplikacijo se določa v modulu SDMSWSP v funkciji OnCreate z dodajanjem elementov tipa TWebItem.&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
Dim WI As TWebItem&lt;br /&gt;
WI = WebServer.AddWebItem(A, B, C, D, E, F, G, H)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Parametri funkcije AddWebItem:&lt;br /&gt;
 A: (string) koda mape, na katero želimo vstaviti dani element, prazen string za root&lt;br /&gt;
 B: (string) koda elementa, ki mora biti unikatna(!); za 'radio gumbe' se doda predpona xxx:, kjer je xxx ime skupine gumbov, vsaka grupa gumbov naj ima natanko en gump privzeto viden (E)&lt;br /&gt;
 C: (string) ime elementa (napis)&lt;br /&gt;
 D: (string) legenda za dani element, ki naj vsebuje tudi copyright informacijo, lahko v HTML obliki&lt;br /&gt;
 E: (boolean) privzeta vidnost elementa&lt;br /&gt;
 F: (double) transparentnost podlog, 0-1, privzeto 1, lahko se določi na mapah in kartah&lt;br /&gt;
 G: (string) pravice za uporabo v online načinu: z vejico ločen seznam security tagov, vsi = '*', nihče = '-'; dodatne natančnejše pravice za prikaz pa so lahko nastavljene tudi v tematiki&lt;br /&gt;
 H: (string) pravice za uporabo v offline načinu: velja enako kot pri (G)&lt;br /&gt;
&lt;br /&gt;
Tako ustvarimo nov element (referenca nanj je v spremenljivki WI).&lt;br /&gt;
&lt;br /&gt;
Če gre za element, ki predstavlja skupino elementov, ne potrebujemo narediti nič več.&lt;br /&gt;
Če gre za element, ki je povezan s piramido, to storimo z WI.SetPyramid('koda piramide')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetPyramid('dof2018')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s spletnimi kartami, to storimo z WI.SetTms('koda spletnih kart')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetTms('gm-s')&amp;lt;/source&amp;gt;&lt;br /&gt;
Če gre za element, ki je povezan s temo/temami tematke, to storimo z WI.SetDrawItem('alias teme/tem')&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetDrawItem('parcele')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podloge ==&lt;br /&gt;
Novost je možnost uporabe podlog (piramide) v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu piramide določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 relevantno območje, kar je izjemno pomembno narediti pravilno, da se čimbolj omeji količina potrebnih kart za prenos v cache&lt;br /&gt;
&lt;br /&gt;
Definicija relevantnega območja se določa za vse offline elemente piramid enotno z ukazom WebServer.AddOfflineArea([plast], 'filter', offset, limit).&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
WebServer.AddOfflineArea([plast poligonov], 'filter', 0, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast linij], 'filter', 50, 0)&lt;br /&gt;
WebServer.AddOfflineArea([plast točk], 'filter', 200, 0)&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsakič, ko se ta defincija spremeni, je potrebno izvesti preračun relevantnega območja klicom &amp;quot;povezave http://streznik/api/2018/prepareofflinemapsinfo&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== 2018: Offline podatki ==&lt;br /&gt;
Novost je možnost uporabe podatkov v offline načinu.&lt;br /&gt;
&lt;br /&gt;
Za to je treba elementu teme določiti:&lt;br /&gt;
 pravico offline uporabe(parameter H), tudi za nadrejene skupine&lt;br /&gt;
 povezavo na dejanske podatke z ukazom WI.SetOfflineData([plast], 'iskanje') &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;WI.SetOfflineData([parcele], 'Default')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7230</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7230"/>
		<updated>2019-01-30T09:14:09Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 2018 ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7229</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7229"/>
		<updated>2017-12-13T11:21:10Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt takole: ENCRYPTED:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7228</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7228"/>
		<updated>2017-12-13T11:18:42Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // brez izhodnega gesla&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // vnesi geslo za key, razbij na dve datoteki: cert.pem in key.pem&lt;br /&gt;
Geslo kodiraj z EncryptPassord in shrani v password.txt: Encrypted:geslo&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7227</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7227"/>
		<updated>2017-12-13T11:14:33Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&amp;lt;source&amp;gt;&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // vnesi geslo za key, razbij na dve datoteke&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // brez gesla&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7226</id>
		<title>SDMS WebServer</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=SDMS_WebServer&amp;diff=7226"/>
		<updated>2017-12-13T11:13:00Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Namestitev */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
[[Kategorije:WebServer]]&lt;br /&gt;
== Namestitev ==&lt;br /&gt;
'''SDMS WebServer''' se namesti tako:&lt;br /&gt;
*pripravi se novo mapo, kjer bo instaliran strežnik '''SDMS Webserver''', recimo '''''C:\SDMS\WEBSERVER'''''&lt;br /&gt;
*preko ftp protokola se iz naslova '''''www.sdms.si/update/sdms41/sdmswsp/en''''' (uporabnik anonymous) se nanjo prenese vse datoteke&lt;br /&gt;
*datoteko sdmswsp.txt se kopira v sdmswsp.ini&lt;br /&gt;
*pravilno se nastavi parametre, predvsem parameter '''path'''&lt;br /&gt;
*za uporabo varnih povezav (https) se namesti certifikat strežnika, za navodila glej spodaj&lt;br /&gt;
*servis se instalira iz konzolne vrstice z ukazom '''''sdmswsp -install'''''&lt;br /&gt;
*ob uspešni instalaciji servisa se to izpiše v okencu, sicer pa je prišlo do problema, ki je razviden v log datoteki&lt;br /&gt;
*servis se zažene z ukazom '''''sdmswsp -start'''''&lt;br /&gt;
*ob uspešnem zagonu se to izpiše v konzolnem oknu&lt;br /&gt;
*nikakor ne smete pozabiti omogočiti uporabo želenih vrat (80, 443, ...) v požarnem zidu.&lt;br /&gt;
&lt;br /&gt;
Strežnik je sedaj nameščen in zagnan.&lt;br /&gt;
&lt;br /&gt;
=== Namestitev certifikata ===&lt;br /&gt;
Če se bo uporabljala varna povezava (https), je potrebno pridobiti in namestiti tudi certifikat strežnika. Pripravi se mapo, na katero se bo kopiral certifikat, lahko pa se ga kopira tudi kar na mapo programa. Pripravi se naslednje ASCII datoteke:&lt;br /&gt;
*'''''root.pem''''' - certifikat verifikacijskega strežnika&lt;br /&gt;
*'''''cert.pem''''' - certifikat strežnika&lt;br /&gt;
*'''''key.pem''''' - zakodiran privatni ključ strežnika&lt;br /&gt;
*'''''password.txt''''' - geslo za dekodiranje privatnega ključa&lt;br /&gt;
&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out root.pem -cacerts        // vnesi geslo za key, razbij na dve datoteke&lt;br /&gt;
openssl pkcs12 -in xxx.pfx -out certandkey.pem -clcerts  // brez gesla&lt;br /&gt;
&lt;br /&gt;
Kasneje se v modulu določi tudi pot do datotek certifikata.&lt;br /&gt;
&lt;br /&gt;
== Aktivacija ==&lt;br /&gt;
'''SDMS WebServer''' se aktivira tako, da se v SDMS raziskovalcu doda nov modul z imenom '''SdmsWSP''' in naslednjo vsebino:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', '')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo dodati tudi dostop preko varne povezave (https), to storimo takole:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath)&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Če želimo zagotoviti uporabo varne povezave (https) in izvesti samodejno preusmeritev nanjo:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnCreate&lt;br /&gt;
  WebServer.Clear&lt;br /&gt;
  WebServer.AddHost(80, '', '', '', 'http').SetRedirect('https://www.test.si/')&lt;br /&gt;
  WebServer.AddHost(443, '', '', '', 'https').SetSecure(ProgramPath + 'Certifikat\')&lt;br /&gt;
  WebServer.Start&lt;br /&gt;
  ...&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Pri uporabi varne povezave (https) je seveda nujno predhodno namestiti veljaven certifikat strežnika.&lt;br /&gt;
&lt;br /&gt;
== Osnovne nastavitve ==&lt;br /&gt;
Strežniku moramo podati ime, ki se prikaže kot naslov strani. Uporablja se tudi kot identifikacija strežnika, če je ta potrebna.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Name = 'TEST'&amp;lt;/source&amp;gt;&lt;br /&gt;
Ob prijavi se uporabniku prikaže logotip velikosti 480x120 pik. Datoteko se shrani na mapo WebServer in takole poda njeno ime.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Logo = 'logo.png'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Privzeto dopušča SDMS WebServer dostop samo SDMS uporabnikom. Če želimo dodati tudi možnost anonimnega dostopa, to storimo tako:&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.User = [Gost]&amp;lt;/source&amp;gt;&lt;br /&gt;
Pri tem je '''Gost''' (oz. poljubno drugo ime) SDMS uporabnik, ki se bo uporabljal za anonimne dostope. Tega uporabnika moramo seveda dodati in mu prirediti pravice.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba osnovno okno, ki se prikaže uporabniku ob prvem zagonu.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.Window = '370000,25000,630000,200000'&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Določiti je treba tematiko, ki se bo uporabljala za izris.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.DrawList = [Web Tematika]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodati je treba plasti, po katerih za izvaja iskanje in izpis podatkov.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddSearch([Plast A].Search('Default'))&lt;br /&gt;
WebServer.AddSearch([Plast B].Search('Default'))&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dobro je dodati tudi seznam priljubljenih lokacij, ki so dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLocation('Slovenija', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Ljubljana', '370000,25000,630000,200000', '')&lt;br /&gt;
WebServer.AddLocation('Maribor', '370000,25000,630000,200000', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Možno je dodati tudi seznam dodatnih povezav, ki so ravno tako dostopne iz menija.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLink('Softdata Home Page', 'http://www.softdata.si', '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dodamo tudi seznam dodatnih izrisov za tiskanje.&lt;br /&gt;
&amp;lt;source&amp;gt;WebServer.AddLayout([A4 Pokončno], '')&lt;br /&gt;
WebServer.AddLayout([A4 Ležeče], '')&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Napredne nastavitve ==&lt;br /&gt;
&lt;br /&gt;
Ob prijavi lahko določene nastavitve spremenimo glede na prijavljenega uporabnika. To storimo tako, da dodamo novo proceduro:&lt;br /&gt;
&amp;lt;source&amp;gt;Sub OnWebLogin&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('noweb', False) Then&lt;br /&gt;
    WebServer.User = Nil // določenim uporabnikom preprečimo dostop&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
  If User.MatchSecurityTags('ljubljana', False) Then&lt;br /&gt;
    WebServer.Logo = 'logo-lj.png' // določenim uporabnikom pokažemo drug logotip&lt;br /&gt;
    WebServer.Window = '510000,120000,630000,200000' // in drugo osnovno okno&lt;br /&gt;
    WebServer.DrawList = [Web Tematika LJ] // ter drugo tematiko&lt;br /&gt;
  EndIf&lt;br /&gt;
&lt;br /&gt;
EndSub&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Priprava tematike ==&lt;br /&gt;
Tematiko se pripravi kot sicer. Izjemnega pomena pa je, da se tematika v vseh merilih in z vsemi vključenimi temami vedno izriše hitro, torej v rangu recimo 3 sekund (kar je že precej). Optimalno bi bilo pod 1 sekundo.&lt;br /&gt;
&lt;br /&gt;
Dodati je potrebno še določene informacije za spletno aplikacijo. Te se dodajo v atrubutih posameznih tem.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Alias - Dodatno ime ====&lt;br /&gt;
Teme se v spletni aplikaciji ne prižigajo/ugašajo posamezno, temveč skupinsko (in to niso iste skupine kot v client aplikaciji). Skupine določimo poljubno z neko kratko oznako, recimo '''''karte''''', '''''vod''''', '''''tocke''''',... Vsem temam določimo v atributu '''Dodatno ime''' eno oznako, na katero se ta tema vklopi/izklopi. Če tema nima oznake, se nikoli ne prikaže. Če želimo temo prikazati vedno, vnesemo za znak '''*'''.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: View tags ====&lt;br /&gt;
Namen tega atributa je omejevanje vpogleda v podatke glede na uporabnika.&lt;br /&gt;
&lt;br /&gt;
==== Atribut: Web info ====&lt;br /&gt;
V tem atributu določimo prej omenjene skupine. To storimo večvrstično v naslednji obliki:&lt;br /&gt;
&amp;lt;source&amp;gt;item=karte&lt;br /&gt;
name=Pregledne karte&lt;br /&gt;
sort=1&lt;br /&gt;
show=1&lt;br /&gt;
hint=...&lt;br /&gt;
icon=a.gif&amp;lt;/source&amp;gt;&lt;br /&gt;
Vsaka oznaka se mora pojaviti natanko v eni temi, ni pomembno kateri. Iz teh informacij se potem generira menu za vklop/izklop v spletni aplikaciji. Prve štiri vrstice so obvezne.&lt;br /&gt;
&lt;br /&gt;
== Priprava iskanj in izpisov ==&lt;br /&gt;
Iskanje po poljubnih podatkih se pripravi v urejevalniku podatkovne plasti (Searches). V modulu SdmsWSP pa z ukazom AddSearch dodajamo le tiste, ki jih želimo uporabljati v spletni aplikaciji.&lt;br /&gt;
...&lt;br /&gt;
&lt;br /&gt;
== Nastavljanje pravic ==&lt;br /&gt;
Pri spletni aplikaciji je možno nastaviti različne nivoje dostopa (izris na karti, iskanje, izpis podatkov) glede na prijavljenega uporabnika.&lt;br /&gt;
&lt;br /&gt;
V ta namen se uporablja kratke oznake, ki jih umenujemo '''Security tags'''.&lt;br /&gt;
&lt;br /&gt;
=== Dodeljevanje pravic===&lt;br /&gt;
Te oznake se za uporabnika določa v urejevalniku uporabnika oz. v urejevalniku skupine uporabnikov (možno je tudi v varnostnem središču).&lt;br /&gt;
&lt;br /&gt;
Vsak uporabnik/skupina ima lahko določenih več oznak, ki so ločene z vejico.&lt;br /&gt;
&lt;br /&gt;
Uporabnik poleg svojih oznak dobi tudi vse oznake vseh skupin, v katerih je član.&lt;br /&gt;
&lt;br /&gt;
=== Omejevanje pravic===&lt;br /&gt;
Na splošno velja naslednje:&lt;br /&gt;
*za vpoglede (tematika, vpogled preko iskanja/klika) velja, da če oznaka ni določena, imajo vpogled vsi, sicer pa samo tisti z oznako,&lt;br /&gt;
*za urejanja (dodajanje, popravljanje, brisanje) velja, da če oznaka ni določena, ne more urejati nihče, sicer pa samo tisti z oznako.&lt;br /&gt;
&lt;br /&gt;
Pravice se omejuje:&lt;br /&gt;
*v tematiki:&lt;br /&gt;
**v atributu teme View tags&lt;br /&gt;
**v atrubutu teme Web info, v vrstici view=&lt;br /&gt;
&lt;br /&gt;
*pri definiciji iskanja v podatkovni plasti:&lt;br /&gt;
**View access&lt;br /&gt;
**Append access&lt;br /&gt;
**Update access&lt;br /&gt;
**Delete access&lt;br /&gt;
**View in Update access pri posameznih poljih&lt;br /&gt;
&lt;br /&gt;
*v SDMS Basicu, ukaz je MatchSecurityTags.&lt;br /&gt;
&lt;br /&gt;
Vedno lahko določimo tudi več oznak, ločenih z vejico.&lt;br /&gt;
&lt;br /&gt;
== TODO ==&lt;br /&gt;
*SQL pogoj filtra, uporabljenega v searchu se ne upošteva pri kliku&lt;br /&gt;
*dvonivojski sistem pri vsebinah za izris&lt;br /&gt;
*multiple datasete pri maski (vsaj view)&lt;br /&gt;
*images naj dela tudi za spisek datotek (RO)&lt;br /&gt;
&lt;br /&gt;
== Statične strani ==&lt;br /&gt;
*.htm, *.js, *.css&lt;br /&gt;
&lt;br /&gt;
== Dinamične strani ==&lt;br /&gt;
*.ssp&lt;br /&gt;
&lt;br /&gt;
== Dinamične direktne povezave ==&lt;br /&gt;
=== MAP.GIF, MAP.JPG, MAP.PNG ===&lt;br /&gt;
To je najbolj uporabljan URL, ki nam vrne izdelano sliko (karto). Potrebni so naslednji parametri (ali piškotki):&lt;br /&gt;
:position=W,H,Y1,X1,Y2,X2&lt;br /&gt;
::širina in višina slike v pikslih ter okno karte v koordinatah. Razmerje slike in okna naj bo pravilno. To je nujen parameter, alternativa pa so lahko parametri y, x, scale, width, height (vsi).&lt;br /&gt;
:drawlist=A,B,C,...&lt;br /&gt;
::tematika oz. seznam tematik, ki se naložijo. To je nujen parameter, alternativno pa se to lahko izvede tudi v proceduri command.&lt;br /&gt;
:drawshow=A,B,C,...&lt;br /&gt;
::če je ta parameter podan, se v tematiki vklopijo za izris samo tiste teme, ki imajo kot dodatno ime kakšno vrednost iz seznama.&lt;br /&gt;
:command=C&lt;br /&gt;
::če je ta parameter podan, se naveden ukaz izvede pred samim izrisom karte. Ukaz je lahko samo uporabniško definirana procedura (SUB) brez parametrov.&lt;br /&gt;
:y=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa y koordinato centra karte.&lt;br /&gt;
:x=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa x koordinato centra karte.&lt;br /&gt;
:scale=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa merilo izrisa karte.&lt;br /&gt;
:width=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa širino slike v pikslih.&lt;br /&gt;
:height=N&lt;br /&gt;
::ta parameter je lahko alternativa parametru position, pomeni pa višino slike v pikslih.&lt;br /&gt;
:dpi=N&lt;br /&gt;
::ta parameter je lahko podan, kadar bi želeli sliko v drugi resoluciji od  privzete 96 DPI.&lt;br /&gt;
&lt;br /&gt;
=== FUNCTION.* ===&lt;br /&gt;
To je tudi zelo pogosto uporabljen URL, ki vrne tekst, ki ga je izdelala uporabniško definirana funkcija tipa TStringList.&lt;br /&gt;
:function=F&lt;br /&gt;
::ta parameter je nujen, pomeni pa ime funkcije, ki se kliče.&lt;br /&gt;
&lt;br /&gt;
=== SEARCH.DLL ===&lt;br /&gt;
Izvede splošno iskanje po (full text search) in vrne zadetke.&lt;br /&gt;
:query=KLJUČNE BESEDE&lt;br /&gt;
::seznam ključnih besed za iskanje, ločenih s presledki&lt;br /&gt;
:category=KAT1,KAT2,KAT3&lt;br /&gt;
::seznam kategorij, po katerih se vrši iskanje (če je prazen, se vrši po vseh)&lt;br /&gt;
:hits=10&lt;br /&gt;
::maksimalno število zadetkov&lt;br /&gt;
:template=JSON&lt;br /&gt;
::ime templata, ki opredeljuje obliko zadetkov&lt;br /&gt;
AddSearch ...&lt;br /&gt;
Pred iskanjem se zažene še OnWebSearch...&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Struktura_XML_datotek&amp;diff=7213</id>
		<title>Struktura XML datotek</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Struktura_XML_datotek&amp;diff=7213"/>
		<updated>2015-11-12T13:13:28Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Primer grida za transformacijo koordinat */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== CRS*.XML (transformacije koordinatnih sistemov) ==&lt;br /&gt;
Transformacije koordinatnih sistemov so vgrajene v sam program. Parametri za Helmertovo 7-parametrsko transformacijo pa se lahko podajo v XML datoteki.&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;crs&amp;gt;&lt;br /&gt;
  &amp;lt;projection&amp;gt;&lt;br /&gt;
    &amp;lt;prcode&amp;gt;SI-D48&amp;lt;/prcode&amp;gt;&lt;br /&gt;
    &amp;lt;transformation&amp;gt;&lt;br /&gt;
      &amp;lt;trcode&amp;gt;GURS-08&amp;lt;/trcode&amp;gt;&lt;br /&gt;
      &amp;lt;trnote&amp;gt;Cela Slovenija (15-125cm)&amp;lt;/trnote&amp;gt;&lt;br /&gt;
      &amp;lt;trtowgs&amp;gt;409.545, 72.164, 486.872, 3.085957, 5.469110, -11.020289, 17.919665&amp;lt;/trtowgs&amp;gt;&lt;br /&gt;
      &amp;lt;trtocrs&amp;gt;-473.862, -124.587, -413.576, -4.730807, -2.380796, 11.786482, -10.645117&amp;lt;/trtocrs&amp;gt;&lt;br /&gt;
      &amp;lt;trtest&amp;gt;SITRANET, 16, 0, 0, 46, 0, 0, 577825.261, 95579.074&amp;lt;/trtest&amp;gt;&lt;br /&gt;
    &amp;lt;/transformation&amp;gt;&lt;br /&gt;
  &amp;lt;/projection&amp;gt;&lt;br /&gt;
&amp;lt;/crs&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== TMS*.XML (definicije tile map servisov) ==&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;tms&amp;gt;&lt;br /&gt;
  &amp;lt;service&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;OSM&amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;name&amp;gt;OSM - OpenStreetMap&amp;lt;/name&amp;gt;&lt;br /&gt;
    &amp;lt;server&amp;gt;a.tile.openstreetmap.org&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;server&amp;gt;b.tile.openstreetmap.org&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;server&amp;gt;c.tile.openstreetmap.org&amp;lt;/server&amp;gt;&lt;br /&gt;
    &amp;lt;levels&amp;gt;&lt;br /&gt;
      &amp;lt;codes&amp;gt;0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19&amp;lt;/codes&amp;gt;&lt;br /&gt;
      &amp;lt;link&amp;gt;/%Z/%X/%Y.png&amp;lt;/link&amp;gt;&lt;br /&gt;
    &amp;lt;/levels&amp;gt;&lt;br /&gt;
    &amp;lt;format&amp;gt;png&amp;lt;/format&amp;gt;&lt;br /&gt;
    &amp;lt;validity&amp;gt;7&amp;lt;/validity&amp;gt;&lt;br /&gt;
  &amp;lt;/service&amp;gt;&lt;br /&gt;
&amp;lt;/tms&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga SERVICE ===&lt;br /&gt;
*CODE (1) - koda, ki naj bo unikatna in naj se nikoli ne spremeni&lt;br /&gt;
*NAME (1) - opisno ime, tudi unikatno, da se pri izbiri lahko ločijo med sabo&lt;br /&gt;
*CRS (0..1) - koda koordinatnega sistema, za kode poglej v CRS.XML (privzeto WGS-84)&lt;br /&gt;
*ORIGIN (0..1) - izhodišče sistema, TOP za levo-zgoraj ali BOTTOM za levo-spodaj (privzeto TOP)&lt;br /&gt;
*ORIGINX (0..1) - koordinata izhodišča sistema (levo) (privzeto 0)&lt;br /&gt;
*ORIGINY (0..1) - koordinata izhodišča sistema (zgoraj/spodaj) (privzeto 0)&lt;br /&gt;
*PIXELSIZE (0..1) - dimenzije piksla v metrih na prvem nivoju (privzeto 104857.6)&lt;br /&gt;
*TILESIZE (0..1) - dimenzija slike v pikslih (privzeto 256)&lt;br /&gt;
*FORMAT (1) - format slike, JPG, PNG ali TIF&lt;br /&gt;
*VALIDITY (0..1) - število dni do ponovnega preverjanja veljavnosti (privzeto 7)&lt;br /&gt;
*CHROMACOLORHEX (0..1) - barva, ki se naj spremeni v prozorno, npr. FFFFFE (privzeto 0)&lt;br /&gt;
*CHROMATOLERANCE (0..1) - toleranca, za prozornost, npr. 1 (privzeto 0)&lt;br /&gt;
*TOPLEVELINDEX (0..1) - index nivoja, na katerem se začnejo karte (če želimo ignorirati zgornje nivoje) (privzeto 0)&lt;br /&gt;
*SERVER (1..N) - naslovi strežnikov&lt;br /&gt;
*LEVELS (1..N) - definicije nivojev&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga LEVELS ===&lt;br /&gt;
*CODES (1) - seznam šifer nivojev, ločenih z vejico&lt;br /&gt;
*LINK (1) - povezava na sliko, kjer se % sekvence nadomeščajo z dejanskimi vrednosti&lt;br /&gt;
&lt;br /&gt;
=== % sekvence ===&lt;br /&gt;
*%Z se nadomesti s šifro nivoja&lt;br /&gt;
*%X se nadomesti s horizontalnim indeksom slike&lt;br /&gt;
*%Y se nadomesti z vertikalnim indeksom slike&lt;br /&gt;
*%Q se nadomesti s quad-tree nazivom slike&lt;br /&gt;
&lt;br /&gt;
== CTR*.XML (definicije barvnih transformacij) ==&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;cts&amp;gt;&lt;br /&gt;
  &amp;lt;ct&amp;gt;&lt;br /&gt;
    &amp;lt;ctcode&amp;gt;1&amp;lt;/ctcode&amp;gt;&lt;br /&gt;
    &amp;lt;ctname&amp;gt;Cyan, Orange - 8 Bands&amp;lt;/ctname&amp;gt;&lt;br /&gt;
    &amp;lt;ctlinear&amp;gt;true&amp;lt;/ctlinear&amp;gt;&lt;br /&gt;
    &amp;lt;ctshadow&amp;gt;NW&amp;lt;/ctshadow&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;   0, 806000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 100, 808000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 200, A0A000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 300, C0C000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 400, F0F000&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 600, CAE8DD&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt; 800, 55AAFF&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;1000, 4484DD&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;1300, 337CCE&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;1700, 2967AB&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;2100, 1A416C&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
    &amp;lt;ctpair&amp;gt;2900, 4A484D&amp;lt;/ctpair&amp;gt;&lt;br /&gt;
  &amp;lt;/ct&amp;gt;&lt;br /&gt;
&amp;lt;/cts&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Parametri taga CT ===&lt;br /&gt;
*CTCODE (1) - koda barvne transformacije&lt;br /&gt;
*CTNAME (1) - opisno ime barvne transformacije&lt;br /&gt;
*CTLINEAR (0..1) - ali se vrednosti med dvema barvama linearno prelivajo (privzeto false)&lt;br /&gt;
*CTSHADOW (0..1) - smer osvetlitve za senčenje NW, N, NE, W, E, SW, S, SE (privzeto se ne senči)&lt;br /&gt;
*CTPAIR (1..N) - seznam parov vrednost,barva (primer 200,FF00FF)&lt;br /&gt;
&lt;br /&gt;
== XML struktura piramide ==&lt;br /&gt;
=== Uporaba ===&lt;br /&gt;
'''PyramidBuildAll(Code As String)''' ponovno naloži XML datoteko, izdela vse nivoje in sestavi piramido.&lt;br /&gt;
&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;store&amp;gt;&lt;br /&gt;
  &amp;lt;name&amp;gt;Ortofoto (GURS-50cm)&amp;lt;/name&amp;gt;&lt;br /&gt;
  &amp;lt;tilesize&amp;gt;512&amp;lt;/tilesize&amp;gt;&lt;br /&gt;
  &amp;lt;crs&amp;gt;SI-D48&amp;lt;/crs&amp;gt;&lt;br /&gt;
  &amp;lt;format&amp;gt;jpg,75&amp;lt;/format&amp;gt;&lt;br /&gt;
  &amp;lt;minscale&amp;gt;100&amp;lt;/minscale&amp;gt;&lt;br /&gt;
  &amp;lt;sourcepath&amp;gt;D:\Podatki\Rasters\DOF-GURS\TM050&amp;lt;/sourcepath&amp;gt;&lt;br /&gt;
  &amp;lt;targetpath&amp;gt;D:\Podatki\Rasters\DOF-GURS\TM050&amp;lt;/targetpath&amp;gt;&lt;br /&gt;
  &amp;lt;level&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;050x001&amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;pixelsize&amp;gt;0.50&amp;lt;/pixelsize&amp;gt;&lt;br /&gt;
    &amp;lt;maxscale&amp;gt;5000&amp;lt;/maxscale&amp;gt;&lt;br /&gt;
    &amp;lt;build&amp;gt;files,,,000000,FFFFFF,1&amp;lt;/build&amp;gt;&lt;br /&gt;
  &amp;lt;/level&amp;gt;&lt;br /&gt;
  &amp;lt;level&amp;gt;&lt;br /&gt;
    &amp;lt;code&amp;gt;050x002&amp;lt;/code&amp;gt;&lt;br /&gt;
    &amp;lt;pixelsizemul&amp;gt;2&amp;lt;/pixelsizemul&amp;gt;&lt;br /&gt;
    &amp;lt;maxscalemul&amp;gt;2&amp;lt;/maxscalemul&amp;gt;&lt;br /&gt;
    &amp;lt;build&amp;gt;level&amp;lt;/build&amp;gt;&lt;br /&gt;
  &amp;lt;/level&amp;gt;&lt;br /&gt;
&amp;lt;/store&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga STORE ===&lt;br /&gt;
&lt;br /&gt;
*NAME (1) - opisno ime, mora biti unikatno, da se pri izbiri lahko ločijo med sabo&lt;br /&gt;
*CRS (1) - koda koordinatnega sistema, za kode poglej v CRS.XML (privzeto WGS-84), trenutno se še ne uporablja&lt;br /&gt;
*TILESIZE (1) - velikost tilov v pikslih&lt;br /&gt;
*FORMAT (1) - format tilov, TG4, LZW ali JPG (ki ima lahko dodatno še kvaliteto 0-100)&lt;br /&gt;
*MINSCALE (0..1) - minimalno merilo, do katere se piramida izrisuje&lt;br /&gt;
*COLOR (0..1) - barva za črnobele slike pri TG4, na primer FF00FF&lt;br /&gt;
*CHROMA (0..1) - barva in toleraca za prozornost, na primer FFFFFF,10&lt;br /&gt;
*SOURCEPATH (0..1) - predpona, ki se doda mapam vhodnih datotek za build&lt;br /&gt;
*TARGETPATH (0..1) - mapa, kamor se shranijo vmesni rezultati builda (nivoji)&lt;br /&gt;
*BUILDWINDOW (0..1) - okno, ki oklepa piramido, za optimizacijo builda (privzeto 250000,0,750000,250000)&lt;br /&gt;
*LEVEL (1..N) - definicije izdelave nivojev&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga LEVEL ===&lt;br /&gt;
*CODE (1) - unikatna koda nivoja&lt;br /&gt;
*PIXELSIZE (0..1) - velikost piksla v metrih, obvezno podana na prvem nivoju; če ni podana, je dvojna vrednost prejšnjega nivoja &lt;br /&gt;
*PIXELSIZEMUL (0..1) - če je podan PIXELSIZE, se množi s to vrednostjo (privzeto 1)&lt;br /&gt;
*PIXELSIZEDIV (0..1) - če je podan PIXELSIZE, se deli s to vrednostjo (privzeto 1)&lt;br /&gt;
*MAXSCALE (0..1) - največje merilo izrisa tega nivoja, obvezno podana na prvem nivoju; če ni podana, je dvojna vrednost prejšnjega nivoja&lt;br /&gt;
*MAXSCALEMUL (0..1) - če je podan MAXSCALE, se množi s to vrednostjo (privzeto 1)&lt;br /&gt;
*PREPAINT (0..1) - &lt;br /&gt;
*BUILD (0..N) - navodila za kreiranje nivoja, obvezna na prvem nivoju (privzeto LEVEL)&lt;br /&gt;
&lt;br /&gt;
=== Parametri taga BUILD ===&lt;br /&gt;
Parametri so ločeni z vejico. &lt;br /&gt;
*FILES,mapa,filter,barva,chroma,toleranca&lt;br /&gt;
**mapa (0..1) - &lt;br /&gt;
**filter (0..1) - &lt;br /&gt;
**barva (0..1) - &lt;br /&gt;
**chroma (0..1) - &lt;br /&gt;
**toleranca (0..1) - &lt;br /&gt;
*LIST,seznam,barva,chroma,toleranca&lt;br /&gt;
**seznam (1) - ascii datoteka s seznamom kart&lt;br /&gt;
**barva (0..1) - &lt;br /&gt;
**chroma (0..1) - &lt;br /&gt;
**toleranca (0..1) - &lt;br /&gt;
*LEVEL,koda&lt;br /&gt;
**koda (0..1) - koda nivoja, iz katerega se reducira trenutni nivo (privzeto prejšnji nivo)&lt;br /&gt;
*GRID,grid,polje,transformacija&lt;br /&gt;
**grid (1) - ime xml datoteke z definicijo grida&lt;br /&gt;
**polje (1) - indeks polja iz grida, ki naj se uporabi&lt;br /&gt;
**transformacija (1) - koda barvne transformacije&lt;br /&gt;
*DRAW,tematika,ymin,xmin,ymax,xmax&lt;br /&gt;
**tematika (1) - ime tematike, ki naj se izriše&lt;br /&gt;
**ymin, xmin, ymax, xmax (1) - okno izrisa&lt;br /&gt;
&lt;br /&gt;
== XML struktura grida ==&lt;br /&gt;
=== Primer ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;windows-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;grid&amp;gt;&lt;br /&gt;
  &amp;lt;Crs&amp;gt;SI-D48&amp;lt;/Crs&amp;gt;&lt;br /&gt;
  &amp;lt;OriginY&amp;gt;371200&amp;lt;/OriginY&amp;gt;&lt;br /&gt;
  &amp;lt;OriginX&amp;gt;25600&amp;lt;/OriginX&amp;gt;&lt;br /&gt;
  &amp;lt;TileCountY&amp;gt;20&amp;lt;/TileCountY&amp;gt;&lt;br /&gt;
  &amp;lt;TileCountX&amp;gt;14&amp;lt;/TileCountX&amp;gt;&lt;br /&gt;
  &amp;lt;CellCountY&amp;gt;512&amp;lt;/CellCountY&amp;gt;&lt;br /&gt;
  &amp;lt;CellCountX&amp;gt;512&amp;lt;/CellCountX&amp;gt;&lt;br /&gt;
  &amp;lt;CellDimenY&amp;gt;25&amp;lt;/CellDimenY&amp;gt;&lt;br /&gt;
  &amp;lt;CellDimenX&amp;gt;25&amp;lt;/CellDimenX&amp;gt;&lt;br /&gt;
  &amp;lt;CellField&amp;gt;I02,100,-600&amp;lt;/CellField&amp;gt;&lt;br /&gt;
  &amp;lt;CellField&amp;gt;I02,100,+300&amp;lt;/CellField&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
=== Parametri taga GRID ===&lt;br /&gt;
*...&lt;br /&gt;
*...&lt;br /&gt;
=== Parametri taga CELLFIELD ===&lt;br /&gt;
*TIP (1): tip polja, ena od vrednosti: W01,W02,W04,I01,I02,I04,F04,F08&lt;br /&gt;
*FAKTOR (0..1): celoštevilčni množitelj vrednosti, za optimizacijo&lt;br /&gt;
*DELTA (0..1): celoštevilčni dodatek vrednosti, za optimizacijo&lt;br /&gt;
&lt;br /&gt;
Interna vrednost polja se računa po formuli:&lt;br /&gt;
*interna vrednost = (realna vrednost + delta) * faktor&lt;br /&gt;
&lt;br /&gt;
=== Primer grida za transformacijo koordinat ===&lt;br /&gt;
Primer XML datoteke (SI-D96;SI-D48):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;WINDOWS-1250&amp;quot;?&amp;gt;&lt;br /&gt;
&amp;lt;Grid&amp;gt;&lt;br /&gt;
	&amp;lt;Crs&amp;gt;SI-D96&amp;lt;/Crs&amp;gt;&lt;br /&gt;
	&amp;lt;OriginY&amp;gt;370000&amp;lt;/OriginY&amp;gt;&lt;br /&gt;
	&amp;lt;OriginX&amp;gt;25000&amp;lt;/OriginX&amp;gt;&lt;br /&gt;
	&amp;lt;CellDimenY&amp;gt;500&amp;lt;/CellDimenY&amp;gt;&lt;br /&gt;
	&amp;lt;CellDimenX&amp;gt;500&amp;lt;/CellDimenX&amp;gt;&lt;br /&gt;
	&amp;lt;TileCountY&amp;gt;1&amp;lt;/TileCountY&amp;gt;&lt;br /&gt;
	&amp;lt;TileCountX&amp;gt;1&amp;lt;/TileCountX&amp;gt;&lt;br /&gt;
	&amp;lt;CellCountY&amp;gt;520&amp;lt;/CellCountY&amp;gt;&lt;br /&gt;
	&amp;lt;CellCountX&amp;gt;340&amp;lt;/CellCountX&amp;gt;&lt;br /&gt;
	&amp;lt;CellField&amp;gt;I02,1000,-370&amp;lt;/CellField&amp;gt;&lt;br /&gt;
	&amp;lt;CellField&amp;gt;I02,1000,+485&amp;lt;/CellField&amp;gt;&lt;br /&gt;
&amp;lt;/Grid&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Procedura za izračun grida:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dim G As TGrid, IY, IX As Long, Y1, X1, X2, Y2 As Float&lt;br /&gt;
G = CreateGrid(ProgramPath + 'QTS;SI-D96;SI-D48.XML')&lt;br /&gt;
If Assigned(G) Then&lt;br /&gt;
  CRSToCRSParams('SI-D48', 'SI-D96')&lt;br /&gt;
  For IY = 0 To G.TileCountY * G.CellCountY - 1&lt;br /&gt;
    Y1 = G.OriginY + IY * G.CellDimenY + G.CellDimenY / 2&lt;br /&gt;
    For IX = 0 To G.TileCountX * G.CellCountX - 1&lt;br /&gt;
      X1 = G.OriginX + IX * G.CellDimenX + G.CellDimenX / 2&lt;br /&gt;
      CRSToCRS(Y1, X1, Y2, X2)&lt;br /&gt;
      G.CellValue(Y1, X1, 0) = Y2 - Y1&lt;br /&gt;
      G.CellValue(Y1, X1, 1) = X2 - X1&lt;br /&gt;
    Next&lt;br /&gt;
  Next&lt;br /&gt;
  G.Save&lt;br /&gt;
  G.Destroy&lt;br /&gt;
EndIf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.sdms.si/index.php?title=Verzija_4.2.2&amp;diff=7209</id>
		<title>Verzija 4.2.2</title>
		<link rel="alternate" type="text/html" href="https://wiki.sdms.si/index.php?title=Verzija_4.2.2&amp;diff=7209"/>
		<updated>2015-06-17T12:26:24Z</updated>

		<summary type="html">&lt;p&gt;Janez Trtnik: /* Basic */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;[[Zgodovina verzij]]&amp;lt;/noinclude&amp;gt; &lt;br /&gt;
&lt;br /&gt;
=== Objava verzije  ===&lt;br /&gt;
&lt;br /&gt;
*'''Build 1''' 11 marec 2015&lt;br /&gt;
*'''Build 3''' 13 marec 2015&lt;br /&gt;
*'''Build 4''' 16 marec 2015&lt;br /&gt;
*'''Build 5''' 18 marec 2015&lt;br /&gt;
*'''Build 6''' 19 marec 2015&lt;br /&gt;
*'''Build 7''' 20 marec 2015&lt;br /&gt;
*'''Build 8''' 24 marec 2015&lt;br /&gt;
*'''Build 9''' 2 april 2015&lt;br /&gt;
*'''Build 10''' 7 april 2015&lt;br /&gt;
*'''Build 11''' 9 april 2015&lt;br /&gt;
*'''Build 12''' 13 april 2015&lt;br /&gt;
*'''Build 13''' 14 april 2015&lt;br /&gt;
*'''Build 14''' 20 april 2015&lt;br /&gt;
*'''Build 15''' 22 april 2015&lt;br /&gt;
*'''Build 16'''&lt;br /&gt;
&lt;br /&gt;
=== Popravki avtomatsko sporočenih napak  ===&lt;br /&gt;
*(Build 6) Access violation...00000004 v maski, če je bila entiteta krog ali lok in se je uporabljal prostorski lookup.&lt;br /&gt;
*(Build 9) Access violation...00000014 v raziskovalcu, če plast ni imela pravilno določenega indexa v navideznem nizu podatkov.&lt;br /&gt;
*(Build 9) Popravek napake TRecordList.GetRec: cannot unlock previous record v funkciji GroupByFormula.&lt;br /&gt;
*(Build 13) Gridi v maskah so povzročali napake. Napaka nastala v verziji 4.2.2.12.&lt;br /&gt;
*(Build 14) TPoligon: Indeks izven območja. V funkciji InputPolyLineNextPoint, če ni bilo točk. Popravljeno.&lt;br /&gt;
&lt;br /&gt;
=== Razni popravki ===&lt;br /&gt;
*(Build 3) Pri tekst in simbol temah opcija Avtomatski centroid na ekranu ni upoštevala otokov. Popravljeno. Napaka nastala v verziji 4.2.2.1.&lt;br /&gt;
*(Build 3) Sistem logiranja spremenjen, da uporablja niti.&lt;br /&gt;
*(Build 4) Popravek pri kreiranju dokumenta.&lt;br /&gt;
*(Build 8) Odpravljen bug pri izvozu v Excel - Clipboard. Nastal v buildu 7.&lt;br /&gt;
*(Build 9) Pohitreni filtri in lookupi za filtre po polilinijah. Opazna razlika je pri večjih polilinijah (&amp;gt;50 točk) in so filtri 2-10x hitrejši.&lt;br /&gt;
*(Build 9) Urejevalniki navideznih nizov podatkov se niso pravilno inicializirali. Napaka nastala v verziji 4.2.2.4.&lt;br /&gt;
*(Build 9) V posebnih kombinacijah mask se je lahko zgodilo, da je maska izginila iz ekrana. Popravljeno.&lt;br /&gt;
*(Build 10) Če je plast brez mask, se ne preklopi samodejno v avtomatsko masko. Napaka nastala v verziji 4.2.2.9. Popravljeno.&lt;br /&gt;
*(Build 10) Hinti na maski niso delali. Napaka nastala v verziji 4.2.2.9. Popravljeno.&lt;br /&gt;
*(Build 10) Pri filtrih po večkratnih nizih podatkov ni pravilno filtriral, če je šele filter inicializiral plast.&lt;br /&gt;
*(Build 10) Izpis DumpPageCache in DumpAllRecords je sortiran po imenu.&lt;br /&gt;
*(Build 11) Form.EditRecord.Append na prazni maski.&lt;br /&gt;
*(Build 11) Dvignjena verzija layerja, zaradi uvedbe CRS pri layerju.&lt;br /&gt;
*(Build 12) Izvoz v Excel popravljen, da dela izvoze večvrstičnih tekstov.&lt;br /&gt;
*(Build 12) Izvoz v Excel popravljen, da dela izvoze večkratnih nizov podatkov.&lt;br /&gt;
*(Build 12) Malo skrajšani opisi v Log datotekah.&lt;br /&gt;
*(Build 13) Pri ukazih netMessage oziroma netCommand s prikazom okna, se niso prenašala obvestila o spremembah na plasteh. Popravljeno.&lt;br /&gt;
*(Build 15) Popravljeno sproščanje predpomnilnika ob low memory.&lt;br /&gt;
&lt;br /&gt;
=== Grid ===&lt;br /&gt;
*(Build 9) Grid je doživel prenovo. SGR datoteke so s tem postale zastarele, a bodo do nadaljnega še delovale. Po novem je osnova XML datoteka, ki definira grid. Definicija XML datotake je točno opisana v [[Struktura_XML_datotek|XML_struktura_grida]]. Na isti mapi se ob uvozu naredi SDG datoteka, ki vsebuje vse podatke v eni datoteki in se tudi kasneje uporablja v programu. &lt;br /&gt;
*(Build 9) Ob tem se je star grid objekt TGrid preimenoval v [[TGridOld]], '''in je potrebno po basicu to popraviti'''. Je pa dodan nov objekt [[TGrid]], ki vsebuje rutine za delo z novim gridom.&lt;br /&gt;
*(Build 9) Dodani nove funkcije za {{EL|TGrid|GetPointArrayNodes}}, {{EL|TGrid|GetPointArrayContour}} in {{EL|TGrid|GetPointArrayContourVP}}, ki polilinijo napolnita z višinami iz grida.&lt;br /&gt;
*(Build 9) Za vizualizacijo gridov se uporabljajo piramide, in se kreirajo glede na [[Struktura XML datotek#CTR.XML (barvne transformacije)]].&lt;br /&gt;
&lt;br /&gt;
=== Generiranje izrazov ===&lt;br /&gt;
*(Build 9) Preurejena struktura drevesa glede na uporabnost posameznih skupin.&lt;br /&gt;
*(Build 9) Dodano skrivanje nepotrebnih skupin povsod, kjer se uporablja generiranje izrazov.&lt;br /&gt;
*(Build 9) V Urejevalniku modula dodana zgodovina generiranih izrazov.&lt;br /&gt;
*(Build 9) V Konzoli dodana zgodovina ukazov v generator izrazov.&lt;br /&gt;
*(Build 9) Povsod drugje dodana zgodovina ukazov v generator izrazov in &amp;lt;ctrl&amp;gt; +  &amp;lt;pgup&amp;gt;, &amp;lt;pgdown&amp;gt;.&lt;br /&gt;
*(Build 9) Shranjevanje zgodovine ukazov prestavljeno iz Registrija v profiles mapo.&lt;br /&gt;
*(Build 9) Dodana možnost klika na &amp;lt;Levi Alt&amp;gt; + klik na objektu [neka plast] in napolni vsa polja te plasti za izbiro.&lt;br /&gt;
*(Build 10) &amp;lt;Levi Alt&amp;gt; + klik na objektu [neka plast] ni povsem delalo. Popravljeno.&lt;br /&gt;
*(Build 10) Pri izbiri podatkovne plasti, se poleg polij izpišejo še dodatna imena, na koncu pa se dodajo še imena mask, indeksov,...&lt;br /&gt;
*(Build 12) Pri generirajnu formule za polje se ni pripravil seznam polj. Napaka nastala v verziji 4.2.2.9.&lt;br /&gt;
*(Build 13) CTRL+Click na menujih,... popravljen, da ne pregleda samo prvega ukaza ampak vse.&lt;br /&gt;
*(Build 13) CTRL+Click na shranjene objekte ni več delal. Napaka nastala v verziji 4.2.&lt;br /&gt;
*(Build 13) CTRL+Click na lastnostih tudi dela, če lete niso v modalnem oknu. Torej tudi v urejevalniku podatkovne plasti - maska.&lt;br /&gt;
*(Build 14) CTRL+Click na v modulu javi napako. Napaka nastala v verziji 4.2.2.13. Popravljeno.&lt;br /&gt;
&lt;br /&gt;
=== Spletne karte ===&lt;br /&gt;
*(Build 1) Popravljeno nalaganje spletnih kart. Iz spleta se prenaša več kart naenkrat v ozadju, tako da prenos ne blokira več izrisa. Karte se rišejo od sredine navzven (boljši občutek za hitrost). Najprej se narišejo se vse karte, ki so na disku, potem pa še čaka do 5 sekund in riše, kar se je preneslo. Ostale karte se prenašajo v ozadju in so pripravljene za izris ob naslednjem risanju. Če je karta na disku starejša kot 1 teden, se bo ponovno prenesla v ozadju.&lt;br /&gt;
*(Build 7) Pohitreno nalaganje spletnih kart in tudi ostalih rastrov.&lt;br /&gt;
&lt;br /&gt;
=== Buffer (Outline) ===&lt;br /&gt;
*(Build 1) Funkcija za izdelavo bufferja je popolnoma spremenjena in naredi sedaj topološko pravilen buffer. Naredi ga tudi veliko hitreje kot v verziji 4.1.&lt;br /&gt;
*(Build 1) Buffer lahko po novem naredimo za vse grafične tipe zapisov, tudi okoli točk in poligonov. Prej se ga je lahko naredilo le okoli polilinij.&lt;br /&gt;
*(Build 1) V urejevalniku geometrije je se buffer naredi različno, glede na dovoljene tipe topologije v podatkovni plasti. Če poligoni niso dovoljeni, bo naredil buffer kot polilinije, če pa plast dovoli poligone, pa ga bo naredil kot poligon.&lt;br /&gt;
*(Build 3) Izraz Outline spremenjen v Buffer&lt;br /&gt;
*(Build 3) V urejevalniku geometrije buffer prikaže masko, kjer določimo vse parametre za konstrukcijo, lahko pa tudi naredimo buffer iz poljubne plasti in v poljubno plast.&lt;br /&gt;
*(Build 14) Zamik linije je dodal srednjo točko tudi na topih korih. Napaka nastala v verziji 4.2.&lt;br /&gt;
&lt;br /&gt;
=== Basic  ===&lt;br /&gt;
&lt;br /&gt;
*(Build 1) Popravljeni funkciji {{EL|TEditRecord|PointArray}} in {{EL|TRecord|PointArray}}, da za poligone vedno vrneta zaprt poligon (zadnja točke je ista kot prva). Napaka nastala v verziji 4.2.2.1.&lt;br /&gt;
*(Build 1) Nova zanka '''ForEach X In Y ... Next''', ki nastavi vrednost spremenljivke X na vse vrednosti iz seznama Y&lt;br /&gt;
** String / TStringList: ForEach S In SL&lt;br /&gt;
** TRecord / TRecordList: ForEach R In [Plast].FilteredRecords&lt;br /&gt;
** TEditRecord / TRecordList: ForEach ER In [Plast].FilteredRecords (ta naredi tudi L.Begin/L.EndMultipleUpdate, za vsak record pa ER.Edit in ER.Update)&lt;br /&gt;
** TDrawItem / TDrawList: ForEach DI In DrawList&lt;br /&gt;
** TPrintItem / TPrintLayout: ForEach P In [PredlogaIzrisa]&lt;br /&gt;
** TDialogControl / TDialog: ForEach DC In [Dialog]&lt;br /&gt;
** objekt(TLayer, TUser, ...) / TCollection: ForEach L In Layers, ForEach U In Users, ...&lt;br /&gt;
*(Build 8) Popravljeno izvajanje timerjev, da se ne izvajajo gnezdeno ampak sekvenčno.&lt;br /&gt;
*(Build 9) Dodani novi zagonski parametri: StartBefore, StartAfterCreate in StartAfterCreated. Opis: [[Zagonski_parametri|Zagon_basica]]&lt;br /&gt;
*(Build 15) Dodane lastnosti {{EL|TFormControl|Enabled}}, {{EL|TFormControl|GridOnBtnClick}} in {{EL|TFormControl|GridOnDblClick}}. &lt;br /&gt;
*(Build 16) Dodane možnosti za ForEach:&lt;br /&gt;
** objekt(TLayer, TUser, ...) / TFolder: ForEach L In Root, ForEach U In Root, ...&lt;br /&gt;
** TFolder / TFolder: ForEach F In Root&lt;br /&gt;
** TUser / TUserGroup: ForEach U In [Urejanje plasti]&lt;br /&gt;
&lt;br /&gt;
*(Build X) Dodani ukazi za zapisovanje iz basica v poljubno log datoteko.&lt;br /&gt;
**CustomLogInit &lt;br /&gt;
**CustomLogDone &lt;br /&gt;
**CustomLogWrite&lt;/div&gt;</summary>
		<author><name>Janez Trtnik</name></author>
		
	</entry>
</feed>