1. Na to nie wpadłem :) Zrobiłem teraz tak i wszystko ładnie działa:
class Template_Validator extends Opt_Instruction_Root {
protected $_name = 'validator';
public function configure() {
$this->_addInstructions(array('opt:root'));
}
public function processNode(Opt_Xml_Node $node) {
parent::processNode($node);
// tutaj następuje walidacja szablonu
}
}
Mógłbym zarejestrować funkcję lub nową instrukcję, która generowałaby URL-e, ale nie o to mi chodzi. Celem tej modyfikacji jest skrócenie czasu pracy poprzez zmniejszenie ilości kodu, który musimy wpisać, aby wygenerować poprawy szablon (a w efekcie kod HTML). Np.:
a) w 90% przypadków zawartość atrybutu TITLE jest taka sama jak zawartość ALT, więc jeżeli nie podam TITLE, to zostanie on automatycznie skopiowany z ALT-a,
b) 90% obrazków jest trzymana zawsze w tym samym katalogu; zamiast za każdym razem pisać pełną ścieżkę, możemy wpisać po prostu nazwę obrazka; jeżeli nie zostanie podana pełna ścieżka, to zostanie dodany domyślny katalog.
Może powyższe przykłady może są jeszcze, aż tak uciążliwe, żeby pisać dodatkowy kod od ich obsługi, ale dobrze pokazuje co chcę osiągnąć.
2. Udało mi się skopiować zawartość odsyłacza do atrybutu TITLE, jeżeli nie jest on wypełniony. Przykład:
Zamieniamy <a href="register,index.html">Rejestracja</a>
na <a parse:href="$Domain~'register,index.html'" title="Rejestracja">Rejestracja</a>
Niestety pobieranie zawartości tagu A jest to trochę skomplikowane (w tym przypadku pobieranie tekstu "Rejestracja"). Parsery XML posiadają często metody np. GetValue, które zwracają takie dane. W OPT czegoś takie nie znalazłem (podejrzewam, że nie jest to po prostu potrzebne). Udało mi się osiągnąć taki efekt poprzez iterowanie po elementach podrzędnych (Opt_Xml_Text, Opt_Xml_Cdata oraz Opt_Xml_Expression) i pobieranie ich zawartości (metoda __toString). Istnieje szybszy / lepszy sposób?