<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="/pl/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>Invenzzia... po polsku</title>
  <link>http://blog.invenzzia.org/pl/</link>
  <description></description>
  <language>pl</language>
  <pubDate>nie, 02 mar 2008 16:33:56 +0100</pubDate>
  <copyright>Copyright &amp;copy; Invenzzia</copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>OPT 2.0.0-dev4</title>
    <link>http://blog.invenzzia.org/pl/post/OPT-200-dev4</link>
    <guid isPermaLink="false">urn:md5:6305be4ea0eddac6cb766e2d3fd21899</guid>
    <pubDate>nie, 02 mar 2008 11:14:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>OPT2</category>    
    <description>&lt;p&gt;Do ściągnięcia jest już czwarta wersja developerska Open Power Template'a. Projekt zaczyna nabierać kształtów, jako że na ukończeniu jest już główna klasa parsera. Oprócz wzmiankowanego wcześniej cache'u, zaimplementowałem nowe instrukcje oraz skończyłem prace nad snippetami tak, że w zasadzie już całe dziedziczenie szablonów działa, jak należy. Mam nadzieję, że pod koniec miesiąca biblioteka będzie już w takim stanie, że będzie nadawać się do ostrożnego użycia. Rzeczywiste projekty będą potrzebne, aby wykryć błędy oraz końcowe niedociągnięcia.&lt;/p&gt;    &lt;p&gt;W snippetach pojawiła się możliwość wstawienia zawartości rodzica za pomocą znacznika &lt;code&gt;opt:parent&lt;/code&gt;:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;
&amp;lt;opt:extend file=&amp;quot;test_inherited_a.tpl&amp;quot;&amp;gt;
	&amp;lt;opt:snippet name=&amp;quot;header&amp;quot;&amp;gt;
		&amp;lt;h1&amp;gt;Webmaster Of Puppets&amp;lt;/h1&amp;gt;
		&amp;lt;p&amp;gt;Here is the parent content:&amp;lt;/p&amp;gt;
		&amp;lt;opt:parent/&amp;gt;
		&amp;lt;p&amp;gt;End of the parent content&amp;lt;/p&amp;gt;
	&amp;lt;/opt:snippet&amp;gt;
&amp;lt;/opt:extend&amp;gt;
&lt;/pre&gt;


&lt;p&gt;W tym wypadku, jeżeli w pliku &lt;em&gt;test_inherited_a.tpl&lt;/em&gt; zdefiniowaliśmy snippet o identycznej nazwie, jego zawartość trafi na miejsce znacznika &lt;code&gt;opt:parent&lt;/code&gt;. Takie zagnieżdżanie działa wielopoziomowo. Gdyby i w tamtym snippecie użyto tego mechanizmu, OPT sięgnąłby jeszcze głębiej i tak dalej. Możliwe jest nawet wyciągnięcie domyślnej zawartości bloku &lt;code&gt;opt:insert&lt;/code&gt;, do którego ostatecznie snippet będzie wstawiony. Do całości dodałem na dokładkę prosty kod wykrywający nieskończoną rekurencję. Gdy taka zostanie wykryta, programista otrzyma elegancki, czerwony komunikat błędu :).&lt;/p&gt;


&lt;p&gt;Przy korzystaniu z nowego OPT powinna znacząco przydać się nowa konsola debugowa, rozszerzona w stosunku do analogicznej opcji w OPT 1.1.x. Główna zmiana dotyczy rozbicia listy wykonanych szablonów na mniejsze listy, które pokazują różne informacje:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lista wykonanych szablonów&lt;/li&gt;
&lt;li&gt;Lista aktualnie przekompilowanych szablonów&lt;/li&gt;
&lt;li&gt;Lista szablonów wczytanych z cache'u.&lt;/li&gt;
&lt;li&gt;Lista dziedziczenia szablonów - pokazuje użyte łańcuch zależności wraz z informacją, czy były one właśnie rekompilowane, czy nie.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dodatkowo, konsola wyświetla wszystkie ostrzeżenia, które w tej wersji nie są już bezczelnie ładowane na ekran. Można się do nich dostać jedynie poprzez konsolę debugową lub komunikat błędu, o ile ustawiliśmy odpowiedni poziom debugowania.&lt;/p&gt;


&lt;p&gt;Sprawa wydajności przedstawia się bardzo dobrze. Ostatecznie zamknąłem plik &lt;em&gt;opt.class.php&lt;/em&gt; w około 25 KB, w porównaniu do 32 KB z poprzedniej wersji, a na chwilę obecną wpływ jego rozmiaru jest dość dobrze widoczny w wynikach, jako że PHP musi załadować taki parser i go wstępnie skompilować do wewnętrznego bajtkodu. Naturalnie, gdy pozałączamy dużo szablonów, nie będzie to aż takie widoczne, ale mimo wszystko cieszę się z uzyskanego efektu.&lt;/p&gt;


&lt;p&gt;Paczkę można ściągnąć &lt;a href=&quot;https://invenzzia.org/download/opt-2.0.0-dev4.tar.gz&quot; hreflang=&quot;pl&quot;&gt;stąd&lt;/a&gt;. Zawiera ona również częściowo ukończoną polską dokumentację.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/OPT-200-dev4#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/OPT-200-dev4#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/17</wfw:commentRss>
      </item>
    
  <item>
    <title>Invenzzia.org... od nowa</title>
    <link>http://blog.invenzzia.org/pl/post/Invenzziaorg-od-nowa</link>
    <guid isPermaLink="false">urn:md5:589786ccda15b3f212a4aa4dffc074c2</guid>
    <pubDate>wto, 26 lut 2008 16:05:00 +0100</pubDate>
    <dc:creator>eXtreme</dc:creator>
        <category>Invenzzia</category>
        <category>invenzzia</category><category>website</category>    
    <description>&lt;p&gt;Powoli zaczynamy stawać na nogi. Miesiąc temu czas naglił i Zyx przygotował na szybko stronę naszej grupy oraz zainstalował devbloga. Dzisiaj prezentuję rozwiązanie bardziej rozbudowane. Niech będzie ono takim fundamentem i podstawą, dalszym krokiem w rozwoju naszej grupy. Strona została uzupełniona o teksty i informacje o grupie i choć wiele pracy jeszcze przed nami to z devblogiem sprawa jest już praktycznie zamknięta.&lt;/p&gt;    &lt;p&gt;Całego dotCleara zainstalowałem i skonfigurowałem od nowa. Nie ma już problemów z mieszaniem się języków wpisów, ponieważ blogi polski i angielski są teraz osobnymi miniblogami jednej instalacji. Detekcja języka usera zintegrowana jest z systemem zastosowanym na stronie i oparta jest na ciasteczkach i języku ustawionym w przeglądarce. Stworzyłem też bardziej czytelny i przyjazny szablon.&lt;/p&gt;


