19.5.2014
Každá aplikace by měla poskytovat svému uživateli nějaké užitečné výstupy - a jedním z typicky požadovaných výstupů je výstup na tiskárnu. Aplikace Deko the CRM je napsaná v C++. Jazyk je to krásný a výkonný, ale pro tvorbu tiskových sestav má pár nevýhod:
Jak z takové situace vybruslit? Už dlouhé roky používám pro různá rozšíření vlastních aplikací v C++ jazyk Javascript. Připojit do Qt aplikace interpreter Javascriptu je jednoduché, ale jeho možnosti při programování sestav mi dlouho unikaly. Jenomže ona asi každá myšlenka potřebuje nějaký heuréka moment. Hned jak jsem přestal nahý a mokrý pobíhat po městě s výkřiky "to ja tak jednoduché, že mě to nenapadlo dříve!", dal jsem se do ověřování svého nápadu.
Hlavním požadavkem je, aby byl sestavu schopný vytvořit průměrně zdatný programátor s tím, co zná. Programátorů, kteří znají html je obrovské množství, mnoho z nich dovede použít i Javascript. Deko proto dostalo nový typ dokumentu, report - vestavěný webový prohlížeč a několik datových struktur pro získání dat z databáze.
Tisková sestava je tvořená jako obyčejná HTML stránka s doplňujícími částmi v Javascriptu. HTML slouží jako šablona - v HTML a CSS je popsaný vzhled sestavy, a v Javascriptu se doplňuje HTML o konkrétní data. Masochisti mohou pro modifikaci stránek použít přímo Javascript, ale existuje i množství různých knihoven pro usnadnění práce - my jsme zvolili jQuery.
Jaké výhody dává kombinace HTML a Javascriptu pro tvorbu sestav?
K datům v databázi se lze dostat dvěma způsoby:
Použít je lze pro přístup k obrázkům, knihovnám a css souborům, například takto:
<img src="deko:///id-dokumentu/jmeno-prilohy.svg" alt="logo">
Z C++ části aplikace Deko je v Javascriptu viditelný objekt deko, jehož pomocí lze vytahovat data přímo z databáze, například takto:
var dokument = deko.get('id-meho-pozadovaneho-dokumentu');
Spolu s jQuery je tato kombinace velice mocná, kompletní sestava může vypadat třeba takto:
<html> <head> <script type="text/javascript" src="deko:///podklady-pro-sestavy/jquery-2.1.0.min.js"></script> </head> <body> <h1>Seznam firem</h1> <table class="report"> <thead> <tr><th>Název</th><th>Stránky</th><th>Město</th></tr> </thead> <tbody> </tbody> <tfoot> <tr><th colspan="4"> <th></tr> </tfoot> </table> <!-- ******* Tady končí html a začíná Javascript ******* --> <script type="text/javascript"> $(document).ready(function(){ deko.begin(); var id = deko.id(); var doc = deko.get(id); var parent = deko.linksToMe(id); var parentid = parent.rows[0].value.docid; var parentlinks = deko.linksFromMe(parentid); for (var i=0; i<parentlinks.rows.length; i++) { var xtype = parentlinks.rows[i].value.doctype; var xid = parentlinks.rows[i].value.docid; if (xtype == 'company') { var xdoc = deko.get(xid); var city = (xdoc.city == undefined) ? '' : xdoc.city; var wwww = (xdoc.www == undefined) ? '' : xdoc.www; $("table.report tbody").append( '<tr>' + '<td>' + xdoc.name + '</td>' + '<td>' + wwww + '</td>' + '<td>' + city + '</td>' + '</tr>\n' ); } } }); </script> </body> </html>
http://dokumentace.hobrasoft.cz/index.php/Tisková_sestava - dokumentace Deko, tiskové sestavy
http://www.hobrasoft.cz/cs/deko/sestavy/ - hotové tiskové sestavy ke stažení
http://www.w3schools.com/js/default.asp - učebnice Javascript
http://www.w3schools.com/jQuery/ - učebnice jQuery
http://jquery.com/download/ - jQuery, domácí stránka