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:
pages
/ souborpages
/ souborZá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(); ?> ...
... <? sub my_func { print 'page2'; } my_func(); ?> ...
<? ... ?>
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:
Ve většině případů není nutné tento objekt používat, protože
k dispozici jsou všechny funkce modulu CGI přímo, viz
use CGI qw(:all)
.
Dále je možné použít tyto zkratky, které budou nahrazeny odpovídajícím textem:
PAR(id)
- hodnota z parametrizace aktuální
aplikaceTXT(id)
- text podle aktuálního jazykaG(id)
- je nahrazeno výrazem $g{'id'}
<?= ... ?>
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> ...
<?!---- ... ----?>
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.
<?!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:
include
/ souborinclude
/ souborSoubor 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?>
<?!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:
package
/ souborpackage
/ souborMá 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?>
<?!use ...?>
Syntaxe: <?!use filename
Program se soubor jména [filename].pm pokouší najít obdobně jako v případě stránky (.pg) takto:
modules
/ soubormodules
/ souborTato 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.
<?!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.
<?!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.
<?!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:
javascript
/ souborjavascript
/ souborV 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.
PAR([id])
je nahrazeno obsahem $conf{'id'} (konfigurace)TXT([id])
je nahrazeno obsahem $txt{'id'} (text)GLB([id])
je nahrazeno obsahem $g{'id'} (globální hash)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); }
<?!javascript example1?>
<?!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):
css
/ param('SCH')
/ souborcss
/ souborcss
/ param('SCH')
/ souborcss
/ souborV 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.
PAR([id])
je nahrazeno obsahem $conf{'id'} (konfigurace)TXT([id])
je nahrazeno obsahem $txt{'id'} (text)GLB([id])
je nahrazeno obsahem $g{'id'} (globální hash)Příklad - soubor example2.css:
BODY { background-image: url(GLB(img_dir)/backg1.gif); }
<?!css example2?>
<?!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:
statement
/ souborstatement
/ soubor_DATE_
vloží konstrukci pro datum_DATETIME_
vloží konstrukci pro datum a časSELECT * FROM cats_users WHERE pernr = ? AND last_chgp = _DATETIME_
<?!statement MY_STAT?> <?!statement 2:OTHER_STAT?> ... <? my $result = $db->perform_statement('MY_STAT'); ?>
<?!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:
function
/ souborfunction
/ souborFunkce 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)'; }
... <?!do func.pl 5,8?> <?=$g{'to_print'}?> ...
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:
actions
/ souboractions
/ souborinclude
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.