&lt;p&gt;A dlaczego nie Wordpress? Mam jakiś osobisty uraz, poza tym instytucja szablonów to tam praktycznie nie istnieje. Miałem swego czasu (nie)przyjemność tworzyć od podstaw jeden szablon i to była droga przez mękę. A z dotClearem2 już pracowałem wcześniej i bardzo przyjemnie się tu wszystko konfiguruje. Poza tym jest całkiem ciekawie napisany obiektowo na PHP5 więc za to duży plus. ;-)&lt;/p&gt;


&lt;p&gt;Grupa Invenzzia nie posiada jeszcze oficialnego logo, to widoczne na stronie głównej jest rozwiązaniem tymczasowym.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Invenzziaorg-od-nowa#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Invenzziaorg-od-nowa#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/15</wfw:commentRss>
      </item>
    
  <item>
    <title>Główna klasa OPT na ukończeniu</title>
    <link>http://blog.invenzzia.org/pl/post/Glowna-klasa-OPT-na-ukonczeniu</link>
    <guid isPermaLink="false">urn:md5:0e31e4a93c4e8d87810340a39dfbbd7a</guid>
    <pubDate>śro, 20 lut 2008 22:12:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>OPT2</category>    
    <description>&lt;p&gt;Owocem dzisiejszych zmagań z kodem źródłowym nowego OPT jest ukończenie pliku &lt;em&gt;opt.class.php&lt;/em&gt;, w którym (jak niektórym wiadomo) mieści się główna klasa parsera. Przyznam, że paradoksalnie plik ten był bardziej wymagający, niż kompilator. W tym drugim przypadku można sobie pozwolić na bardzo dużo, wystarczy pomysł na algorytm i przewidzenie, jak wpłynie on na resztę układu. Z główną klasą sprawa ma się troszeczkę inaczej. Jest ona dołączana za każdym razem, tak więc musi zawierać wszystko, co jest uruchamiane permanentnie. Musi to robić szybko, sprawnie i być nieduża. A tymczasem wymagania co do funkcjonalności rosną.&lt;/p&gt;    &lt;p&gt;Nowa wersja developerska będzie niekompatybilna z poprzednimi pod kątem interfejsu programistycznego. Aby zaimplementować cache tak, jak chciałem, musiałem przebudować niemal całą obsługę systemu wyjścia. W serii 1.x.x pojęcie systemu wyjścia w zasadzie nie istniało. To, czy wynik działania szablonu trafi na ekran, czy do zmiennej, zależało od wyboru odpowiedniej metody. Jakieś skomplikowane przełączenia i sztuczki kierowały wszystko do miejsca docelowego, aczkolwiek nie było w tym konsekwencji i strategia działania była średnio dopracowana. Cóż, tak wychodzi, jak się zaczyna od zachowywania podobieństw do Smarty'ego, a trzeba przypomnieć, że w początkowych, pionierskich czasach, było to jednym z założeń projektu. W OPTv2 istnieje jawnie zdefiniowany interfejs &lt;em&gt;ioptOutput&lt;/em&gt; pozwalający samodzielnie zaprogramować, co trzeba zrobić z wynikiem działania. Właśnie za jego pomocą realizowany będzie system cache, a jak - już tłumaczę.&lt;/p&gt;


&lt;p&gt;Dotąd w kodzie były dwa systemy wyjścia: &lt;em&gt;optNetOutput&lt;/em&gt; wysyłające wszystko na ekran i pilnujące przed dwukrotnym wysłaniem szablonu w trybie XML, oraz &lt;em&gt;optReturnOutput&lt;/em&gt; zwracające przechwycony rezultat. Dodałem do obu możliwość dekorowania ich czym innym i utworzyłem &lt;em&gt;optCachedOutput&lt;/em&gt; koncentrujące się w całości na obsłudze cache. Możliwości pozostaną po staremu, natomiast zmieni się sposób wywoływania i niestety trochę się rozbuduje inicjacja:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;$cache = new optCachedOutput('./cache/'); // to jest cache, tu go konfigurujemy.
$tpl -&amp;gt; register(OPT_OUTPUT, 'my_cache', $cache);
$tpl -&amp;gt; decorate(OPT_OUT_SCREEN, 'my_cache');
$tpl -&amp;gt; decorate(OPT_OUT_RETURN, 'my_cache');

if(!$cache -&amp;gt; isCached('szablon.tpl', 'jakis_id'))
{
  // generuj dane
}

$cache -&amp;gt; setCache(5, 'jakis_id'); // włącz cache na 5 sekund
$tpl -&amp;gt; parse('szablon.tpl', 'my_cache');
&lt;/pre&gt;


&lt;p&gt;Spróbuję jakoś skrócić i uprościć to, co widać na początku, zwłaszcza że mi też się to specjalnie nie podoba. Ponadto muszę sprawdzić, czy dekoracji przypadkiem w niewłaściwą stronę (niezgodnie z logiką i intuicją) pod względem nazewnictwa nie zrobiłem :).&lt;/p&gt;


&lt;p&gt;Obsługa wtyczek nie jest jeszcze w pełni gotowa - ukończyłem jedynie część znajdującą się w &lt;em&gt;opt.class.php&lt;/em&gt;, jako że reszta może spokojnie być z pożytkiem dla wydajności wyekspediowana gdzie indziej. Podobnie, jak w OPT 1.1.3, będzie możliwość ustawienia kilku katalogów z pluginami, lecz parser nie będzie już żądać w nich praw do zapisu. Wrzucane tam były dodatkowe pliki opisujące zawartość katalogu i pozwalające załączyć jego zawartość bez konieczności jego skanowania. Jednak wiadomo, że im więcej include'ów, tym wolniej wszystko działa, a niektórzy potrafią tych wtyczek naprodukować tyle, że mają tam więcej plików, niż liczy sobie cały mój framework :D. Dlatego teraz OPT będzie ze wszystkich pluginów składać jeden mega-plik zawierający wszystko, czego potrzeba nam do szczęścia. Przy okazji będę mieć również nowy algorytm do następcy OPT Toolsetu, który teraz będzie obsługiwać już wszystkie biblioteki Open Power.&lt;/p&gt;


