Flexy to bardzo szybki i dysponujący wielkimi możliwościami silnik szablonów. Może być używany zarówno w raportach, blokach jak i generowaniu plików zewnętrznych np. do połaczenia z Symfonią.
http://pear.php.net/manual/en/package.html.html-template-flexy.php
Przejdź do Menu
Tworzenie raportu z wykorzystaniem Flexy należy rozpocząć od zdefiniowania raportu SQL. W module raporty tworzymy nowy raport. W zakładkę Ogólne wprowadzamy nazwę raportu, miejsce jego przechowywania. Przechodzimy do zakładki Definicja, gdzie wprowadzamy definicję SQL. W zakładce Wybór kolumn możemy wybrać, jakie kolumny będą wykorzystywane w raporcie.
Przykładowo tworzymy raport dla Notatek służbowych. W tym celu tworzymy raport w grupie Dokumenty pt. Notatka Służbowa. W zakładce definicji raportu wprowadzamy SQL-a:
SELECT dv.dscrpt, dv.conten, dv.srctxt, dv.trgtxt, p.symbol||' - '||p.dscrpt as symbol, COALESCE(c.name_2, c.name_1) AS cname_ FROM documents_view dv LEFT JOIN processes p USING (prc_id) --ON (dv.prc_id = p.prc_id) LEFT JOIN doc_link_cont dlc ON (dv.doc_id = dlc.doc_id AND dlc.role__ = 'RELATED') LEFT JOIN contacts c ON (dlc.contid = c.contid) WHERE dv.doc_id = {DOC_ID}
Dodatkową funkcjonalnością, którą może być wykorzystana w raportach Flexy są kwerendy. jest to ostatnia zakładka okienka definicji raportu. Parametry takiego raportu muszą być identyczne z parametrami głównego raportu. W odniesieniu do naszego przykładu mogą być to np. kometarze:
SELECT dc.commnt, u.firnam||' '|| u.lasnam as addtxt, to_char(dc.adddat, 'YYYY-MM-DD') AS adddat FROM document_comments AS dc LEFT JOIN users u ON (dc.adduid = u.usr_id) WHERE dc.doc_id = {DOC_ID} ORDER BY dc.adddat ASC
Dodatkowy kwerend można zdefiniować dowolną ilość.
W tym momencie posiadamy działający już raport
Skoro posiadamy już raport SQL teraz należy utworzyć szablon. Czym jest szablon? Otóż jest to plik z rozszerzeniem .html, którego przykładowa zawartość wygląda następująco:
<style> TABLE .ReportTable TD { font-size: 12px; } TD.printLabel { font-size: 12px; vertical-align: top; font-style: italic; border-bottom: 1px solid grey; } TD.printData { font-size: 12px; vertical-align: top; border-bottom: 1px solid grey; } .printHeader { font-size: 16px; font-weight: bold; margin-bottom: 10px; } .parag { text-indent: 20px; } </style> <div style="margin-left:20px;"> <p class="printHeader" style="margin-top: 10px;">Temat</p> {resultQueries[0][0][dscrpt]} <p class="printHeader" style="margin-top: 10px;">Treść</p> {resultQueries[0][0][conten]:h} <p class="printHeader" style="margin-top: 10px;">Załączniki</p> <ul style="list-style-type:none;"> {foreach:resultQueries[2],k,v} <li style="font-size:12px;"> - {v[filenm]}<li> {end:} </ul> <p class="printHeader" style="margin-top: 10px;">Komentarze</p> <ul style="list-style-type:none;"> {foreach:resultQueries[1],k,v} <li><i>{v[addtxt]} {v[adddat]}</i><BR>{v[commnt]:h}<li> {end:} </ul> <table class="RaportTable RaportTable2" style="margin-top:20px; background-color: white; width: 100%" border=0 cellpadding=1 cellspacing=2> <tr> <td class="printLabel">Dokument od:</td> <td class="printData">{resultQueries[0][0][srctxt]}</td> <td class="printLabel">Dokument do:</td> <td class="printData">{resultQueries[0][0][trgtxt]}</td> </tr> <tr> <td class="printLabel">Klient:</td> <td class="printData">{resultQueries[0][0][cname_]}</td> <td class="printLabel">Numer sprawy:</td> <td class="printData">{resultQueries[0][0][symbol]}</td> </tr> </table> </div>
Należy zwrócić uwagę, że nie ma tutaj definicji typowych dla pliku html, jak <html>, <head>, <body>, <!DOCTYPE...>. Jest niejako tylko czysta treść, na którą składają się:
Znaczniki Flexy
W tym miejscu zatrzymamy się, aby omówić pokrótce konstrukcję znaczników FLexy. Najważniejszym znacznikiem wykorzystywanym w szablonach jest {resultQueries}. Przykładowe zastosowanie (z powyższego przykładu):
{resultQueries[0][0][dscrpt]}
Znacznik ten wybiera dane korzystając z definicji SQL raportu, dla którego jest zdefiniowany. I tak resultQueries - pobierz dane ze skryptu SQL, [0] - pierwszy skrypt z definicji raportu (główna definicja raportu - z zakładki Definicja SQL). Dla kwerend będzie to odpowiednio wg kolejności na liście [1], [2] . [0] - Pobiera pierwszy wiersz (rekord) raportu. [dscrpt] - wybiera dane z kolumny dscrpt pobranego rekordu.
Powyższą konstrukcję stosuje się, jeżeli mamy pewność, iż wynikiem będzie jeden wiersz rekordu. Dla większej ilości rekordów stosuje się pętlę foreach o konstrukcji:
<ul style="list-style-type:none;"> {foreach:resultQueries[1],k,v} <li><i>{v[addtxt]} {v[adddat]}</i><BR>{v[commnt]:h}</li> {end:} </ul>
Gdzie: {foreach:resultQueries[1],k,v} oznaczają początek pętli z kwerendy (zakładka Kwerendy), która zwraca parę wartości: klucz (k) oraz wartość (v). Należy pamiętać o zamknięciu pętli konstrukcją {end:} . Odwołanie do wartości każdego raportu w pętli to: {v[adddat]} , gdzie oznacza to pobranie wartości (v) kolumny [adddat]. Jeżeli źródłem danych jest pole tekstowe, to należy zastosować konstrukcję {v[commnt]:h} , gdzie istotny jest modyfikator :h, który wyłącza przetwarzanie funkcji htmlspecialchars. Uniemożliwia to wykonanie np. szkodliwych skryptów JavaScript.
Obecnie mamy dwa elementy takiego systemu. Jak to teraz połączyć, aby ze sobą współpracowały?
Przejdź do Menu
Przykład użycia: {str_replace(#-#, ##, documents.dscrpt):h} Powyższe wywołanie usunie wszystkie wystąpienia znaku "-" z tekstu znajdującego się pod zmienną "documents.dscrpt"
{trim(documents.dscrpt):h} Powyższe wywołanie usunie wszystkie białe znaki z początku i końca tekstu znajdującego się pod zmienną "documents.dscrpt"
{substr(documents.dscrpt, 2, 0):h} Powyższe wywołanie zwróci tekst ze zmiennej "documents.dscrpt" począwszy od drugiego znaku.
Opis dokumentu {if:strpos(documents.dscrpt, #123#)}ZAWIERA{else:}NIE ZAWIERA{end:} ciąg: "123"
eq(1,2) jednoznaczne z 1 == 2 gt(1,2) jednoznaczne z 1 > 2 gte(1,2) jednoznaczne z 1 >= 2 lt(1,2) jednoznaczne z 1 < 2 lte(1,2) jednoznaczne z 1 <= 2przykład:
{if:gt(vatnote.netto_,0)} kwota netto jest większa od zera {end:}
wszystkie dostępne funkcje:
round($val, $precision = NULL); in_array($val, $array); array_key_exists($key, $array); strpos($haystack, $needle); stripos($haystack, $needle); substr($string, $start, $length); str_replace($from, $to, $source); trim($string); preg_quote($str); preg_replace($from, $to, $source); date($format, $time = NULL); number_format( float $number , int $decimals , string $dec_point , string $thousands_sep ) str_pad( string $input , int $pad_length [, string $pad_string= " " [, int $pad_type= STR_PAD_RIGHT ]] )
Przejdź do Menu