Vlastné značky

Posledné novinky

Asi hotovo.

Takže, už to vyzerá byť dokončené. Od minula som pridal animovanie cez timer a možnosť upravovať...


14.12.2014 19:13
Kategória: Projekt key-framing a interpolácia

Prvá funkčná verzia

Po tejto sobote mám už prvý reálny výsledok. Viem nastavovať keyframe s pozíciou kamery, pohľadom...


14.12.2014 00:23
Kategória: Projekt key-framing a interpolácia
Choď do archívu >>

Vlastné značky

Vlastné značky sú php súbory, ktoré musia obsahovať triedu rozširujúcu triedu swiftPluginCompilerAbstract.

Toto je jediný typ pluginu, ktorý sa inštancuje a vykonáva v momente prekladu!

Trieda musí obsahovať tieto povinnú triednu premennú:

protected $tag_name = 'nazov.tagu'

Kde nazov.tagu je rovnaká konvencia názvu ako bodková konvencia pri názvoch pluginov v šablóne.

Okrem povinnej premennej musí implementovať tri povinné metódy:

public function compile_single($additional_arguments, [ďalšie parametre]) {}

public function compile_pair_open($additional_arguments, [ďalšie parametre]) {}

public function compile_pair_close($additional_arguments, [ďalšie parametre]) {}

Zápis a názov prvého parametra sú povinné.

Ďalšie parametre sa volajú zhodne s parametrami používanými v šablóne vrámci značky. Tie parametre, ktoré nemajú zadanú východziu hodnotu sú v šablóne povinné. Parameter $additional_arguments obsahuje nastavenia pre tie parametre, ktoré značka štandardne nedefinuje (podobne ako v plugine pre funkciu).

POZOR: Hodnoty, ktoré parametre obsahujú, nie sú reálne hodnoty ale reťazce z textom, ktorý bol zapísaný k danému parametru v šablóne. To isté platí aj pre východzie hodnoty. Vzhľadom na toto správanie sa základná trieda definuje niekoľko metód, ktoré dovoľujú získať konečné hodnoty z parametrov.

Značka je vykonávaná ako inštancovaný objekt v čase kompilácie, musí byť napísaná tak, aby vrátila vykonateľný php kód (pomocou return).

Metódy a premenné triedy swiftPluginCompilerAbstract

Trieda obsahuje tieto členské premenné:

protected $swift;

protected $swift_compiler;

protected $tag_name;

Kde $swift je referencia na objekt frameworku a $swift_compiler je referencia na objekt kompilátora.

Ďalej obsahuje tieto užitočné metódy:

protected function _($code) {}

Vstupom je parameter značky, ktorý bude očistený o všetky escapovacie spätné lomítka.

Zobraziť čistý text Zobraziť zvíraznený text
  1. ...
  2. public function compile_single($additional_arguments, $nazov) {
  3. $code = '<' . '?php echo ' . $this->_($nazov) . '; ?>';
  4. return $code;
  5. }
  6. ...

protected function _l($code) {}

Vstupom má byť parameter obsahujúci reťazec z názvom premennej. Funkcia zoberie tento vstup, skontroluje či je platný a vráti názov kód pre lokálnu premennú, alebo ukončí kompiláciu s chybovou správou.

Zobraziť čistý text Zobraziť zvíraznený text
  1. ...
  2. public function compile_pair_open($additional_arguments, $lpremenna) {
  3. $locals = array($lpremenna);
  4. $this->swift_compiler->addToStack(get_class($this), $locals, array());
  5.  
  6. $code = '<' . '?php ' . $this->_l($lpremenna) . ' = 10; ?>';
  7.  
  8. return $code;
  9. }
  10. ...

protected function _lr($code, $vars = array()) {}

Zoberie kód výrazu $code a nahradí v ňom každý výskyt globálnej premennej s nejakým menom z pola $vars za lokálnu premennú s rovnakým menom.