&lt;p&gt;Ostatnia sprawa dotyczy zestawu funkcji dostępnych w szablonach. Stormfly niedawno pisał na swoim blogu, że w OPT 1.1.x był on bezsensownie dobrany i w sumie miał rację. Popatrzyłem, co tam programiście daje Smarty i okazało się, że ma tam on w zanadrzu kilka ciekawych funkcji, które mogą być naprawdę przydatne. Wstępna lista zawiera zatem:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;em&gt;spacify&lt;/em&gt; - pomiędzy każde dwa sąsiednie znaki podanego ciągu wstawiany jest inny ciąg.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;indent&lt;/em&gt; - robi wcięcia w tekście.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;truncate&lt;/em&gt; - obcina tekst do maksymalnie podanej długości (można dodać nierozcinanie słów na pół)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;strip&lt;/em&gt; - redukuje wszystkie grupy białych znaków do pojedynczego znaku.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;capitalize&lt;/em&gt; - odpowiednik ucfirst()&lt;/li&gt;
&lt;li&gt;&lt;em&gt;upper&lt;/em&gt; - odpowiednik strtoupper()&lt;/li&gt;
&lt;li&gt;&lt;em&gt;lower&lt;/em&gt; - odpowiednik strtolower()&lt;/li&gt;
&lt;li&gt;&lt;em&gt;countWords&lt;/em&gt; - odpowiednik str_word_count()&lt;/li&gt;
&lt;li&gt;&lt;em&gt;countChars&lt;/em&gt; - odpowiednik strlen()&lt;/li&gt;
&lt;li&gt;&lt;em&gt;money&lt;/em&gt; - odpowiednik money_format(), lecz ustawienia można zapisać w konfiguracji OPT.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;number&lt;/em&gt; - odpowiednik number_format(), lecz ustawienia można zapisać w konfiguracji OPT.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;wordWrap&lt;/em&gt; - odpowiednik word_wrap()&lt;/li&gt;
&lt;li&gt;&lt;em&gt;replace&lt;/em&gt; - odpowiednik str_replace()&lt;/li&gt;
&lt;li&gt;&lt;em&gt;regexReplace&lt;/em&gt; - odpowiednik preg_replace(), lecz z ostatnim argumentem wysuniętym na początek, aby nie było niekonsekwencji.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;date&lt;/em&gt; - odpowiednik date() :)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;firstof&lt;/em&gt; - zwraca pierwszy niepusty element z podanych.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;nl2br&lt;/em&gt; - odpowiednik nl2br() :)&lt;/li&gt;
&lt;li&gt;&lt;em&gt;array&lt;/em&gt; - tworzenie tablic po stronie szablonów.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;build&lt;/em&gt; - to, co w poprzednim OPT się nazywało apply(), ale jeszcze nie wiem, czy ostatecznie zostanie właśnie taka nazwa.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;W zestawie tym nie ma żadnych funkcji do escape'owania, ponieważ kompilator w wielu miejscach sam o to dba, a jeśli nie, będzie możliwość ręcznego zaznaczenia tego, aczkolwiek nie poprzez funkcję. W każdym razie chodzi o to, by kompilator wiedział, że coś jest escape'owane i z rozpędu sam czegoś od siebie nie dołożył, gdyż to równałoby się kaszanie na ekranie.&lt;/p&gt;


&lt;p&gt;Naprodukowałem całkiem sporo funkcjonalności, lecz koniec końców nie zdążyłem wszystkiego przetestować, tak więc nie mam pewności, czy cały ten kod w ogóle działa, jak należy, aczkolwiek jakichś specjalnych rewelacji się nie spodziewam. W końcu np. algorytmy cache'ujące zasadą działania nie różnią się specjalnie od tego, co było w poprzednich wersjach. Kolejny dev ukaże się już za parę dni.&lt;/p&gt;


&lt;p&gt;Na koniec mała statystyka:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;- &lt;em&gt;opt.class.php&lt;/em&gt; - 24 KB i więcej już nie urośnie. W poprzedniej wersji plik ten był o całe 8 KB cięższy, a w sumie oferował mniej.&lt;br /&gt;
- &lt;em&gt;opt.compiler.php&lt;/em&gt; - 65 KB i wciąż rośnie.&lt;br /&gt;
- &lt;em&gt;opt.instructions.php&lt;/em&gt; - 25 KB i wciąż rośnie.&lt;/p&gt;&lt;/blockquote&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Glowna-klasa-OPT-na-ukonczeniu#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Glowna-klasa-OPT-na-ukonczeniu#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/13</wfw:commentRss>
      </item>
    
  <item>
    <title>OPT 2.0.0-dev3</title>
    <link>http://blog.invenzzia.org/pl/post/OPT-200-dev3</link>
    <guid isPermaLink="false">urn:md5:40f330500ef782c5627da5ebdf0d61ca</guid>
    <pubDate>pią, 15 lut 2008 13:26:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>OPT2</category>    
    <description>&lt;p&gt;Zgodnie z zapowiedzią częstszego publikowania postępów prac, udostępniamy dziś trzecią wersję developerską nowego Open Power Template'a, nad którą pracowałem przez ostatni tydzień. Tym razem poświęciłem sporo uwagi przetwarzaniu atrybutów OPT, które robią różne ciekawe rzeczy ze znacznikami, do których zostały dodane. Wstępna implementacja już była - nawet przykłady dotyczące &quot;opt:section&quot; znajdowały się już w paczce. Jednak aby w pełni spełniała oczekiwania, trzeba było rozbudować cały kod.&lt;/p&gt;    &lt;p&gt;Zamieszczam parę przykładów pokazujących, co ciekawego można już zrobić. Zacznijmy od czegoś prostego. W OPT do osadzania wyrażeń w treści służą nawiasy klamrowe, w których umieszczamy wyrażenie, np.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;tekst tekst tekst {$blok} tekst tekst tekst
&lt;/pre&gt;


&lt;p&gt;Istnieje także instrukcja opt:put, która na pierwszy rzut oka wykonuje dokładnie to samo:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;tekst tekst tekst &amp;lt;opt:put value=&amp;quot;$blok&amp;quot;/&amp;gt; tekst tekst tekst
&lt;/pre&gt;


