CSP custom tags Databáze Caché CSP Custom Tags vlastní značky vývoj vlastních tagů pro CSP stránky možnost přidat novou funkcionalitu, ale zachovat stejnou syntaxi možnost vyvíjet znovupoužitelné komponenty CSP kompilátor Příklad: vlastní element rozpoznání #( )# výrazů připojených v CSP dokumentu rozpoznání konkrétních elementů (HTML/XML) a nahrazení předdefinovanými akcemi (analogie XSL) <html> <body> <my:company> </body> </html> <html> <body> <b>párkypraha</b> </body> </html> Element <my:company> je při kompilaci stránky nahrazen názvem firmy. Příklad: vlastní element (2) Aby byl element kompilátorem rozpoznán, je třeba vytvořit patřičné pravidlo, které se při kompilaci provede. <csr:rulename="mycompany" match="my:company" empty> <b>párky Praha</b> Název pravidla podléhá stejným omezením jako název třídy v Caché. specifikuje akci, která bude provedena, pokud pravidlo vyhovuje na nějaký element. obsah je interpretován jako HTML (až na dvě výjimky) výrazy #()# a ##()##, element <script> další <csr:> elementy nemůže obsahovat takový CSP tag, pokud v daném kontextu nenímožné provést transformaci 1
Načtení souboru pravidel v terminálu příkazem načtení pravidel do aktuálního kontextu Do $system.csp.loadrule("/myrules/company.csr") Caché Studio nahrát soubor a zkompilovat sledovat, která pravidla se používají souborem rulemgr.csp dodaným v CSP Samples Tag matching atribut MATCH obsahující 1 nebo více elementů, oddělené / Hodnota v MATCH AAA AAA/BBB AAA/*/BBB AAA[CCC] AAA[CCC=22] AAA[CCC=22]/*/BBB Pravidlo aplikováno Kdekoliv je tag <AAA></AAA> Kdykoliv<AAA> obsahuje <BBB> (<AAA><BBB></BBB></AAA>) Kdykoliv<AAA> obsahuje libovolně hluboko zanořený <BBB>(<AAA><C><D><BBB> </BBB></D></C></AAA>) Pokud <AAA>má atribut CCC s lib. hodnotou. (<AAA CCC="10"></AAA>) Pokud <AAA>má atribut CCC s hodnotou 22. (<AAA CCC="22"></AAA>) <BBB>zanořený lib. hluboko v elementu<aaa> satributem CCCrovným 22. Test: pochopení MATCH <p>text text text <b>text</b> text</p> <p>text <i><b>text</b></i> text</p> <p>text text text text text</p> Označ elementy <b> v elementech <p> 1. MATCH = "p/b" 2. MATCH = "p/*/b" 3. MATCH = "p/i/b" Test pochopení MATCH (2) <p><b><a href="/">text</a></b> text</p> <p><i><b><a href="/">text</b></i> text</p> <p><i><b><ahref="/uroven/">text</b></i> text</p> Označit všechny odkazy na hl. stránku "/" 1. MATCH = "p/b/a" 2. MATCH = "p/a[href=/]/" 3. MATCH = "p/*/a[href=/]/" Programový kód v ACTION akce v pravidlech mohou obsahovat programový kód, který bude vykonán když je pravidlo aplikováno (run-time) když je pravidlo kompilováno (compile-time) Programový kód v ACTION (2) vykonání při spuštění -syntaxe #(expr)# pravidlo <csr:rulename="today" match="today" empty> Dnes je: <b>#($zdate($h))#</b> prokód <TODAY> vyvolá příkaz $ZDATE pro element <TODAY> při zaslání stránky 2
Programový kód v ACTION (3) vykonání při kompilaci -syntaxe ##(expr)## pravidlo <csr:rule name="today" match="today" empty> Dnes je: <b>##($zdate($h))##</b> prokód <TODAY> vyvolá příkaz $ZDATE pro element <TODAY> v době kompilace Programový kód v ACTION (4) výrazy provedené v době kompilace se stávají statickou částí CSP stránky. je možné kombinovat "statické" a "dynamické" vykonáváníkódu: Stáří stránky (dny): #($H -##($H)##)#. vnitřní část je vyhodnocena při kompilaci a vnější se volá při zaslání stránky ze serveru Programový kód v ACTION (5) dále je možno vkládat více řádků kódu za pomoci elementu <script> a atributu runat (server/compiler) <csr:rulename="biglist" match="biglist" empty> <ul> <script language="cache" runat=server> Fori = 1:1:100 { Write "<li>položka " _ i _ $C(13,10) </ul> Server Document Object Model vytvářen při kompilaci CSP dokumentu (analogie DOM) dva typy základních atomů %CSP.Rule -elementy HTML %CSP.TextAtom -vše ostatní co není element kvůli efektivitě se %CSP.Rule vytváří pouze pokud je zmíněno v některém z pravidel, jinak je vše %CSP.TextAtom <html> <body> Ahoj! <MYTAG MSG="Vítejte"> </body> </html> Při kompilaci vytvořeno Server DOM (2) html body TextAtom stextem Ahoj! element se jménem MYTAG a atributem MSG rovným Vítejte Server DOM (3) po vytvoření DOMu je celý stromeček procházen (do hloubky) na každý uzel typu %CSP.Rule je voláno pravidlo a renderován výsledek %CSP.TextAtom jsou přenášeny přímo do výsledného souboru při volání pravidla se na akt. zpracovávaný uzel odkazuje za pomoci ##this proměnné 3
Další csr: elementy (vnitřní) csr:default vypíše element na výstup (při změnách některých atributů, ale zachování tagu) csr:children vypíše všechny potomky tagu, na který bylo vyvoláno pravidlo csr:section výstup na jiné místo do výsledného dokumentu (definice funkce pro form do hlavičky) csr:default <csr:rule name="redtable" match="table" > <script language="cache" runat="compiler"> // pro tento element nastav bgcolor atribut nared Do ##this.setattribute("bgcolor","red") <csr:default> csr:section <csr:rule name="mybutton" match="form/*/mybutton"empty> <csr:section NAME=HEAD> <script language="javascript"> function MyButton() { alert('tlačítko MyButton stisknuto!'); return true; </csr:section> <inputtype="button" value='##(##this.getattribute("value"))##' onclick="mybutton();"></input> Další csr: elementy (vnější) csr:class zpřístupnění další metod vně pravidla csr:description umožňuje k pravidlu přidat vysvětlující popis csr:attribute název, popis a typ atributů vlastního elementu <csr:attribute name=type description="specify the default Content-Type" type="contenttype:string"> Třídy pravidel pro každé kompilované pravidlo vytvořena třída, volaná při platnosti pravidla pravidla mohou být výkonná přímo vytvářena jako třídy třídy lze zobrazit a vytvářet za pomoci Studia Struktura třídy pravidel renderovaná třída obsahuje metody RenderStartTag 1 a více CompilerMethod (pro kód runat=compiler) RenderEndTag Render[Start End]Tag obsahují kód pro přímý zápis do CSP stránky. 4
Kód RenderStartTag Výsledná metoda RenderStartTag <scriptlanguage="cache" runat=server> Setmyfile="c:\temp.txt" Open myfile:("fr":100) Usemyfile:() Read var1 Closemyfile Method RenderStartTag() As %Status { Newelement Set element=##this Do..WriteCSPServer(" Set myfile=""c:\temp.txt""",0) Do..WriteCSPServer(" Open myfile:(""fr"":100)",1) Do..WriteCSPServer(" Usemyfile:() ",1) Do..WriteCSPServer(" Read var1",1) Do..WriteCSPServer(" Close myfile",1) Quit $$$SKIPCHILDREN pokud by pravidlo obsahovalo <csr:children> tak je metoda ukončena Quit $$$PROCESSCHILDREN CompilerMethod kód <script language="cache" runat=compiler> SET ^client(2,1,1)=..innertext() RenderEndTag generována, pokud je v pravidle obsažen element <csr:children> obsahuje kód uvedený za <csr:children> výsledná metoda-nakopírována do těla Method CompilerMethod1() [ Language=cache ] { SET ^client(2,1,1)=..innertext() Kód RenderEndTag <csr:rule name="iscbarchart" match="isc:barchart" language="any"> <csr:action> <table bgcolor='##(..getattribute("bgcolor"))##' border=0 cellspacing=0 style='border: ##(..GetAttribute("BORDER","solid blue"))##;'><tr> <csr:children> </tr></table> </csr:action> </csr:rule> Method RenderEndTag() As %Status { New element Set element=##this Do..WriteText("",1) Do..WriteCSPText("</tr></table>",0) Quit $$$OK 5
Metody %CSP.Rule GetAttribute(nameAs %String, default As %String = "") získá hodnotu atributu z aktuálního tagu QuoteAttribute(name As %String, default As %String = "") připraví hodnotu včetně provedení#()#, ##()## a ##"## GetAttributesOrder(ByRefparamsordered) vrátí všechny atributy podle jejich po řadí vtagu IsDefined(name As %String) zjistí zda je daný atribut definován InnerText() vrátí obsah od počátečního po koncový element AddChildElements(atom As %CSP.AbstractAtom) přidá k aktuálnímu elementupodelement zadaný jako parametr SetAttribute(nameAs %String,value As %String) nastaví atribut na nějakou hodnotu Metody zápisu %CSP.AbstractAtom WriteText(line As %String,crlf As %Boolean= 0) zapiš obsah line, crlf = 1 pokud má být zapsán konecřádku WriteCSPText(line As %String,crlf As %Boolean = 0) zápis řádku s prováděním ##()##, ##''##, #server, #url, a #()# výrazů WriteExpressionText(exprAs %String, crlf As %Boolean = 0) zapíše text, který je vrácen zadaným výrazem (měl by být korektně quoted) WriteServer(line As %String, keeptogether As %Boolean = 0) zapíše COS příkaz WriteCSPServer(line As %String, keeptogetheras %Boolean= 0) zapíše COS příkaz s vyhodnocenými ##()##, #()#, a ##''## výrazy. National Language Support (NLS) seznam všech nativně podporovaných jazyků 5-Cache standard 10 -German1 11 -Portuguese1 12 -Polish1 13 -German2 14 -Spanish1 15 -Danish1 17 -Greek1 18 -Czech1 19 -Czech2 20 -Portuguese2 21 -Finnish1 22 -Japanese1 23 -Cyrillic2 24 -Polish2 26 -Chinese2 Děkuji za pozornost nějaké otázky? 6