{HEADER END}
{BLAME START}

MLAB

[/] [Server/] [GenIndex/] [TemplateEngine.php] -

Blame information for rev 1869

Číslo řádky Revize Autor Line
1 944 miho <?php
2 944 miho
3 944 miho //  Template Engine
4 944 miho //  ---------------
5 944 miho //
6 944 miho // Tento modul zpracovává tmplejty a strká do nich dynamicky geenrované
7 944 miho // informace a vytváří tak dynamické HTML stránky s oddělenou logikou
8 944 miho // programu a vzhledu.
9 944 miho //
10 944 miho // Více viz popis činnosti v konentáři na začátku templejtu
11 944 miho //
12 944 miho // (c)miho www.mlab.cz 2007, free software
13 944 miho //
14 944 miho // Typické použití objektu je toto:
15 944 miho //
16 944 miho //      - Založ objekt templejtu (new)
17 944 miho //      - $Template = new TemplateEngine();
18 944 miho //
19 944 miho //      - Načti templejt ze souboru do objektu (ošetři chybu!)
20 944 miho //      - $error = $Template->LoadTemplate($TemplateFile);
21 944 miho //
22 944 miho //      - Tady se provádí generování masa, je možné použít proměnné,
23 944 miho //      - modifikovat proměnné a nechat provéstsubstituce v proměnných
24 944 miho //      - do řetězců.
25 944 miho //
26 944 miho //          $Template->SetVariable('InfoTitle','Generovaný seznam');
27 944 miho //          - první parametr je jméno proměnné, druhý je jeho nový obsah
28 944 miho //
29 944 miho //          $Line = $Template->SetVariable('InfoLine')
30 944 miho //          - vrací obsah proměnné nebo prázdný řetězec
31 944 miho //
32 944 miho //          - Připrav si proměnné, které se budou strkat do vzorového řetězce
33 944 miho //          $Variables[InfoName]    = 'nějaká informace pro proměnnou InfoName';
34 944 miho //          $Variables[InfoPicture] = 'jiná informace pro proměnnou InfoPicture';
35 944 miho //          - aplikuj (nahraď) proměnné na vzorový řetězec z propměnné 'InfoLine'
36 944 miho //          $Line = $Template->Substitute($Variables, $Template->GetVariable('InfoLine'));
37 944 miho //
38 1869 kaklik //      - Nakonec se aplikují proměnné do nataženého templejtu a výsledek
39 944 miho //      - se pošle klientovi
40 944 miho //      echo $Template->GetPage();
41 944 miho //
42 944 miho
43 944 miho
44 944 miho // Objekt pro zpracování templejtu
45 944 miho class TemplateEngine
46 944 miho {
47 944 miho
48 944 miho   private $Page;      // Sem se načte templejt a zde se provádí substituce
49 944 miho   private $Info;      // Sem se načtou z templejtu proměnné
50 944 miho
51 944 miho
52 944 miho   function ListInfo()
53 944 miho   // Vypíše nalezené proměnné a jejich hodnoty
54 944 miho   // Pouze pro ladění
55 944 miho   {
56 944 miho     echo "[ ListInfo:\n";
57 944 miho     print_r($this->Info);
58 944 miho     echo ']';
59 944 miho   }
60 944 miho
61 944 miho
62 944 miho   function LoadTemplate($TemplateFileName$Lang)
63 944 miho   // Načte templejt ze souboru, při chybě vrací chybový řetězec
64 944 miho   // Snaží se rozumně využít informaci o jazyku k otevření správné verze
65 944 miho   // templejtu. Cesta se zadává bez jazykové části ale s příponou.
66 944 miho   {
67 944 miho     // Vlož zadaný jazyk do názvu souboru
68 944 miho     $TemplateFileName LangFile($TemplateFileName$Lang);
69 944 miho
70 944 miho     // Načti template ze souboru (po řádcích do pole)
71 944 miho     $this->Page = @file($TemplateFileName);
72 944 miho     if ($this->Page=='')
73 944 miho       return 'Unable Open Template File';
74 944 miho
75 944 miho     // Sestav z pole jeden retězec
76 944 miho     $this->Page implode($this->Page);
77 944 miho
78 944 miho
79 944 miho     // Definice regulárních výrazů pro hledání
80 944 miho     // ---------------------------------------
81 944 miho
82 944 miho     // Definice vzoru pro hledání komentáře ve tvaru <!-- -->
83 944 miho     //   Komentář je nepojmenované pole
84 944 miho     //   Před a za koentářem mohou být bílé znaky
85 944 miho     //   Uvnitř komentáře nesmí být znak >
86 944 miho     $PatternComment '(?:\s*<!--[^>]*--\s*>\s*)';
87 944 miho         //  (?:         nepojemnované pole
88 944 miho         //    \s*       volitelné bílé znaky před
89 944 miho         //    <!--      začátek komentáře
90 944 miho         //    [^>]*     vniřek komentáře (neobsahuje >)
91 944 miho         //    --\s*>    konec komentáře
92 944 miho         //    \s*       volitelné bílé znaky za komentářem
93 944 miho         //  )           tady končí komentář
94 944 miho
95 944 miho     // Definice vzoru pro hledání proměnných ve tvaru $InfoXXX
96 944 miho     $PatternVar ='\$(?P<VarName>Info[a-z,A-Z,0-9,\-\_]+)';
97 944 miho         //  \$                            na začátku $
98 944 miho         //  (?P<VarName>                  pojmenované pole VarName je (jméno proměnné bez dolaru)
99 944 miho         //    Info[a-z,A-Z,0-9,\-\_]+     proměnná začíná Info a pak jsou písmena,
100 944 miho         //  )                               číslice, mínus a podtržítko
101 944 miho
102 944 miho     // Definice vzoru pro hledání hodnot proměnných ve tvaru = " Hodnota "
103 944 miho     // Definice hodnot je ve tvaru $InfoXXX="YYY" a mohou být víceřádkové
104 944 miho     // ( a mohou obsahovat uvnitř další substituce uvozené $,  které program
105 944 miho     // zpracovává ale ne tady)
106 944 miho     $PatternValue '\s*=\s*"(?P<VarValue>[^"]*)"';
107 944 miho         //  \s*=\s*                       rovná se volitelnými bílými znaky okolo
108 944 miho         //  "                             hodnota v uvozovkách
109 944 miho         //  (?P<VarValue>                 parametr s názvem VarValue
110 944 miho         //    [^"]*                         hodnota nesmí obsahovat uvozovky
111 944 miho         //  )                             vracíme hodnotu bez uvozovek
112 944 miho         //  "                             konec uvozovek
113 944 miho
114 944 miho     // Zparacování vzoru
115 944 miho     // -----------------
116 944 miho
117 944 miho     // Najdi na začátku stránky komentář a vykousni ho
118 944 miho     $pattern '/^'  .$PatternComment.  '+/su';
119 944 miho     $this->Page preg_replace($pattern''$this->Page);
120 944 miho         //  /                     oddělovač
121 944 miho         //  ^                     od začátku řetězce (jen komentáře na začátku souboru)
122 944 miho         //  $PatternComment       komentář (<!-- -->) s bílými znaky okolo
123 944 miho         //  +                     alespoň jeden komentář
124 944 miho         //  /su                   modifikátor, . zastupuje i odřádkování, utf8
125 944 miho
126 944 miho
127 944 miho     // Najdi v templejtu substutuční proměnné a vytvoř v poli $Info
128 944 miho     // prázdné položky pro každou použitou proměnnou. Dělá se to proto,
129 944 miho     // aby se na konci nepoužité proměnné nahradily prázdným řetězcem.
130 944 miho     $pattern    '/' .$PatternVar'/su';
131 944 miho     preg_match_all($pattern$this->Page$temp);
132 944 miho         //  /                     oddělovač
133 944 miho         //  .$PatternVar.         proměnná ( $InfoXXX ) - parametr VarName
134 944 miho         //  /su                   modifikátor zajistí, že . zastupuje i odřádkování, utf8
135 944 miho     foreach($temp['VarName'] as $key => $value)
136 944 miho       $this->Info[$value] = '';
137 944 miho     unset($temp);
138 944 miho
139 944 miho     // Vytáhni proměnné a jejich hodnoty do pole $Info
140 944 miho     $pattern '/' .$PatternVar.$PatternValue'/su';
141 944 miho         //  /                     oddělovač
142 944 miho         //  .$PatternVar.         proměnná ( $InfoXXX )       - parametr VarName
143 944 miho         //  .$PatternValue.       přiřazení ( = " Hodnota " ) - parametr VarValue
144 944 miho         //  /su                   modifikátor, . zastupuje i odřádkování, UTF8
145 944 miho     preg_match_all($pattern$this->Page$temp);
146 944 miho     foreach($temp['VarName'] as $key => $value)
147 944 miho       $this->Info[$value] = $temp['VarValue'][$key];
148 944 miho     unset($temp);
149 944 miho
150 944 miho     // Vykousej zpracované definice proměnných (a komentáře před nimi)
151 944 miho     $pattern '/' .$PatternComment.'?'.$PatternVar.$PatternValue'/su';
152 944 miho         //  /                     oddělovač
153 944 miho         //  .$PatternComment.'?'  volitelný komentář před definicí
154 944 miho         //  .$PatternVar.         proměnná ( $InfoXXX )
155 944 miho         //  .$PatternValue.       přiřazení ( = " Hodnota " )
156 944 miho         //  /su                   modifikátor, . zastupuje i odřádkování, UTF8
157 944 miho     $this->Page preg_replace($pattern''$this->Page);
158 944 miho   }
159 944 miho   
160 944 miho   function Indent($StringData$Indent)
161 944 miho   // Všechna odřádkování v řetězci $StringData odsadí o hodnotu $Indent pokud je
162 944 miho   // $Indent číslo nebo o déllku řetězce $Indent pokud je to řetězec
163 944 miho   {
164 944 miho     // Velikost odsazení (vyrob číslo)
165 944 miho     if (is_string($Indent))
166 944 miho       $Num mb_strlen($Indent,'utf-8');
167 944 miho     else
168 944 miho       $Num 0+$Indent;
169 944 miho
170 944 miho     // Odsazení
171 944 miho     return $StringData $Indent.str_replace("\n""\n".str_repeat(' '$Num), $StringData);
172 944 miho   }
173 944 miho
174 944 miho
175 944 miho /*
176 944 miho   function Substitute($Variables, $String)
177 944 miho   // Nahradí proměnné v řetězci $String obsahem proměnných z pole $Variables
178 944 miho   // a vrátí výsledný řetězec
179 944 miho   {
180 944 miho     if (is_array($Variables))
181 944 miho     {
182 944 miho       foreach($Variables as $Key => $Value)
183 944 miho       {
184 944 miho         // Hledací vzor (hledáme proměnnou s názvem v $Key)
185 944 miho         $Pattern = '\$'.$Key.'(?=[^a-z,A-Z,0-9,\-\_])';
186 944 miho             //    \$$Key                      hledáme $JmenoProměnné
187 944 miho             //    (?=                         následuje něco, co nemůže být jménem
188 944 miho             //        [^a-z,A-Z,0-9,\-\_]     a nezajímá nás
189 944 miho             //    )
190 944 miho
191 944 miho         // Vkládáme více řádek?
192 944 miho         $IsMultiline = !(strpos($Value, "\n") === FALSE);
193 944 miho         
194 944 miho         if (!$IsMultiline)
195 944 miho         {
196 944 miho           // Vkládáme jednoduchý řetězec
197 944 miho           $String = preg_replace('/'.$Pattern.'/su', $Value, $String);
198 944 miho               //    /su                         víceřádkové v UTF8
199 944 miho         }
200 944 miho         else
201 944 miho         {
202 944 miho           // Vkládáme řetezec s odřádkováním - je třeba odsazovat
203 944 miho           $String = preg_replace('/(.*)'.$Pattern.'/ue',
204 944 miho                                  "\$this->Indent(\$Value, '\\1')",
205 944 miho                                  $String);
206 944 miho               //    (.*)                        hledáme cokoli před vzorem -> první parametr
207 944 miho               //    .$Pattern.                  proměnná
208 944 miho               //    /ue                         UTF8, náhrada je php skriptem
209 944 miho         }
210 944 miho       }
211 944 miho     }
212 944 miho     
213 944 miho     return $String;
214 944 miho   }
215 944 miho */
216 944 miho
217 944 miho
218 944 miho   function Substitute($Variables$String)
219 944 miho   // Nahradí proměnné v řetězci $String obsahem proměnných z pole $Variables
220 944 miho   // a vrátí výsledný řetězec
221 944 miho   {
222 944 miho     // Hledací vzor
223 944 miho     $Pattern '/(.*?)\$(Info[a-z,A-Z,0-9,\-\_]+)(?=[^a-z,A-Z,0-9,\-\_])/ue';
224 944 miho
225 944 miho     // Náhrada s kusem php kódu (nezapomeň, že preg_replace s přepínačem /e vrací oescapované řetězce)
226 944 miho     $String preg_replace($Pattern,
227 944 miho                            'isset($Variables[\'\2\'])
228 944 miho                             ? $this->Indent($Variables[\'\2\'], stripslashes(\'\1\'))
229 944 miho                             : stripslashes(\'\1\')
230 944 miho                            ',
231 944 miho                            $String);
232 944 miho     return $String;
233 944 miho   }
234 944 miho
235 944 miho
236 944 miho   function SetVariable($VarName$VarValue$Wrap=0)
237 944 miho   // Nastaví hodnotu proměnné
238 944 miho   // Volitelně provede zálámání na zadaný počet znaků a odstranění nadbytečných mezer
239 944 miho   {
240 944 miho     // Volitelné zalámání a odstranění bílých znaků
241 944 miho     if ($Wrap!=0)
242 944 miho       $VarValue WrapString($VarValue$Wrap);
243 944 miho     
244 944 miho     // Uložení do proměnných
245 944 miho     $this->Info[$VarName] = $VarValue;
246 944 miho   }
247 944 miho   
248 944 miho
249 944 miho   function GetVariable($VarName)
250 944 miho   // Vrátí hodnotu proměnné tak, jak je, včetně mezer a odřádkování
251 944 miho   {
252 944 miho     if (isset($this->Info[$VarName]))
253 944 miho       return $this->Info[$VarName];
254 944 miho     else
255 944 miho       return '';
256 944 miho   }
257 944 miho   
258 944 miho
259 944 miho   function GetString($VarName)
260 944 miho   // Vrátí parametr jako jeden řetězec s redukovanými bílými znaky
261 944 miho   // Tedy bez odřádkování a nadbytečných mezer
262 944 miho   {
263 944 miho     return WrapString($this->GetVariable($VarName), 0);
264 944 miho   }
265 944 miho
266 944 miho   
267 944 miho   function GetPage()
268 944 miho   // Provede substituce ve stránce a vrátí ji jako řetězec
269 944 miho   // Substituce bere z proměnné $Info
270 944 miho   {
271 944 miho     // Proveď ve stránce substituce proměnných a vrať výsledek
272 944 miho     return $this->Substitute($this->Info$this->Page);
273 944 miho   }
274 944 miho }
275 944 miho
276 944 miho
277 944 miho ?>
{BLAME END}
{FOOTER START}

Poháněno WebSVN v2.1 alpha 1