&lt;p&gt;Jednak dzięki temu, że to jest instrukcja, a nie nawiasy klamrowe, można z nią zrobić parę fajnych rzeczy przy pomocy atrybutów. Przypuśćmy, że chcemy uzyskać coś w stylu &quot;Wartość 1 / Wartość 2 / Wartość 3&quot;. Wystarczy nam do tego instrukcja opt:put, sekcja i separator:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&amp;lt;p&amp;gt;&amp;lt;opt:put value=&amp;quot;$sekcja.wartosc&amp;quot; opt:section=&amp;quot;sekcja&amp;quot; str:separator=&amp;quot; / &amp;quot;/&amp;gt;&amp;lt;/p&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Jak widać, taka sekcja obejmuje także znacznik, do którego została doklejona i możemy umieszczać wartości elementów w pozostałych atrybutach. Separator domyślnie akceptuje wyrażenia, lecz gdy nie mamy ochoty na pisanie &lt;em&gt;separator=&quot;'cośtam'&quot;&lt;/em&gt; (cudzysłów, a później apostrof), zmieniamy po prostu przestrzeń nazw na &quot;str&quot;.&lt;/p&gt;


&lt;p&gt;Ukończyłem również implementację odwróconych apostrof, które w stosunku do poprzedniej wersji zmieniają swoje działanie. Tym razem programista może samodzielnie zaprogramować ich obsługę, pisząc zwykłą funkcję i przekazując jej nazwę do parsera. Można to wykorzystać np. do eleganckiej implementacji systemu językowego a'la gettext:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&amp;lt;p&amp;gt;{`Parę przydatnych informacji...`}&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;{`Autor:`} {$autor}&amp;lt;/p&amp;gt;
&lt;/pre&gt;


&lt;p&gt;W końcu ostatnia ze zmian. Skoro mamy parser XML, potrzebujemy paru instrukcji, które umożliwią twórcy szablonów bezpośrednie manipulowanie drzewem, np. dodanie atrybutu o zmiennej nazwie. OPT będzie zawierać dwie instrukcje do tego celu: &lt;em&gt;opt:tag&lt;/em&gt; oraz &lt;em&gt;opt:attribute&lt;/em&gt;. Ta druga została dodana do najnowszej wersji developerskiej. Możemy jej użyć, aby móc wczytać nazwę atrybutu z bloku:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&amp;lt;div&amp;gt;
  &amp;lt;opt:attribute name=&amp;quot;$nazwa&amp;quot; value=&amp;quot;$wartosc&amp;quot;/&amp;gt;
  Treść...
&amp;lt;/div&amp;gt;
&lt;/pre&gt;


&lt;p&gt;To nie koniec - w połączeniu z sekcją uzyskujemy szybkie narzędzie do masowego dodawania atrybutów:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&amp;lt;div&amp;gt;
  &amp;lt;opt:attribute name=&amp;quot;$atrybut.nazwa&amp;quot; value=&amp;quot;$atrybut.wartosc&amp;quot; opt:section=&amp;quot;atrybut&amp;quot;/&amp;gt;
  treść...
&amp;lt;/div&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Jeśli do takiej sekcji wyślemy tablicę: &lt;code&gt;array(0 =&amp;gt; array('nazwa' =&amp;gt; 'class', 'wartosc' =&amp;gt; 'dude'), array('nazwa' =&amp;gt; 'id', 'wartosc' =&amp;gt; 'lol'))&lt;/code&gt;, uzyskamy:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&amp;lt;div class=&amp;quot;dude&amp;quot; id=&amp;quot;lol&amp;quot;&amp;gt;
  treść...
&amp;lt;/div&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Dość dużo czasu poświęciłem na rozwój dokumentacji. Wprawdzie dalej jest ona nieco z tyłu za kodem, ale powoli zaczyna go doganiać. Na ukończeniu jest opis sekcji, pojawiły się omówienia metod chronionych w &lt;em&gt;optClass&lt;/em&gt;, a nawet zalążki opisu kompilatora. Muszę też porządkować już istniejący kod, aby pasował do aktualnego stanu kodu oraz moich zamierzeń. Zachęcam do testowania i nadsyłania swych uwag.&lt;/p&gt;


&lt;p&gt;Download: &lt;a href=&quot;http://blog.invenzzia.org/pl/post/&quot; hreflang=&quot;pl&quot;&gt;https://invenzzia.org/download/opt-2.0.0-dev3.tar.gz&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/OPT-200-dev3#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/OPT-200-dev3#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/12</wfw:commentRss>
      </item>
    
  <item>
    <title>Nowy dev</title>
    <link>http://blog.invenzzia.org/pl/post/Nowy-dev</link>
    <guid isPermaLink="false">urn:md5:c99861121699affab67843d24771ede7</guid>
    <pubDate>sob, 09 lut 2008 10:52:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>OPT2</category>    
    <description>&lt;p&gt;Dodałem do strony dział &quot;Download&quot;, przy okazji umieszczając w nim nową wersję rozwojową Open Power Template'a. Znalazł się tam również nieduży skrypcik &quot;docgen&quot;, którego używamy do uruchamiania automatycznego parsowania dokumentacji w DocBooku. Nowe wersje rozwojowe będą teraz już publikowane znacznie częściej; w okresie dużego nasilenia prac być może nawet co dwa, trzy dni. Powód, dla którego nie były one dotąd tak częste, był brak automatyzacji, a przygotowanie takiej paczki pochłania trochę czasu (dla przykładu, umieszczenie nowej wersji OPT w Internecie zajmuje kilka godzin).&lt;/p&gt;    &lt;p&gt;W kolejnym devie znajduje się wszystko, co zaimplementowałem w przeciągu ostatniego miesiąca:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Niemal ukończone sekcje.&lt;/li&gt;
