Next Previous Contents

4. Syntaxe

4.1 Stránky (.pg)

Jsou hlavní součástí aplikace a většina ostatních souborů se vztahuje právě k těmto souborům. Podle nastavení proměnné PG masser vyhledá patřičný soubor, který vykoná, podle nastavení path z konfigurace masseru a aplikace. Pokouší se najít soubor podle obsahu PG s příponou .pg nejdříve podle konfigurace aplikace a poté masseru samotného takto:

Základní složkou syntaxe těchto souborů jsou řídící tagy <? a ?>. Informace umístěné mezi těmito tagy program dále při kompilaci zpracovává, zbytek souboru vytiskne beze změny na výstup.

Dále je možné použít varianty těchto tagů, všechny jsou zmíněny v následujících podsekcích.

Kód vložený do stránky je lokální v tom smyslu, že například funkce zapsaná ve stránce je neviditelná z jiných stránek v téže nebo jiné aplikaci, to samé platí pro proměnné (kromě globálních).

Příklad - aplikace APP, soubor page1.pg:


...
    <?
        sub my_func { print 'page1'; }
    
        my_func();
    ?>
...

Příklad - aplikace APP, soubor page2.pg:
...
    <?
        sub my_func { print 'page2'; }
    
        my_func();
    ?>
...

Ve stránce page1 vytiskne "page1", ve stránce page "page2".

Kód <? ... ?>

Text mezi těmito dvěma tagy je považován za kód perlu a prakticky beze změny je proveden. Programátor může počítat s těmito globálními proměnnými:

Dále je možné použít tyto zkratky, které budou nahrazeny odpovídajícím textem:

Vložení hodnoty <?= ... ?>

Tato varianta se používá pro vložení hodnoty na dané místo stránky v případě, že se neprovádí žádná další akce. Text <?=$variable?> je ekvivalentní <? print $variable; ?>.

Příklad:


...
    <h1> <?='TXT(app_title)'?> </h1>
...

Poznámka <?!---- ... ----?>

Používá se pro označení poznámky. Text mezi těmito dvěma tagy nebude zpracován ani vytištěn do výsledného souboru.

Narozdíl od poznámky v HTML (<!---- ... ---->), která je do výsledné stránky přenesena.

Vložení kódu <?!include ...?>

Syntaxe: <?!include filename [def1,[def2,...]]?>

Program se soubor daného jména pokouší najít obdobně jako v případě stránky (.pg) takto:

Soubor je vložen přímo do kódu, takže syntaxe souboru je stejná jako u stránek, je možné použít všechny speciální příkazy.

Systém masser v současné verzi nekontroluje rekurzivní vkládání pomocí direktivy include, takové použití vede k zacyklení programu!
Definice defX lze použít pro řízení skutečně zahrnutých částí obsahu .inc pomocí if, else a end konstrukce.

Příklad:


   Soubor test.pg:
     <?!include table print?>
   Soubor table.inc:
     <?!use table?>
     <?!javascript table?>
     <?:if print?>
       <?!css table_print?>
     <?:else?>
       <?!css table_screen?>
     <?:end?>

Balíček <?!package ...?>

Syntaxe: <?!package filename [def1,[def2,...]]?>

Program se soubor jména [filename].pkg pokouší najít obdobně jako v případě stránky (.pg) takto:

Má prakticky stejnou funkci, jako include, ale předpokládá se spíše využití pro "zabalení" více modulů do jednoho funkčního celku (například JavaScript, CSS a kód dohromady).

Příklad:


   <?!include button.inc?>
   <?!javascript button?>
   <?!css button?>

Definice defX lze použít pro řízení skutečně zahrnutých částí obsahu .pkg pomocí if, else a end konstrukce.

Příklad:


   Soubor test.pg:
     <?!package table print?>
   Soubor table.pkg:
     <?!use table?>
     <?!javascript table?>
     <?:if print?>
       <?!css table_print?>
     <?:else?>
       <?!css table_screen?>
     <?:end?>

Modul <?!use ...?>

Syntaxe: <?!use filename

Program se soubor jména [filename].pm pokouší najít obdobně jako v případě stránky (.pg) takto:

Tato direktiva slouží k vložení instrukce pro zahrnutí modulu do kódu stránky. Může být umístěna kdekoliv, je zpracována při kompilaci. Modul pro využití v masseru se prakticky nijak neliší od modulu v jazyce perl, ale lze v něm využít dalších možností - podrobnosti jsou dále v příslušné kapitole.

Začátek stránky <?!page_start ...?>

Syntaxe: <?!page_start [key1=>value1, key2=>value2, ...]?>

Vytiskne hlavičku stránky (HTTP hlavičku a začátek stránky po tag BODY včetně). Jako parametry lze použít jakékoliv parametry přípustné ve funkci modulu CGI start_html() a kromě nich také:

Tento příkaz musí být první výstup ve stránce, protože tiskne hlavičku HTTP protokolu, v jiném případě je výsledkem 500 Internal Error a v logu HTTP serveru hlášení typu "malformed headers".

Příklad:


...
    <?!page_start title=>'TXT(app_title)', bgcolor=>'#ffffff'?>
...

Tato funkce navíc zaručuje vložení odpovídajícího JavaScript kódu a definice CSS, pokud ji nepoužijete, tagy javascript a css nepracují správně. Funkce navíc vytiskne začátek formuláře a povinné skryté proměnné - APP, PG, OP, LANG, SCH a SID.