Zobraziť čistý text Zobraziť zvíraznený text
  1. ...
  2. public function compile_pair_open($additional_arguments, $var, $from, $condition, $iteration) {
  3. ...
  4. $code = '<' . '?php for(' . $this->_l($var) . '=' . $this->_($from) . ';' . $this->_lr($condition, array($var)) . ';' . $this->_lr($iteration, array($var)) . ') {';
  5.  
  6. return $code;
  7. ?>

protected function _lc($code, $scope_name = "", $additional_path = array()) {}

Funkcia dostane v parametre $code lokálnu premennú, ktorú prevedie na globálnu premennú v $this->tpl_vars['swift'][$code]. Ak je nastavené $scope_name na nejaký názov, bude výsledok vyzerať $this->tpl_vars['swift'][$scope_name][$code]. Všetky hodnoty pola v $additional_path sa zapíšu ako ďalšie kľúče v konečnom poli.

Ak teda zavoláme $this->_lc('"premenna"', 'scope', array('kluc1', 'kluc2')) dostaneme $this->tpl_vars['swift']['scope']['premenna']['kluc1']['kluc2'].

protected function _i($path = array()) {}

V prípade, že potrebujeme uložiť informáciu, ktorá nemá byť dostupná ako premenná markera, môžeme pomocou tejto metódy vytvoriť záznam v poli internals. Keď záznam prestane byť potrebný, je dobré ho zrušiť vygenerovaním kódu unset(). Parameter $path obsahuje cestu k záznamu v poli.

Zobraziť čistý text Zobraziť zvíraznený text
  1. public function compile_single($additional_arguments, $pole) {
  2. ...
  3. $code .= '<' . '?php ' . $this->_i(array('moja_znacka', $this->getUniqueID(), 'velkost_pola')) . ' = count(' . $this->_($pole) . '); ?>';
  4. ...
  5. }

protected function _a($expression) {}

Ak vieme, že $expression obsahuje kód pre pole, táto metóda nám reťazcovú reprezentáciu pola opäť vráti ako normálne php pole.

Takže napríklad z volania $this->_a('array("Ahoj svet!")') dostaneme pole array("Ahoj svet!").

protected function e() {}

Ak je treba vrátiť chybovú správu, táto metóda nám pre túto správu vráti pole s prídavnými informáciami ako je názov súboru a číslo riadku.

Zobraziť čistý text Zobraziť zvíraznený text
  1. ...
  2. $this->swift->addError('Nastala chyba', SWIFT_ERROR_TYPE_NOTICE, $this->e());
  3. ...

protected function s() {}

V prípade potreby je možné získať premennú referencie na objekt swift pomocou tejto metódy. Názov tejto premennej je potom použiteľný vo výstupnom kóde. Funkcia vracia '$this' alebo '$swift', podla toho, či sa kompilácia nachádza alebo nenachádza vnútri v šablóne definovanej funkcie.

protected function isVariable($code) {}

Vráti true, ak $code obsahuje platný názov premennej (lokálnej alebo globálnej).

Použiteľné metódy z triedy swiftCompiler ($swift_compiler)

public function addToStack($tagName, $localVariables = array(), $specialVariables = array()) {}

Metóda zaradí značku $tagName do zásobníka, značka môže nastaviť zoznam lokálnych premenných v poli $localVariables (tieto premenné nesmú byť už použité predtým) a môže si zapísať do zásobníka ďalšie informácie v poli $specialVariables.

public function getStackTopItem() {}

Vráti názov značky na vrchu zásobníka, alebo prázdny reťazec, ak je zásobník prázdny.

public function getStackTopItemSpecialVariables() {}

Z vrchu zásobníka vráti pole premenných, ktoré sú uložené spolu s názvom značky. Ak je zásobník prázdny, vráti prázdne pole.

public function removeTopFromStack() {}

Vyhodí najvrchnejší prvok v zásobníku. Metóda nevracia nič.

public function findInStack($tagName) {}

Vráti true, ak sa v zásobníku nachádza aspoň raz značka $tagName.

public function getCurrentLine() {}

Vráti číslo riadka, na ktorom sa nachádza kompilovaná značka.

public function getCurrentFile() {}

Vráti názov práve kompilovaného súboru.

Ďalšie použiteľné metódy triedy swift ($swift)

public function addError($message, $type = SWIFT_ERROR_TYPE_NOTICE, $additional = array()) {}

Metóda pridá chybovú správu $message do zoznamu chybových správ. Chybová správa môže mať nasledovný typ ($type):

  • SWIFT_ERROR_TYPE_NOTICE
  • SWIFT_ERROR_TYPE_WARNING
  • SWIFT_ERROR_TYPE_FATAL

Pomocou pola $additional môžeme pridať ďalšie informácie, pole $additional má štruktúru:

array('položka' => 'informácia', ...)

kde položka aj informácia sú zobrazené tak ako sú, tj. obsahujú priamo text, ktorý uvidí používateľ.