&lt;li&gt;Separatory.&lt;/li&gt;
&lt;li&gt;Pętle &quot;for&quot; i &quot;foreach&quot;.&lt;/li&gt;
&lt;li&gt;W większości ukończone dziedziczenie szablonów.&lt;/li&gt;
&lt;li&gt;Zarządzanie nagłówkami HTTP.&lt;/li&gt;
&lt;li&gt;Częściowo ukończone parsowanie prologu.&lt;/li&gt;
&lt;li&gt;Trochę poprawek w kompilatorze.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;W katalogu &quot;dev&quot; można znaleźć skrypty, za pomocą których testuję poprawność działania poszczególnych instrukcji. Są też unitTesty: gotowy zestaw do testów parsera wyrażeń oraz częściowo ukończony test API. Próbuję także opracować automatyczny tester poprawności działania samych instrukcji, żeby nie bawić się w ręczne wywoływanie. Problemy stwarzają nowe linie i białe znaki w kodzie wynikowym, które wprowadzają straszny zamęt w przypadku porównywania rezultatu z wzorcówką, przez co przygotowanie jednego głupiego testu zabiera dużo czasu. Jednak coś się wymyśli. Do działania wymagana jest instalacja pakietu phpUnit 3 z repozytorium PEAR.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Nowy-dev#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Nowy-dev#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/9</wfw:commentRss>
      </item>
    
  <item>
    <title>Licencjonowanie</title>
    <link>http://blog.invenzzia.org/pl/post/Licencjonowanie</link>
    <guid isPermaLink="false">urn:md5:0cfe4e92acf397cc05aa8ad990ae526e</guid>
    <pubDate>czw, 07 lut 2008 09:29:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Invenzzia</category>
        <category>licencjonowanie</category>    
    <description>&lt;p&gt;Co jakiś czas powraca jak bumerang sprawa licencji, na jakiej biblioteki są publikowane. Nie ulega wątpliwości, że jej dobór ma dość duże znaczenie dla popularyzacji projektu. Liberalne licencje są łatwe do interpretacji przez każdego oraz przez to bardzo łatwe w użyciu, lecz stwarzają prawo do pewnych nadużyć. Z drugiej strony mamy licencję GNU LGPL, na której dotąd był rozpowszechniany OPT. Zapewnia ona należytą ochronę kodowi, ale utrudnia łączenie z zamkniętym oprogramowaniem. A przecież biblioteka napisana w PHP dedykowana jest także twórcom stron WWW na zamówienie czy autorom kompletnych skryptów udostępnianych jako open-source bądź nie.&lt;/p&gt;    &lt;p&gt;Postanowiłem sprawdzić, ile zajęłoby przystępne wyjaśnienie warunków LGPL przeciętnemu użytkownikowi, szczególnie nastawionemu na działalność komercyjną. Dodałem do roboczej wersji dokumentacji odpowiedni dodatek i zacząłem pisanie. Wynikiem była rozciągająca się na dwa ekrany lista z objaśnieniami, dlaczego i jak twórcy serwisów WWW na zamówienie mogą z niej korzystać, kiedy trzeba udostępnić kod źródłowy i tak dalej. Oczywiście jest to nie do zaakceptowania - sam nie lubię zbytnio zbyt skomplikowanych ograniczeń i nie mam zamiaru zmuszać w ten sposób bez wyraźnego powodu innych.&lt;/p&gt;


&lt;p&gt;Powodem, dla którego wybrałem licencję GPL, była paradoksalnie chęć ochrony bibliotek przed zamianą w oprogramowanie własnościowe. Taki los spotkał kiedyś projekt Wine, rozpowszechniany początkowo na licencji MIT. Po pewnym czasie powstały zamknięte, komercyjne wersje dostępne bez kodu źródłowego. Co prawda jedna 150-kilobajtowa biblioteka specjalnej wartości handlowej nie ma, ale wolę spać spokojnie, tym bardziej, że mają pojawić się inne. Niestety nie ma żadnej licencji, która od razu pasowałaby do potrzeb:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;- Dawała pełne prawa do łączenia zarówno z kodem open-source, jak i własnościowym pod warunkiem zachowania informacji o autorach, a w przypadku kodu źródłowego zachowania w stosunku do niego warunków licencji.&lt;br /&gt;
- Nakazywałaby rozpowszechnianie samej biblioteki (przeznaczonej do łączenia z innymi programami) także w postaci kodu źródłowego, co automatycznie implikowałoby zachowanie licencji.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Myślę, że takie ujęcie oprogramowania open-source najlepiej chroni prawa końcowego użytkownika. Zabraniając samodzielnej redystrybucji jedynie w postaci binarnej i ze zmienioną licencją, ma on pewność, że jeśli znajdzie jakąś paczkę OPT, będzie mógł z niej skorzystać na takich samych warunkach, jak z oryginału. Jeśli zaś trafi na zamkniętą wersję, oznacza to, że może być ona przystosowana, a na pewno jest przeznaczona do pracy z jednym, konkretnym skryptem.&lt;/p&gt;


&lt;p&gt;Najpewniejszym kandydatem na licencję jest jakaś zmodyfikowana wersja licencji BSD bez klauzuli ogłoszeniowej. Niestety trzeba się pobawić w dodanie do niej rzeczonego warunku w języku angielskim. Dobór właściwego słownictwa trochę potrwa i zapewne nie obejdzie się bez jakiejś pomocy bądź porady kogoś z zachodu. Dlatego wersje rozwojowe w dalszym ciągu będą dostępne na GNU LGPLv3, natomiast wersję finalną przygotuję już na nowej, znacznie łatwiejszej w użyciu licencji.&lt;/p&gt;


&lt;p&gt;Oprócz tego, chciałbym udostępnić także wersje płatne bibliotek, niezależnie od tego, że sam kod rozpowszechniany będzie niezwykle liberalnie. Nie byłyby one drogie - myślę, że cena wahałaby się w granicach 20-40 złotych tak, żeby mógł sobie na nią pozwolić niemal każdy zainteresowany. Dochód byłby przeznaczony głównie na utrzymanie domen, serwerów i cele promocyjne, gdyż utrzymanie tego wszystkiego trochę pieniędzy kosztuje. O ile pod względem kodu wersja taka nie różniłaby się od darmowej, nabywca dostawałby kilka bonusów. Aktualnie mam pomysły na następujące:&lt;/p&gt;