Konec stránky <?!page_end?>

Syntaxe: <?!page_end?>

Příkaz vytiskne konec stránky - ukončí formulář, BODY a HTML tagy. Měl by být použit na konci stránky.

Vložení JavaScriptu <?!javascript ...?>

Syntaxe: <?!javascript [ext:]filename?>

Umožňuje vložení JavaScript kódu do hlavičky stránky (mezi začátek a konec HEAD tagu). Pokud použijete předponu ext:, program vloží pouze odkaz na daný soubor, jinak se pokouší najít soubor jména [filename].js takto:

Jeho obsah přečte a vloží do stránky.

V souborech s JavaScriptem je možno použít tyto konstrukce:

Nelze použít v souborech vložených s předponou ext: - nejsou zpracovávány.

Příklad - soubor example1.js:


    alert('TXT(error_required)');
    var num_items = PAR(max_results);
    for (var i=0; i<G(nusers); i++) { alert(i); }

Příklad - stránka:
    <?!javascript example1?>

Tuto direktivu je možné použít kdekoliv ve stránce nebo vložených souborech, je zpracovávána při kompilaci.

Vložení CSS <?!css ...?>

Syntaxe: <?!css [ext:]filename?>

Umožňuje vložení CSS kódu do hlavičky stránky (mezi začátek a konec HEAD tagu). Pokud použijete předponu ext:

Vzhledem k omezení modulu CGI, který program využívá, není možné vložit více než jeden soubor s příponou ext: do stránky. Pokud jich použijete více, bude vložen první z nich.
, program vloží pouze odkaz na daný soubor, jinak se pokouší najít soubor jména [filename].css takto (zde je drobná změna oproti vyhledávání jinýc souborů aplikací masser - bere se v úvahu proměnná $schema kvůli tomu, aby bylo možné aplikacím měnit vzhled): Jeho obsah přečte a vloží do stránky.

V souborech s CSS je možno použít tyto konstrukce:

Nelze použít v souborech vložených s předponou ext: - nejsou zpracovávány.

Příklad - soubor example2.css:


    BODY { background-image: url(GLB(img_dir)/backg1.gif); }

Příklad - stránka:
    <?!css example2?>

Tuto direktivu je možné použít kdekoliv ve stránce nebo vložených souborech, je zpracovávána při kompilaci.

Příprava SQL příkazu <?!statement ...?>

Syntaxe: <?!statement [dbnum:]filename?>

Připraví SQL příkaz v databázi (prepare_statement). Pomocí předpony dbnum (číslo) lze určit, ve kterém připojení to má být, pokud program využívá více než jedno připojení k databázi. Pokud dbnum není uvedeno, program předpokládá připojení číslo 1.

Program hledá soubor [filename].sql takto:

Lze použít tyto konstrukce pro databázově závislé zpracování: Příklad - soubor MY_STAT.sql:
    SELECT * FROM cats_users WHERE pernr = ? AND last_chgp = _DATETIME_

Příklad - stránka:
    <?!statement MY_STAT?>
    <?!statement 2:OTHER_STAT?>
...
    <?
        my $result = $db->perform_statement('MY_STAT');
    ?>

Připravené SQL dotazy jsou globální pro celou aplikaci, ale neovlivňují ostatní aplikace. Pokud není masser v debug módu, je každý příkaz připraven pouze jednou, i když je vložen na více stránkách. Obdobně jako JavaScript a CSS je možné příkaz zapsat na jakémkoliv místě stránky nebo vloženého souboru, informace je zpracována při kompilaci.

Volání funkce <?!do ...?>

Syntaxe: <?!do filename [parameters]?>

Na daném místě provede - na rozdíl od include nevloží celý kód - funkci, jejíž kód je v souboru filename, který masser hledá takto:

Obsahem souboru musí být perlovský kód, lze použít stejné konstrukce, jako ve stránce mezi tagy <? a ?> - tedy PAR, TXT a G a stejné globální proměnné.

Funkce je globální pro celou aplikaci - mezi aplikacemi je neviditelná.

Příklad - soubor func.pl:


    my (undef,$par1,$par2) = @_;
    # POZOR! První parametr funkce je jméno aplikace!

    if ($par1 > $par2) {
        G(to_print) = 'TXT(is_greater)';
    } elsif ($par1 < par2) {
        G(to_print) = 'TXT(is_lesser)';
    } else {
        G(to_print) = 'TXT(is_equal)';
    }

Příklad - stránka:
...
    <?!do func.pl 5,8?>
    <?=$g{'to_print'}?>
...

4.2 Akce (.ac)

Akce jsou vyvolávány na základě obsahu proměnné OP, kde může být prázdný řetězec (žádná akce), identifikátor akce, nebo seznam identifikátorů akce oddělený čárkami.

Akce jsou prováděny před stránkami.

Program hledá soubor podle jména v OP s příponou .ac takto:

Syntaxe těchto souborů je stejná, jako u stránek, praktický význam ale má pouze perlovský kód, a direktivy include a statement. Nic vám ale nebrání použít cokoliv ze zbývajících možností.

Lze použít stejné konstrukce (TXT, PAR, G) a počítat se stejnými globálními proměnnými.


Next Previous Contents