&lt;blockquote&gt;&lt;p&gt;- Dodatkowe materiały informacyjne.&lt;br /&gt;
- Prawo do włączenia materiałów informacyjnych do dokumentacji końcowej użytkownika.&lt;br /&gt;
- Przykładowe projekty wraz z kodem źródłowym i szeregiem komentarzy.&lt;br /&gt;
- Wcześniejszy dostęp do nowych wersji (np. tydzień)&lt;br /&gt;
- Dodatkowe wydania pojawiające się np. w przypadku znalezienia jakiegoś nie-krytycznego błędu, zawierające stosowną poprawkę.&lt;br /&gt;
- Możliwość umieszczenia szerszych informacji o projekcie wykorzystującym biblioteki na stronie grupy.&lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Co o czymś takim sądzicie? Myślę, że na czymś takim zyskają wszyscy: my, bo nie będziemy musieli opłacać serwerów z własnej kieszeni; nabywcy, bo dostaną dodatkowe materiały i bonusy, a w dalszej konsekwencji wszyscy użytkownicy, jako że w celu ich przyciągnięcia powstawać będzie więcej tutoriali, artykułów itd.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Licencjonowanie#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Licencjonowanie#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/8</wfw:commentRss>
      </item>
    
  <item>
    <title>Dziedziczenie szablonów</title>
    <link>http://blog.invenzzia.org/pl/post/Dziedziczenie-szablonow</link>
    <guid isPermaLink="false">urn:md5:11eedc715a12fa05aa1c92aaf21f291d</guid>
    <pubDate>sob, 02 lut 2008 12:14:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>OPT2</category>    
    <description>&lt;p&gt;Przeważnie kod wynikowy strony komponuje się z kilku mniejszych szablonów zawierających fragmenty kodu. Istnieje wiele technik ich łączenia. W parserach dla PHP królują jak dotąd dwa rodzaje: ręczne uruchamianie szablonów we właściwej kolejności z poziomu kodu PHP oraz dyrektywa &lt;em&gt;include&lt;/em&gt;. Podobnie było także w poprzedniej wersji OPT, jednak w nowym wydaniu pierwszy ze sposób właściwie idzie do kasacji - o ile nie korzystamy z quirks mode, parser nie dopuści do tego, by wywołać metodę &lt;em&gt;parse()&lt;/em&gt; dwukrotnie. Początkowo miałem zamiar zrekompensować to, rozbudowując &lt;em&gt;include&lt;/em&gt; o tzw. sekwencje, lecz dnia pewnego na moim blogu Coldpeer zapytał się mnie, czy będzie dziedziczenie szablonów. Poszukałem, popatrzyłem i stwierdziłem, że to może być niezłe. Tak zaczęły się eksperymenty z implementacją.&lt;/p&gt;    &lt;p&gt;Dziedziczenie szablonów pojawiło się, z tego co wiem, w systemie szablonów pythonowego frameworka Django. Idea jest wzięta z programowania obiektowego, gdzie można dziedziczyć klasy, dodając do nich nowe metody, pola oraz nadpisując istniejące. Tutaj jest podobnie. Mamy szablon główny, w którym zaznaczamy pewne charakterystyczne miejsca i wypełniamy je standardową zawartością. Drugi szablon dziedziczy po głównym i może nadpisać wybrane miejsca własną treścią. Po nim może iść kolejny szablon i tak dalej.&lt;/p&gt;


&lt;p&gt;Okazało się, że spora część niezbędnej funkcjonalności była już w OPT 1.x - instrukcje &lt;em&gt;bind&lt;/em&gt; oraz &lt;em&gt;insert&lt;/em&gt; pozwalały przenosić całe fragmenty kodu w inne miejsce, także pomiędzy szablonami. Niestety, nie było tam odpowiedniego mechanizmu detekcji, czy zaszły jakieś modyfikacje w plikach i to trochę psuło całą koncepcję. Tak samo jego opracowanie dla nowej wersji było najtrudniejszym zadaniem, ponieważ nie wystarczy teraz jedynie sprawdzić, czy zaszły zmiany w szablonie, który wywołujemy, ale także czy coś nowego nie pojawiło się w szablonach bazowych! Z zamiarem definitywnego rozwiązania tego problemu siadłem do kodu wczoraj i parę godzin temu wszystko zadziałało tak, jak powinno:&lt;/p&gt;


&lt;p&gt;Szablon bazowy (&lt;em&gt;test_inherited_a.tpl&lt;/em&gt;):&lt;/p&gt;
&lt;pre name=&quot;code&quot; class=&quot;html&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;
	   &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&amp;gt;

&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;en_US&amp;quot; xml:lang=&amp;quot;en_US&amp;quot;&amp;gt;
 &amp;lt;head&amp;gt;
  &amp;lt;title&amp;gt;Instruction test: snippet and insert&amp;lt;/title&amp;gt;
 &amp;lt;/head&amp;gt;
 &amp;lt;body&amp;gt;
  &amp;lt;opt:insert snippet=&amp;quot;header&amp;quot;&amp;gt;
   &amp;lt;h1&amp;gt;I'm a standard header&amp;lt;/h1&amp;gt;
   &amp;lt;p&amp;gt;Foo bar joe&amp;lt;/p&amp;gt;  
  &amp;lt;/opt:insert&amp;gt;
  
  &amp;lt;hr/&amp;gt;
  
  &amp;lt;opt:insert snippet=&amp;quot;content&amp;quot;&amp;gt;
  	&amp;lt;p&amp;gt;Well, i'm also a standard content.&amp;lt;/p&amp;gt;
  
  &amp;lt;/opt:insert&amp;gt;
  
  &amp;lt;hr/&amp;gt;
  
  &amp;lt;opt:insert snippet=&amp;quot;footer&amp;quot;&amp;gt;
  	&amp;lt;p&amp;gt;And I'm a footer.&amp;lt;/p&amp;gt;  
  &amp;lt;/opt:insert&amp;gt;
  
  &amp;lt;p&amp;gt;&amp;amp;copy; Pasteright 2008 by LMAO, It seems to work!&amp;lt;/p&amp;gt;
 &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Szablon dziedziczący po nim (&lt;em&gt;test_inherit_1.tpl&lt;/em&gt;):&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;xml&quot;&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; standalone=&amp;quot;yes&amp;quot; ?&amp;gt;
&amp;lt;opt:extend file=&amp;quot;test_inherited_a.tpl&amp;quot;&amp;gt;
	&amp;lt;opt:snippet name=&amp;quot;header&amp;quot;&amp;gt;
		&amp;lt;h1&amp;gt;Webmaster Of Puppets&amp;lt;/h1&amp;gt;
	&amp;lt;/opt:snippet&amp;gt;

	&amp;lt;opt:snippet name=&amp;quot;content&amp;quot;&amp;gt;
		&amp;lt;p&amp;gt;Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Phasellus ut tellus id nulla adipiscing eleifend. Sed dictum accumsan ante. Nullam at nisl vitae elit aliquet fringilla. Praesent egestas eros eget tellus. Praesent id odio a sapien rhoncus vehicula. Nunc fringilla, diam eget euismod tempor, tortor metus tincidunt sapien, eu cursus magna tellus at risus. Praesent non tellus eget magna facilisis pulvinar. Praesent libero mi, adipiscing a, pharetra eget, condimentum sodales, mi. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Donec ac elit. Duis iaculis tortor a metus. Aliquam id purus et eros faucibus fringilla. Praesent quis quam. In lectus urna, fringilla sit amet, iaculis eget, aliquet ac, quam. Donec vulputate dui sit amet lectus. Aenean tempor, orci at pretium ornare, tortor tortor venenatis ligula, eget blandit nisi risus eget dolor. Duis nunc neque, sodales porta, viverra non, tristique eu, sem. Curabitur magna neque, blandit ullamcorper, congue quis, tristique ut, felis.&amp;lt;/p&amp;gt;
	&amp;lt;/opt:snippet&amp;gt;

	&amp;lt;opt:snippet name=&amp;quot;footer&amp;quot;&amp;gt;
		&amp;lt;p&amp;gt;Bye!!!&amp;lt;/p&amp;gt;
	&amp;lt;/opt:snippet&amp;gt;
&amp;lt;/opt:extend&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Do tego kod PHP:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;&amp;lt;?php

	define('OPT_DIR', '../lib/');
	require(OPT_DIR.'opt.class.php');

	try
	{
		$tpl = new optClass;
		$tpl -&amp;gt; sourceDir = './templates/';
		$tpl -&amp;gt; compileDir = './templates_c/';
		$tpl -&amp;gt; stripWhitespaces = false;
		$tpl -&amp;gt; printComments = false;
		$tpl -&amp;gt; setup();
		
		$tpl -&amp;gt; parse('test_inherit_1.tpl');
	}
	catch(optException $e)
	{
		optErrorHandler($e);
	}
?&amp;gt;
&lt;/pre&gt;


&lt;p&gt;A rezultat widać poniżej:&lt;/p&gt;


&lt;p&gt;&lt;a href=&quot;http://blog.invenzzia.org/public/images/template_inheritance.png&quot;&gt;&lt;img src=&quot;http://blog.invenzzia.org/public/images/.template_inheritance_m.jpg&quot; alt=&quot;Template inheritance&quot; style=&quot;display:block; margin:0 auto;&quot; /&gt;&lt;/a&gt;&lt;/p&gt;


&lt;p&gt;Parę faktów:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Jeżeli zmodyfikujemy dowolny z szablonów, po którym nasz szablon dziedziczy, OPT wykona rekompilację i zmiana zostanie natychmiast uwzględniona.&lt;/li&gt;
&lt;li&gt;Jeżeli usuniemy dowolną z instrukcji &quot;opt:snippet&quot;, wyświetli nam się domyślna zawartość zdefiniowana wewnątrz &quot;opt:insert&quot;.&lt;/li&gt;
&lt;li&gt;Istnieje możliwość nadpisania już zdefiniowanego snippeta przez leżący wyżej w hierarchii szablon. Będę implementował mechanizm odwołania się do zawartości rodzica (jakaś instrukcja &quot;opt:parent&quot;).&lt;/li&gt;
&lt;li&gt;Można to mieszać z &quot;opt:include&quot; oraz &quot;opt:sequence&quot; (mechanizm sekwencji).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ponadto bardzo możliwe, że dziedziczenie szablonów w ostatecznym rozrachunku może działać szybciej, niż tradycyjna metoda, aczkolwiek kosztem miejsca na dysku. Po prostu jak mamy dziedziczenie &quot;A po  B po C&quot;, wywołując szablon A, caluteńki kod wynikowy ze wszystkich szablonów jest zrzucany właśnie do A. Zmniejsza to ilość odwołań do dysku, gdyż uruchomienie jednego wielkiego szablonu jest mniej kosztowne, niż tej samej treści rozbitej na 3 mniejsze pliki. Z drugiej strony, w podstawowym trybie OPT wciąż sprawdza czasy modyfikacji (tyle że robi mniej testów). Póki co są to jedynie przypuszczenia. Dopiero po skończeniu i zrobieniu porządnego benchmarku będę w stanie podać konkretne liczby. Chociaż dodam, że z ciekawości puściłem sobie prosty test (lista 15 elementów):&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;OPT 1.x: 1850 req/s&lt;/li&gt;
&lt;li&gt;OPT 2.0: 2100 req/s&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Nie są to wyniki ostateczne - trzeba wziąć pod uwagę, że nowy plik &lt;em&gt;opt.class.php&lt;/em&gt; wciąż nie ma sporej części opcji, które trochę zwiększą jego objętość, a ponadto nie zaimplementowałem jeszcze niektórych optymalizacji. Tak więc można się spodziewać, że nowe możliwości nie odbiją się niekorzystnie na wydajności, a nawet jest szansa na coś odwrotnego - nowa wersja będzie szybsza.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Dziedziczenie-szablonow#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Dziedziczenie-szablonow#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/5</wfw:commentRss>
      </item>
    
  <item>
    <title>Głębsze przetwarzanie</title>
    <link>http://blog.invenzzia.org/pl/post/Glebsze-przetwarzanie</link>
    <guid isPermaLink="false">urn:md5:816c5be6adacf6b106cabd838e3353cd</guid>
    <pubDate>czw, 31 sty 2008 13:08:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Open Power Template</category>
        <category>Open Power Forms</category>    
    <description>&lt;p&gt;Ostatni projekt, jaki realizowałem z użyciem Open Power Forms, ukazał kilka słabych punktów aktualnej implementacji. Było tam kilka formularzy umożliwiających masowe dodawanie rekordów jednego typu, tj. była sobie tabelka, w kolumnach pola: Imię, Nazwisko, PESEL, coś tam innego i było tak 30 wierszy. Razem można było za jednym zamachem dodać do 30 rekordów. O ile metodę &lt;em&gt;map()&lt;/em&gt; dało się jeszcze dość łatwo zmusić do przetworzenia czegoś takiego bez rozpisywania się, o tyle połączenie z szablonem zaczęło już wtedy szwankować.&lt;/p&gt;    &lt;p&gt;Kod prezentował się następująco:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;php&quot;&gt;$this -&amp;gt; map('names', new opfArrayContainer(
	new opfConstraint(MAP_TYPE, TYPE_STRING),
	new opfConstraint(MAP_LEN_GT, 2)
), OPF_OPTIONAL);
$this -&amp;gt; map('surnames', new opfArrayContainer(
	new opfConstraint(MAP_TYPE, TYPE_STRING),
	new opfConstraint(MAP_LEN_GT, 2)
), OPF_OPTIONAL);
$this -&amp;gt; map('pesels', new opfArrayContainer(
	new sConstraint(MAP_PESEL)
), OPF_OPTIONAL);
&lt;/pre&gt;


&lt;p&gt;Innymi słowy, do skryptu musiało przyjść np. pole &quot;names&quot; będące tablicą z 30-ma komórkami, w których były poszczególne imiona. Okazało się, że gdy w takiej strukturze zrobiło się gdzieś błąd powodujący, że nie chciało to przejść przez kontrolę poprawności, renderer formularzy wariował i w ogóle nie wiedział, który komponent ma oznaczyć jako błędny. Ostatecznie dodałem do kodu biblioteki na sztywno obsługę stałej &lt;em&gt;IGNORE_OPF_ERRORS&lt;/em&gt;, tak aby po prostu siedział wtedy cicho i wyświetlał formularz bez żadnego oznaczania na czerwono itd.&lt;/p&gt;


&lt;p&gt;Oczywiście takie rozwiązanie na dłuższą metę nie przejdzie i trzeba wymyślić jakieś usprawnienie. W dodatku dobrze, aby to usprawnienie elegancko komponowało się z resztą kodu i faktycznie było intuicyjne do pojęcia, bo nie sztuka dodać coś w 20 minut, a miesiąc później klnąć, że się nie chciało dokładniej pomyśleć. Najlepsze są rozwiązania proste i skuteczne, dlatego zacząłem się zastanawiać, czy można opisać formularz kilkoma definicjami i przekształceniami tak, aby na ich podstawie można było uzyskać dowolną konfigurację z gwarancją, że OPF ją obsłuży. Mój pomysł opiera się na tym, aby zejść nieco głębiej i zrównać w definicji formularz oraz pole formularza. Powodem jest kilka podobieństw:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Oba mogą mieć pewną wartość (przy czym dla formularza definiujemy ją jako zbiór wartości wszystkich pod-elementów)&lt;/li&gt;
&lt;li&gt;Oba mają pewien stan oraz mogą go zmieniać w trakcie przetwarzania.&lt;/li&gt;
&lt;li&gt;Oba są przetwarzane.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Teraz wystarczy, że potraktujemy formularz jako kontrolkę, która może przechowywać inne pola. Jeżeli spróbujemy teraz wymodelować powyższy przykład, wyglądałoby to mniej więcej tak: tworzymy sobie formularz dla pojedynczej osoby: Imię, Nazwisko, PESEL i coś tam jeszcze. Następnie osadzamy go w większym formularzu i zapętlamy tak, aby mógł pojawić się do 30-tu razy. Możemy także łatwo uzyskać efekt umieszczenia w &lt;em&gt;opfArrayContainer()&lt;/em&gt; pojedynczego pola tak, jak to było dotychczas - po prostu umieszczamy w takiej pętli nie cały formularz, ale pojedynczą kontrolkę.&lt;/p&gt;


&lt;p&gt;Pozostaje jeszcze kwestia nauczenia komponentów korzystania z takiej struktury, ale nie sądzę, aby było przesadnie skomplikowane, zwłaszcza w świetle tego, co szykuje nowy Open Power Template.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Glebsze-przetwarzanie#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Glebsze-przetwarzanie#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/4</wfw:commentRss>
      </item>
    
  <item>
    <title>Zaczynamy</title>
    <link>http://blog.invenzzia.org/pl/post/Zaczynamy</link>
    <guid isPermaLink="false">urn:md5:eee1b47b91b237e2993081c7e3fabb86</guid>
    <pubDate>śro, 30 sty 2008 12:29:00 +0100</pubDate>
    <dc:creator>Zyx</dc:creator>
        <category>Invenzzia</category>
        <category>invenzzia</category><category>website</category>    
    <description>&lt;p&gt;Witam na devblogu nowej grupy programistycznej Invenzzia. Jest kilka powodów, dla których ją powołałem. Pierwszy i najważniejszy to chęć zapewnienia porządnej organizacji i infrastruktury projektom open-source, które już tworzę i które dopiero powstaną. Na początek przetransferowałem na jej poczet istniejący już od trzech lat system szablonów Open Power Template, który tutaj stanie się zalążkiem rodziny bibliotek Open Power Libraries. Aktualnie jesteśmy na początku etapu samoorganizowania się i nasza witryna internetowa będzie uruchamiana po kawałku w miarę jak powstaną kolejne jej elementy. Postaram się, aby nie potrwało to długo.&lt;/p&gt;    &lt;p&gt;Invenzzia ma zupełnie odmienny charakter, niż to, co miało miejsce przy Open Power Board. Niemal wszystkich znam osobiście, zaś ze wszystkimi utrzymuję stały kontakt, co oczywiście pozwala na aktywniejsze angażowanie się w prace. Poza nazwą jednego projektu i jego kodem nie odziedziczyliśmy po wcześniejszych reinkarnacjach absolutnie nic, tak więc sprawa własności poszczególnych elementów oraz odpowiedzialności za ich utrzymanie jest zupełnie jasna. Własny serwer pozwala też na uruchomienie paru usług, o których wcześniej mogliśmy tylko pomarzyć.&lt;/p&gt;


&lt;p&gt;Pora przedstawić członków grupy:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;eXtreme - programista PHP/JavaScript, a także spec od XHTML/CSS. Prywatnie mój brat.&lt;/li&gt;
&lt;li&gt;Radzio - programista PHP/JavaScript. Prywatnie kumpel z roku.&lt;/li&gt;
&lt;li&gt;Slump - konsultant-menedżer-PR. Prywatnie jedyna osoba, która w OpenPB oprócz mnie faktycznie robiła coś pożytecznego.&lt;/li&gt;
&lt;li&gt;Zyx - czyli ja, odpowiedzialny za projekty bibliotek, silników itd.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Naszymi pierwszymi zadaniami będzie ukończenie Open Power Template 2 oraz Open Power Forms. Mamy też kilka dalszych pomysłów, których realizacja rozpocznie się nieco później. W każdym razie postaramy się dostarczyć świetny zestaw wysokiej jakości narzędzi open-source dla PHP prezentujący zupełnie nowe podejście do wielu zdawałoby się, oczywistych spraw.&lt;/p&gt;</description>
    
    
    
          <comments>http://blog.invenzzia.org/pl/post/Zaczynamy#comment-form</comments>
      <wfw:comment>http://blog.invenzzia.org/pl/post/Zaczynamy#comment-form</wfw:comment>
      <wfw:commentRss>http://blog.invenzzia.org/pl/feed/rss2/comments/1</wfw:commentRss>
      </item>
    
</channel>
</rss>