<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Athlan • Piotr Pelczar • blog programisty &#187; Framework</title>
	<atom:link href="http://athlan.pl/kategoria/framework/feed/" rel="self" type="application/rss+xml" />
	<link>http://athlan.pl</link>
	<description>Napisać kod zrozumiały dla komputera potrafi byle głupek. Dobrzy programiści tworzą kod zrozumiały dla człowieka...</description>
	<lastBuildDate>Sat, 17 Jul 2010 18:54:07 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Weryfikacja właściciela strony</title>
		<link>http://athlan.pl/weryfikacja-wlasciciela-strony/</link>
		<comments>http://athlan.pl/weryfikacja-wlasciciela-strony/#comments</comments>
		<pubDate>Sun, 17 Aug 2008 09:48:58 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Publikacje]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=133</guid>
		<description><![CDATA[Niedługo być może zaimplementuje w jeden z moich nowych projektów weryfikację właściciela strony. Pomysł pozwoliłem zrobię zaczerpnąć z Google Webmaster Tool. Natomiast troszeczkę zmieniłem jeden ze sposobów, aby mniej się napracować. Zweryfikowanie właściciela witryny odbywa się po wywołaniu jednej z poniższych metod. Oto one: Weryfikacja poprzez upload pliku na serwer. Chwilowe dodanie meta-tagu do sekcji [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" style="margin-left: 10px; margin-right: 10px; float: right;" src="http://img232.imageshack.us/img232/194/bannerwebsitedesignbx2.jpg" alt="" width="352" height="352" />Niedługo być może zaimplementuje w jeden z moich nowych projektów weryfikację właściciela strony. Pomysł pozwoliłem zrobię zaczerpnąć z Google Webmaster Tool. Natomiast troszeczkę zmieniłem jeden ze sposobów, aby mniej się napracować. Zweryfikowanie właściciela witryny odbywa się po wywołaniu jednej z poniższych metod. Oto one:</p>
<ul>
<li>Weryfikacja poprzez upload pliku na serwer.</li>
<li>Chwilowe dodanie meta-tagu do sekcji HEAD.</li>
</ul>
<p>W stosunku do google, zmianie uległa u mnie weryfikacja pierwsza.</p>
<p>Sposób Google: Upload pliku bez zawartości (lub z dowolną) o nazwie jako hash aktywacyjny, np: <code>&lt;?php md5( secret-salt ) . '.html'; ?&gt;</code></p>
<p>Mój sposób: Upload pliku ze stałą lub hashowaną nazwą o zawartości 32 znakowego hashu md5.</p>
<p>Zmienia się tylko zawartość pliku. Dlaczego? Niektóre strony zamiast zwracać kod 404 dla nieistniejących plików/podstron zwracają kod 200 (sukces). Wówczas trudno stwierdzić, czy jest to oczekiwany plik. Google dodatkowo sprawdza, czy strona zawsze zwraca kod 200, ale po co się babrać i wykonywać więcej requestów, jak można zrobić to trochę prościej. Jeżeli plik nie będzie fizycznie istniał na serwerze, a strona zwróci kod 200, skrypt musi oczekiwać w odpowiedzi tylko i wyłącznie hashu strony. Nazwa pliku na serwerze może być stała, ale niekoniecznie (dla większego bezpieczeństwa zalecane jest logiczne hashowanie nazwy pliku).</p>
<p>Przygotujmy zatem zarys klasy (od tego zawsze zaczynam):</p>
<ul>
<li><code>public function CheckFile($sUrl, $sFilename)</code> funkcja sprawdzająca hash w pliku na serwerze.</li>
<li><code>public function CheckMetatag($sUrl, $sTagName)</code> funkcja sprawdzająca hash w metatagu.</li>
<li><code>public static function Hash($sUrl)</code> funkcja budująca hash na postawie adresu URL (jako że podajemy go jako parametr obu metod sprawdzających, zmienna jest łatwo dostępna dla systemu).</li>
<li><code>public static function Metatag($sHash, $sTagName)</code> generowanie kodu XHTML dla metatagu &#8211; metoda potrzebna nam przy podaniu użytkownikowi meta tagu oraz do prega w metodzie CheckMetatag();</li>
<li><code>protected static function _Request($sUrl)</code> tworzenie requestu za pomocą HttpRequest i zwracanie treści metodą getResponseBody() wspomnianej klasy.</li>
</ul>
<p>Jako że komponent jest niejako zewnętrzną biblioteką, nie mogłem go wcisnąć w komponentu frameworka. Otrzymał status biblioteki: VframeLib_WebVeryfication.</p>
<p>Oczekiwane API:</p>
<p><code>var_dump(VframeLib_WebVeryfication::CheckFile('http://example.com/', 'Veryfication.txt')); // bool result<br />
var_dump(VframeLib_WebVeryfication::CheckMetatag('http://example.com/', 'Veryfication'));</code><code> // bool result</code></p>
<p>Gotowy kod:</p>
<p><a href="http://athlan.pl/code/VframeLib_WebVeryfication">http://athlan.pl/code/VframeLib_WebVeryfication</a></p>
<p><em style="color: red">Uwaga. Kod jest w fazie testowej. Wszelkie Wasze komentarze będą uwzględniane przy poprawkach.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/weryfikacja-wlasciciela-strony/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Vframe 2.3.1 relased</title>
		<link>http://athlan.pl/vframe-231-relased/</link>
		<comments>http://athlan.pl/vframe-231-relased/#comments</comments>
		<pubDate>Fri, 13 Jun 2008 22:50:19 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Vframe 2.x]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=116</guid>
		<description><![CDATA[Dziś wydana została nowa wersja Vframe oznaczona numerkiem 2.3.1. Większe zmiany: Możliwość tworzenia grup routingów za pomocą wyrażeń regularnych (grupowanie regułek, aby przyspieszyć działanie). Automatyczne wczytywanie konfiguracji Vframe_Router_Advenced::PatternsBuild(). Wydzielenie głębi konfiguracyjnej dla kontrolerów (kontroler News_Admin_Vcontroller ma plik: /Configuration/Controllers/Admin/News.php). Zaimplementowanie Cache_Engine (wzorzec fabryki) oraz silników: File, Memcache, APC. Zaimplementowanie Image_Engine (wzorzec fabryki), silnik GD. Zaimplementowanie Db_Layer [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="border: 1px solid black; margin: 10px; float: right;" src="http://img61.imageshack.us/img61/380/cubebysteveyhp4.jpg" alt="" width="300" height="300" />Dziś wydana została nowa wersja <a href="http://framework.vgroup.pl">Vframe</a> oznaczona numerkiem <strong>2.3.1</strong>. Większe zmiany:</p>
<ul>
<li>Możliwość tworzenia grup routingów za pomocą wyrażeń regularnych (grupowanie regułek, aby przyspieszyć działanie).</li>
<li>Automatyczne wczytywanie konfiguracji Vframe_Router_Advenced::PatternsBuild().</li>
<li>Wydzielenie głębi konfiguracyjnej dla kontrolerów (kontroler <strong>News_Admin</strong>_Vcontroller ma plik: /Configuration/Controllers/<strong>Admin/</strong>News.php).</li>
<li>Zaimplementowanie Cache_Engine (wzorzec fabryki) oraz silników: File, <a href="http://php.net/mecache">Memcache</a>, <a href="http://php.net/apc">APC</a>.</li>
<li>Zaimplementowanie Image_Engine (wzorzec fabryki), silnik <a href="http://php.net/gd">GD</a>.</li>
<li>Zaimplementowanie Db_Layer (wzorzec fabryki), silniki MySQL, SQLite.</li>
<li>Zniesiona została stała V_APP oraz V_APP_REAL.</li>
<li><strong>Dodanie nowego komponentu <a href="http://framework.vgroup.pl/Mail_Inbox.html">Vframe_Mail_Inbox</a></strong> (pobieranie poczty) oraz silnika Vframe_Mail_Inbox_Engine_Imap.</li>
<li>Zabezpieczenie unikalnego klucza sesji frameworka, dodanie V_APP_SESSION_HASH.</li>
<li>Zmiana struktury Exceptions oraz Interfaces &#8211; teraz klasy znajdują się w głównym pliku komponentu, nie posiadają wydzielonych plików.</li>
<li><strong>Dodanie pluginu Vframe_Controller_Front_Plugin_Gzip</strong>.</li>
</ul>
<p>Konieczne zmiany w aplikacji:</p>
<ul>
<li>Pliki konfiguracyjne modelu Db_MySQL na Db_Layer_MySQL, analogicznie dla innych baz.</li>
</ul>
<p>Zalecane zmiany:</p>
<ul>
<li>Wszelkie define() zamienić na Vframe::_() (argumenty analogiczne) oraz załadować główny plik konfiguracyjny po frameworku (aby uzyskać funkcję statyczną <em>_()</em> ).</li>
<li>Usunąć V_APP_REAL.</li>
<li>Aby użyć pluginu Gzip: <code>$oFrontController-&gt;Plugin(new Vframe_Controller_Front_Plugin_Gzip(6));</code> gdzie 6 to stopień kompresji, jeżeli null, wówczas domyślnie 6.</li>
</ul>
<p>Linki:</p>
<ul>
<li><a href="http://framework.vgroup.pl/repository/entry-b28c2e24c7bf57f559ed9a8871f1adea.htm">Pobierz Vframe 2.3.1</a>. (<a href="http://framework.vgroup.pl/repository/entry-db6e51c1dbc46b87d66d6ac2510d080d.htm">wszystkie wersje</a>).</li>
<li><a href="http://framework.vgroup.pl/repository/entry-4d02afbf615b195ca76115eb1b9d7360.htm">Źródła online</a>.</li>
<li><a href="http://framework.vgroup.pl/">Dokumentacja</a>.</li>
<li><a href="http://framework.vgroup.pl/repository/">Pełne repozytorium</a>.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/vframe-231-relased/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Style życia na life-styles.pl</title>
		<link>http://athlan.pl/life-stylespl/</link>
		<comments>http://athlan.pl/life-stylespl/#comments</comments>
		<pubDate>Tue, 20 May 2008 06:00:58 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[Private]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Real live]]></category>
		<category><![CDATA[Vframe 2.x]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=113</guid>
		<description><![CDATA[Od niedawna w sieci istnieje nasza strona na konkurs Diversity organizowany przez Motorolę o którym pisałem. Witryna w dostępna pod adresem life-styles.pl prezentuje style życia z podziałem na kategorie: muzyka, sport, religie, moda, jedzenie. Wykorzystuje komponent Vframe_Language i nie wymaga bazy danych. Jest to pierwsza (prosta) aplikacja oparta na Vframe 2.x z otwartym kodem źródłowym.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><img style="border: 1px solid black; margin: 5px;" src="http://img80.imageshack.us/img80/2415/lsym3.jpg" alt="" width="441" height="196" /></p>
<p>Od niedawna w sieci istnieje nasza strona na konkurs <a href="http://diversity.pl">Diversity</a> organizowany przez <a href="http://www.motorola.com/pl/">Motorolę</a> o którym <a href="http://athlan.pl/diversity-2008/">pisałem</a>.</p>
<p>Witryna w dostępna pod adresem <a href="http://www.life-styles.pl">life-styles.pl</a> prezentuje <a href="http://www.life-styles.pl">style życia</a> z podziałem na kategorie:</p>
<ul>
<li>muzyka,</li>
<li>sport,</li>
<li>religie,</li>
<li>moda,</li>
<li>jedzenie.</li>
</ul>
<p>Wykorzystuje komponent Vframe_Language i nie wymaga bazy danych. Jest to pierwsza (prosta) aplikacja oparta na <a href="http://framework.vgroup.pl">Vframe</a> 2.x z <a href="http://www.life-styles.pl/sources/">otwartym kodem źródłowym</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/life-stylespl/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Vframe 2.2</title>
		<link>http://athlan.pl/vframe-22/</link>
		<comments>http://athlan.pl/vframe-22/#comments</comments>
		<pubDate>Sun, 11 May 2008 15:56:13 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Vframe 2.x]]></category>

		<guid isPermaLink="false">http://athlan.pl/?p=111</guid>
		<description><![CDATA[Dziś zakończyłem prace nad Vframe 2.2.0. Aktualna wersja nie jest kompatybilna wstecz do wersji 2.1.1. Przebudowana została struktura stałych frameworka. Dotychczas używał on zwykłych, wbudowanych stałych PHP w celu ustalania kluczowych zmiennych konfiguracyjnych (np. ścieżka kontrolerów). Pojawił sie problem przy tworzeniu aplikacji, gdy ta musiała pobrać pliki konfiguracyjne oraz użyć modeli z kilku innych. Framework [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" style="border: 1px solid black; margin: 10px; float: left;" src="http://images28.fotosik.pl/211/d88f8b7c36107002.jpg" alt="" width="350" height="263" />Dziś zakończyłem prace nad <a href="http://framework.vgroup.pl">Vframe</a> 2.2.0. Aktualna wersja nie jest kompatybilna wstecz do wersji 2.1.1.</p>
<p>Przebudowana została struktura stałych frameworka. Dotychczas używał on zwykłych, wbudowanych stałych PHP w celu ustalania kluczowych zmiennych konfiguracyjnych (np. ścieżka kontrolerów). Pojawił sie problem przy tworzeniu aplikacji, gdy ta musiała pobrać pliki konfiguracyjne oraz użyć modeli z kilku innych. Framework powinien działać płynnie, używając wbudowanych rozwiązań, nie martwiąc się o ścieżki. Jak wiemy, nie można nadpisać stałej przypisując jej inną wartość. Taki przypadek został uznany jako jeden z <a href="http://wortal.php.pl/wortal/artykuly/php/podstawy/7_grzechow_glownych_programisty_php">7 grzechów głównych</a> programisty PHP.</p>
<p>Możliwie były 2 rozwiązania:</p>
<ul>
<li>Implementacja definicji &#8220;stałych&#8221; używając wbudowanego od wersji 2.0 wzorca Registry.</li>
<li>Wdrożenie nowego rozwiązania, poprzez odwołanie się do <code>Vframe::_()</code>; ( <code>public static function _( string $sParam, mixed $mValue )</code> )</li>
</ul>
<p>Wybrałem drugie, ze względu na to, że nazwy Registry oraz stałych mogą się przez przypadek pokryć.</p>
<p>Vframe 2.2.0 jeszcze nie jest dostępny do pobrania w repozytorium.</p>
<p><strong>Co w wersji 2.3?</strong></p>
<p>PHP w wersji 5.3 idzie w bardzo dobrym kierunku. Zapowiada się implementacja magicznej metody <a href="http://blog.felho.hu/what-is-new-in-php-53-part-4-__callstatic-openid-support-userini-xslt-profiling-and-more.html">__callStatic()</a> analogicznej do __call(). Problem będzie w instalacji najnowszej wersji na polskich serwerach. W wersji 5.3 odkryto błąd, który tracił na wydajności (łączenie stringów poprzez znak kropki zużywał dużo więcej pamięci niż poprzez użycie .=). Może to przekona polskie firmy hostingowe do update&#8217;u paczki PHP. Póki co, __callStatic() można sobie zadeklarować ręcznie, a do działania wykorzystać <a href="http://php.net/eval">eval()</a>.</p>
<p>Co za tym idzie klasa Vframe_Loader zostanie przebudowana używając __callStatic();</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/vframe-22/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vframe_Form obsługa formularzy</title>
		<link>http://athlan.pl/vframe_form-obsluga-formularzy/</link>
		<comments>http://athlan.pl/vframe_form-obsluga-formularzy/#comments</comments>
		<pubDate>Tue, 19 Feb 2008 20:04:27 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Przemyślenia]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/vframe_form-obsluga-formularzy/</guid>
		<description><![CDATA[Ostatnio zdenerwowałem się pisząc walidację formularza i nakładanie filtrów na pola formularzy w jednym z panelu administracyjnych. Co chwilę coś nie działało. Framework jest po to, aby unikać takich sytuacji. Aby uniknąć takich sytuacji w przyszłości postanowiłem napisać dość przydatną klasę Vframe_Form integrując ją z Vframe_Validator i Vframe_Input (pluginem POST). Zanim się napisze klasę, wypadałoby [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://img220.imageshack.us/img220/7402/inputbydeirust5bc5.jpg" align="left" border="1" height="200" width="150" />Ostatnio zdenerwowałem się pisząc walidację formularza i nakładanie filtrów na pola formularzy w jednym z panelu administracyjnych. Co chwilę coś nie działało. Framework jest po to, aby unikać takich sytuacji. Aby uniknąć takich sytuacji w przyszłości postanowiłem napisać dość przydatną klasę <em>Vframe_Form</em> integrując ją z <em>Vframe_Validator</em> i <em>Vframe_Input</em> (pluginem POST). Zanim się napisze klasę, <a href="http://athlan.vgroup.pl/code/vframe_form_prototype">wypadałoby napisać mały prototyp</a>.</p>
<p>Tak oto powstała <a href="http://athlan.vgroup.pl/code/vframe_form">klasa obsługi formularzy</a> oraz <a href="http://athlan.vgroup.pl/code/vframe_form_element">jego elementów</a>. Użycie jest bardzo wygodne, po zainicjowaniu <em>$oForm-&gt;init()</em> nasz komponent wykonuje filtracje, a następnie walidacje danych wejściowych. Ewentualne błędy można wychwycić poprzez wywołanie metody <em>$oForm-&gt;error(&#8216;nazwa_pola&#8217;);</em> &#8211; zwrócony zostanie string w przypadku wystąpienia błędu, null jeżeli go nie ma. Aby sprawdzić, czy wystąpiły jakieś błędy przy walidacji &#8211; nie podajemy parametry metody error: <em>$oForm-&gt;error();</em> Zostanie zwrócona liczba błędów (jeden dla każdego pola), jeżeli 0 &#8211; możemy wykonać akcję.</p>
<p><em><a href="http://deiru.deviantart.com/art/Input-27703439">Image</a> by <a href="http://deiru.deviantart.com/">Deiru</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/vframe_form-obsluga-formularzy/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Vframe 2.0 relased</title>
		<link>http://athlan.pl/vframe-20-relased/</link>
		<comments>http://athlan.pl/vframe-20-relased/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 21:05:38 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/vframe-20-relased/</guid>
		<description><![CDATA[Dziś światło dzienne ujrzał Vframe 2.0, poprzednia wersja nie jest już rozwijana. http://framework.vgroup.pl/repository/ Zobacz/Pobierz wydanie Vframe2 Narazie dostępny kod frameworka oraz prosta aplikacja (splash), niedługo pojawi się przykład CMS oparty na Vframe 2.0. W sferze planów przygotowywany jest VframeAdminGenerator tworzący panel administracyjny na podstawie plików konfiguracyjnych panel administracyjny.]]></description>
			<content:encoded><![CDATA[<p style="text-align: center"><img src="http://img228.imageshack.us/img228/3333/fw2wg9.jpg" border="1" height="196" width="450" /></p>
<p>Dziś światło dzienne ujrzał <a href="http://framework.vgroup.pl/">Vframe 2.0</a>, poprzednia wersja nie jest już rozwijana.</p>
<p><a href="http://framework.vgroup.pl/repository/">http://framework.vgroup.pl/repository/</a></p>
<p><a href="http://framework.vgroup.pl/repository/entry-db6e51c1dbc46b87d66d6ac2510d080d.htm">Zobacz/Pobierz</a> wydanie Vframe2</p>
<p>Narazie dostępny kod frameworka oraz prosta aplikacja (splash), niedługo pojawi się przykład CMS oparty na Vframe 2.0. W sferze planów przygotowywany jest VframeAdminGenerator tworzący panel administracyjny na podstawie plików konfiguracyjnych panel administracyjny.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/vframe-20-relased/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Vframe 2.0, Rewrited Strings</title>
		<link>http://athlan.pl/vframe-20-rewrited-strings/</link>
		<comments>http://athlan.pl/vframe-20-rewrited-strings/#comments</comments>
		<pubDate>Sun, 09 Dec 2007 21:57:38 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Internet]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projects]]></category>
		<category><![CDATA[Solutions]]></category>
		<category><![CDATA[Vframe 2.x]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/vframe-20-rewrited-strings/</guid>
		<description><![CDATA[Frameworki najlepiej buduje się podczas wykonywania projektów. W odróżnieniu od Vframe 1.x, druga wersja ma lepiej rozwiązaną kwestię przygotowania ciągu znaków pod adres url (mod_rewrite). Pierwszym zasadniczym irytującym błędem były podwójne myślniki wynikające z zamiany spacji na myślnik. A co jak będzie ciąg &#8221; &#8211; &#8220;. Trzy myślniki z rzędu? Nieładnie to wygląda. Do Vframe [...]]]></description>
			<content:encoded><![CDATA[<p>Frameworki najlepiej buduje się podczas wykonywania projektów. W odróżnieniu od Vframe 1.x, druga wersja ma lepiej rozwiązaną kwestię przygotowania ciągu znaków pod adres url (mod_rewrite).</p>
<p>Pierwszym zasadniczym irytującym błędem były podwójne myślniki wynikające z zamiany spacji na myślnik. A co jak będzie ciąg &#8221; &#8211; &#8220;. Trzy myślniki z rzędu? Nieładnie to wygląda. Do Vframe 2 został dodany util niwelujący ten błąd.</p>
<p>Drugim problemem pisania aplikacji w Vframe 1.x było powtarzanie się takich samych rewrite w bazie. Klasa Vframe_Util_Rewrite obsługuje analizę stringów oraz przygotowuje nowy w ten sposób, aby żaden się nie powtórzył. Z bazy danych należy tylko wyciągnąć stringi LIKE &#8216;naszstring%&#8217; i podać je klasie w formie tablicy asocjacyjnej. Do nowego stringu zostanie dodany numerek, bądź (uwaga) własny prefix.</p>
<p>Przykłady zastosowań:</p>
<p><a href="http://cpaste.com/4079">http://cpaste.com/4079</a></p>
<p>Klasa:</p>
<p><a href="http://cpaste.com/4078">http://cpaste.com/4078</a></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/vframe-20-rewrited-strings/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Klasa użytkownika oraz filtry Access</title>
		<link>http://athlan.pl/klasa-uzytkownika-oraz-filtry-access/</link>
		<comments>http://athlan.pl/klasa-uzytkownika-oraz-filtry-access/#comments</comments>
		<pubDate>Tue, 07 Aug 2007 19:49:51 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Przemyślenia]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/klasa-uzytkownika-oraz-filtry-access/</guid>
		<description><![CDATA[Publikacja Vframe 2.0 zbliża się wielkimi krokami, oczywiście jest wiele do zrobienia, ale główny core wydaje się być skończony w wersji pierwszej. W tym wpisie chciałbym przedstawić mniej więcej zasadę działania klasy użytkownika oraz możliwości dostępu ACL do akcji kontrolerów. Główną nowością w rebuildzie klasy użytkownika i ACL jest możliwość nadawania rang, co znacznie ułatwia [...]]]></description>
			<content:encoded><![CDATA[<p>Publikacja Vframe 2.0 zbliża się wielkimi krokami, oczywiście jest wiele do zrobienia, ale główny core wydaje się być skończony w wersji pierwszej. W tym wpisie chciałbym przedstawić mniej więcej zasadę działania klasy użytkownika oraz możliwości dostępu ACL do akcji kontrolerów.</p>
<p>Główną nowością w rebuildzie klasy użytkownika i ACL jest możliwość nadawania rang, co znacznie ułatwia pracę nad aplikacjami wymagającymi zaawansowanego dostępu do poszczególnych modułów aplikacji.  Przykładowe wykorzystanie klasy użytkownika prezentuje się następująco:</p>
<p>[php]< ?php</p>
<p>$oUser = new Vframe_User;</p>
<p>// log in user<br />
$oUser->Auth(true);<br />
// add some groups with ranks<br />
$oUser->setGroup(&#8216;administrator&#8217;, 10);<br />
$oUser->setGroup(&#8216;moderator&#8217;,     2);<br />
$oUser->setGroup(&#8216;redactor&#8217;,      1);<br />
// and one without rank&#8230; rank for this group will be set as 0<br />
$oUser->setGroup(&#8216;user&#8217;);<br />
// we can also set only one with theese groups</p>
<p>// will output true<br />
var_dump( $oUser->hasGroup(&#8216;administrator&#8217;) );<br />
// will output true, because group &#8220;moderator&#8221; has group rank 2<br />
var_dump( $oUser->hasRank(2) );<br />
// will output true, because user has greater ranks than 1, it can be rank 1 too&#8230;<br />
var_dump( $oUser->isRank(1) );<br />
// first will output true, second false<br />
var_dump( $oUser->isRank(5), $oUser->isRank(11) );<br />
// will output true, user is logged in<br />
var_dump( $oUser->Auth() );</p>
<p>?>[/php]</p>
<p>Kolejnym ważnym elementem jest konfiguracja warstwy dostępu do kontrolera. Przedstawia się ona mniej więcej tak:</p>
<p>[php]< ?php</p>
<p>$aConfig = array<br />
(<br />
'access' => array<br />
(<br />
// allow ranks 1, 2 and group &#8216;b&#8217;<br />
&#8216;allow&#8217; => array(1, 2, &#8216;b&#8217;),<br />
// allow only group &#8216;a&#8217;<br />
&#8216;allow&#8217; => &#8216;a&#8217;,<br />
// allow users with rank 4 or greater<br />
&#8216;allow&#8217; => 4,</p>
<p>// so&#8230; forget about above exaple, and&#8230;<br />
// let&#8217;s create access filter for allow users without banned group<br />
&#8216;allow&#8217; => &#8216;user&#8217;,<br />
&#8216;deny&#8217;  => &#8216;banned&#8217;,<br />
),<br />
);</p>
<p>?>[/php]</p>
<p>Konfigurację możemy przedstawić w dowolnym formacie: php array, xml document lub ini configuration.</p>
<p>To na tyle : ) Myślę, że wystarczy wszystkim deweloperom.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/klasa-uzytkownika-oraz-filtry-access/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Vframe 2.0 &#8211; zapowiedź</title>
		<link>http://athlan.pl/vframe-20-zapowiedz/</link>
		<comments>http://athlan.pl/vframe-20-zapowiedz/#comments</comments>
		<pubDate>Sun, 22 Jul 2007 17:36:05 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Projects]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/vframe-20-zapowiedz/</guid>
		<description><![CDATA[Rozpoczynam pracę nad Vframe framework oznaczonym numerkiem 2. Cały silnik jest pisany od samego początku. Nowych możliwości od groma, począwszy od rozwinięcia routera kończąc po stabilizacji dostępu do obiektów z poziomu kontrolera. W przeciwieństwie do wersji 1.x, w nowej odsłonie Vframe będzie obowiązywało nazewnictwo klas a&#8217;la Zend Framework, daje to poczucie komfortu programowania oraz możliwości [...]]]></description>
			<content:encoded><![CDATA[<p>Rozpoczynam pracę nad Vframe framework oznaczonym numerkiem 2. Cały silnik jest pisany od samego początku. Nowych możliwości od groma, począwszy od rozwinięcia routera kończąc po stabilizacji dostępu do obiektów z poziomu kontrolera. W przeciwieństwie do wersji 1.x, w nowej odsłonie Vframe będzie obowiązywało nazewnictwo klas a&#8217;la Zend Framework, daje to poczucie komfortu programowania oraz możliwości rozbudowy ścieżek. Kilka zasadniczych featurów w wersji 2.0:</p>
<ul>
<li>Zupełnie nowe 3 <strong>routery</strong>, podstawowy (bazujący na tablicy $_GET),  rewrite (separator &#8220;/&#8221;, &#8220;,&#8221; lub inny do sprecyzowania, elastyczny na tyle, że nie trzeba mieć modrewrite na serwerze) oraz zaawansowany bazujący na wyrażeniach regularnych adresu. Routery są w pełni konfigurowane, w zasadzie nie ma ograniczeń co do pozycji parametrów i ich imion.</li>
<li>Zaawansowana <strong>obsługa sesji</strong> oferująca dopinanie swoich handlerów z dwoma gotowymi (pliki oraz baza danych). Obsługa sesji implementuje interfejs Countable, dzięki czemu szybko można wyciągnąć i zcacheować ilość osób online. Pełna konfiguracja ciastek wysyłanych na potrzebę implementacji sesji.</li>
<li><strong>Obsługa baz danych</strong> oparta na PDO, autoukładanie formatowanie zapytań.</li>
<li>Modularny <strong>Input</strong>, dane get, post, files, server są przechwytywane przez pluginy, dzięki czemu można dopinać sobie swoje wtyczki na potrzeby konkretne aplikacji, bądź całego frameworka. Jednym z pluginów jest parsowanie informacji o domyślnym języku użytkownika oraz przeglądarki z danych wejściowych.</li>
<li><strong>Klasa użytkownika</strong> oprócz przystosowywania grup będzie mogła nadawać im rangi, dzięki czemu nie trzeba sprawdzać dziesięciu grup usera, tylko rangę &gt; 10. Analogicznie do identyfikacji grupy użytkownika hasGroup(), można odwołać się do rang &#8211; hasRank().</li>
<li>Zaawansowany <strong>parser konfiguracji</strong> &#8211; wykrywa jedno z 3 rozszerzeń oraz dodaje domyślne &#8211; php. Dostępne czytniki plików konfiguracyjnych to XML, PHP Array oraz INI. Możliwość odpisania swoich sterowników, które są używane w zależności od rozszerzenia pliku konfiguracyjnego. Nieskończona głębia grup konfiguracyjnych.</li>
<li><strong>Cache</strong>. Tak jak w przypadku plików konfiguracyjnych występuje tu możliwość nieskończonego zagłębienia cache w grupy. Cache obsługiwane przez 3 podstawowe silniki: pliki, baza danych oraz Memcache.</li>
<li><strong>Backend</strong>. Podobnie jak w Symfony w Vframe pojawią się 2 dodatkowe aplikcje. Backend oraz system modułów. Backend generuje instalatory do baz danych oraz ma możliwość ustalenia dowolnej ilości dowolnych pól danych. Akcje: dodaj, edytuj, usuń, filtruj, szukaj.</li>
</ul>
<p>Nie podaję terminu zakończenia prac, jest on niepewny, najważniejsze żeby wszystko było stabilne. Nową wersję piszę ze względu na własne potrzeby, backend na ciągłość powtarzania tych samych operacji.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/vframe-20-zapowiedz/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Autoload &#8211; praktyczne mapowanie</title>
		<link>http://athlan.pl/autoload/</link>
		<comments>http://athlan.pl/autoload/#comments</comments>
		<pubDate>Sat, 31 Mar 2007 20:21:58 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Solutions]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/autoload/</guid>
		<description><![CDATA[O autoloadzie klas było już głośno, rozpatrywaliśmy wszelkie za i przeciw w wielu miejscach choćby tu, tu i tu. Mechanizm automatycznego ładowania potrzebnych nam klas jest bardzo dobrym sposobem na zrelaksowanie się poprzez brak przymusu ręcznego ładowania plików potrzebnych do działania aplikacji. Znajdźmy receptę na owe pytanie przedstawiając dwa najpopularniejsze sposoby trzymania klas w np. [...]]]></description>
			<content:encoded><![CDATA[<p style="margin-bottom: 0cm">O <a href="http://php.net/autoload">autoloadzie</a> klas było już głośno, rozpatrywaliśmy wszelkie za i przeciw w wielu miejscach choćby <a href="http://forum.php.pl/index.php?showtopic=40450">tu</a>, <a href="http://strzalek.net/blog/8/autoload-automatyczne-ladowanie-klas">tu</a> i <a href="http://forum.php.pl/index.php?showtopic=26107">tu</a>.</p>
<p style="margin-bottom: 0cm">Mechanizm automatycznego ładowania potrzebnych nam <a href="http://php.net/class">klas</a> jest bardzo dobrym sposobem na zrelaksowanie się poprzez brak przymusu ręcznego <a href="http://php.net/include">ładowania plików</a> potrzebnych do działania aplikacji. Znajdźmy receptę na owe pytanie przedstawiając dwa najpopularniejsze sposoby trzymania klas w np. <a href="http://pl.wikipedia.org/wiki/Framework">frameworkach</a>.</p>
<ul>
<li>
<p style="margin-bottom: 0cm"><a href="http://framework.zend.com/">Zend Framework</a> i <a href="http://rapide.pl">Rapide</a> mają dość sztywną, lecz nie wymagającą specjalnego kombinowania technikę umieszczania plików w core. Sposób nazewnictwa jest bardzo prosty: <em>Folder_Subfolder_Klasa</em> – owy  zapis odnosi się do 	<em>./Folder/Subfolder/Klasa.Class.php</em>.</p>
</li>
<li>
<p style="margin-bottom: 0cm">W <a href="http://framework.vgroup.pl">moim frameworku Vframe</a> 	zastosowałem technikę, w której pliki leżą sobie „wolność w core, nazewnictwo klas nie tyczy się ich ścieżki, np. <em>NazwaKlasy</em> może odnieść się do <em>./NazwaKlasy.Class.php</em> lub <em>./Folder/Subfolder/ NazwaKlasy.Class.php</em>.</p>
</li>
</ul>
<p style="margin-bottom: 0cm">Spróbuję opisać drugi – mój – sposób na ładowanie plików z core aplikacji. Potrzebna nam będzie klasa, która jest w stanie przeskanować całe core i zapisać je do tablicy. Aby było łatwiej, skan zostanie zaserializowany do pliku jako mapa folderu. Co jeżeli plik nie będzie istniał w core? Wówczas mapa zostanie stworzona od nowa, jeżeli to nie pomoże &#8211; wyrzucimy wyjątek.</p>
<p style="margin-bottom: 0cm">Projektujemy naszą klasę, nazwiemy ją przykładowo Autoload, metody:</p>
<ul>
<li>
<p style="margin-bottom: 0cm"><em><strong>Load</strong>($sLibrary, $bRemapped = false)</em> – metoda która będzie odpowiedzialna za załadowanie 	pliku oraz (jeżeli nie będzie istniała) stworzenie tablicy plików. W wypadku braku pliku zostanie ponownione wywołanie metody tworzenia mapy plików z przymusowym przeskanowaniem folderu klas oraz tym samym odpalenie metody samej siebie z przyjęciem drugiego jej parametru na true – brak ponownego skanowania folderu i wyrzut wyjątku.</p>
</li>
<li>
<p style="margin-bottom: 0cm"><em><strong>Map</strong>($bUseTemp = true) </em>– metoda 	odpowiedzialna za stworzenie tablicy z plikami na podstawie pliku mapy poprzez odserializowanie danych w nim zapisanych. Jeżeli parametr otrzyma wartość false lub plik mapy nie będzie możliwy do odczytu, wówczas tworzona zostanie mapa, zapisana do pliku 	mapy oraz do tablicy klasy.</p>
</li>
<li>
<p style="margin-bottom: 0cm"><em><strong>FormatName</strong>($sLibrary) </em>– metoda 	formatująca nazwę klasy: Klasa.Class.php</p>
</li>
</ul>
<p style="margin-bottom: 0cm">Wykorzystamy trzy stałe:</p>
<ul>
<li>
<p style="margin-bottom: 0cm"><em>const _<strong>LibDir</strong></em><strong> </strong>– określa ścieżkę folderu z klasami</p>
</li>
<li>
<p style="margin-bottom: 0cm"><em>const _<strong>LibSurfix</strong></em><strong> </strong>– surfixy plików (.Class.php)</p>
</li>
<li>
<p style="margin-bottom: 0cm"><em>const _<strong>LibMap</strong></em><strong> </strong>– ścieżka i nazwa pliku mapy</p>
</li>
</ul>
<p style="margin-bottom: 0cm">Potrzebna będzie nam jeden statyczny, prywatny parametr klasy, który jest sam w sobie jej singletonem, więc każda instancja klasy będzie z niego korzystała:</p>
<p style="margin-bottom: 0cm"><em>private static $_aCoreMap = array();</em></p>
<p>Ok, teraz wystarczy użyć funkcji <em>__autoload() </em>i wykorzystać naszą klasę:</p>
<p>[php]function __autoload($sLibrary)<br />
{<br />
try<br />
{<br />
Autoload::Load($sLibrary);<br />
}<br />
catch(AutoloadException $oException)<br />
{<br />
// some message to display<br />
die(&#8216;Autoload failed: &#8216; . $oException-&gt;getMessage());<br />
}<br />
}[/php]</p>
<p>Tworzymy osobisty wyjątek dla autoloadera:</p>
<p>[php]class AutoloadException extends Exception<br />
{</p>
<p>}[/php]</p>
<p>oraz samą klasę:</p>
<p>[php] class Autoload<br />
{<br />
const _LibDir = &#8216;Core/&#8217;;<br />
const _LibSurfix = &#8216;.Class.php&#8217;;<br />
const _LibMap = &#8216;Map.tmp&#8217;;</p>
<p>private static $_aCoreMap = array();</p>
<p>public static function Load($sLibrary, $bRemapped = false)<br />
{<br />
if(!count(self::$_aCoreMap))<br />
self::Map();</p>
<p>$sLibraryFile = self::FormatName($sLibrary);</p>
<p>if(!isset(self::$_aCoreMap[$sLibraryFile]))<br />
{<br />
if($bRemapped)<br />
// if we remapped core and library dosen&#8217;t exists &#8211; throw an exception<br />
throw new AutoloadException(&#8216;Library &#8220;&#8216; . $sLibrary . &#8216;&#8221; has not been found in directory map!&#8217;);<br />
else<br />
{<br />
// ok, let&#8217;s go map core again without using map from file<br />
self::Map(false);<br />
// try load class from core directory again&#8230;<br />
self::Load($sLibrary, true);<br />
}<br />
}</p>
<p>require_once(self::$_aCoreMap[$sLibraryFile]);<br />
}</p>
<p>public static function Map($bUseTemp = true)<br />
{<br />
// if map is ok and we counld use it, get the map from file&#8230;<br />
if($bUseTemp &amp;&amp; is_readable(self::_LibMap))<br />
self::$_aCoreMap = unserialize(file_get_contents(self::_LibMap));<br />
// &#8230;unless we have to scan core and make map<br />
else<br />
{<br />
// clear array and remamp directory<br />
self::$_aCoreMap = array();</p>
<p>foreach(new RecursiveIteratorIterator(new RecursiveDirectoryIterator(self::_LibDir)) as $oFile)<br />
{<br />
$sFile = $oFile-&gt;getFilename();</p>
<p>if(isset(self::$_aCoreMap[$sFile]))<br />
throw new AutoloadException(&#8216;Core duplication &#8220;&#8216;.$sFile.&#8217;&#8221; found!&#8217;);<br />
else<br />
self::$_aCoreMap[$sFile] = $oFile-&gt;getPathname();<br />
}</p>
<p>// ok, save map to file<br />
if(!file_put_contents(self::_LibMap, serialize(self::$_aCoreMap)))<br />
throw new VframeException(&#8216;Cannot create core map!&#8217;);<br />
}<br />
}</p>
<p>private static function FormatName($sLibrary)<br />
{<br />
return $sLibrary . self::_LibSurfix;<br />
}<br />
}<br />
?&gt;[/php]</p>
<p><img src="http://www.speedyshare.com/gf/pic2.gif" align="left" height="60" width="40" />Całą paczkę klasy i zastosowań możecie <a href="http://www1.speedyshare.com/data/682616883/2918261/10302420/Autoload.rar">pobrać tutaj</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/autoload/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Wyróżnienie art.php.pl</title>
		<link>http://athlan.pl/wyroznienie-artphppl/</link>
		<comments>http://athlan.pl/wyroznienie-artphppl/#comments</comments>
		<pubDate>Sat, 17 Mar 2007 14:01:27 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Private]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/wyroznienie-artphppl/</guid>
		<description><![CDATA[W czwartek dowiedziałem się, że zostałem wyróżniony w ogólnopolskim konkursie art.php.pl przez firmę NQ.pl. NQ.pl było jednym ze sponsorów, ale również obserwatorem konkursowych zmagań. Liczba prac była duża i nie mogliśmy zapoznać się z każdą z nich. Kilka prac szczególnie przypadło nam do gustu, dlatego też postanowiliśmy dodatkowo wyróżnić dwie prace: Vframe framework, autor: Piotr `athlan` [...]]]></description>
			<content:encoded><![CDATA[<p>W czwartek <a HREF="http://forum.php.pl/index.php?showtopic=62573&amp;st=0&amp;p=340401?entry340401">dowiedziałem się</a>, że zostałem wyróżniony w ogólnopolskim konkursie <a HREF="http://art.php.pl">art.php.pl</a> przez firmę <a HREF="http://nq.pl">NQ.pl</a>.</p>
<blockquote><p>NQ.pl było jednym ze sponsorów, ale również obserwatorem konkursowych zmagań. Liczba prac była duża i nie mogliśmy zapoznać się z każdą z nich.</p>
<p>Kilka prac szczególnie przypadło nam do gustu, dlatego też postanowiliśmy dodatkowo wyróżnić dwie prace:<br />
<strong>Vframe framework, autor: Piotr `athlan` Pelczar</strong> oraz <strong>Logger, autor: Mateusz `CyberBoB` Kaczmarek</strong>.</p>
<p>Autorzy tych prac otrzymują od nas darmowy pakiet <a HREF="http://www.nq.pl/nqdeveloper">NQ.developer</a> pozwalający na utworzenie pięciu repozytoriów <a HREF="http://pl.wikipedia.org/wiki/SVN">SVN</a> oraz projektów zarządzanych przez Trac.</p></blockquote>
<p>Nie ukryję, że jestem dumny z <a HREF="http://framework.vgroup.pl">mojego projektu</a>. Jednakże ten jest już zamknięty (powstają na nim ostatnie juz aplikacje), gdyż zostałem developerem <a HREF="http://rapide.pl">Rapide framework</a>. Ci, co stanęli na podium oraz wyróżnieni otrzymają dyplomy lub zaświadczenia <a HREF="http://kuba.websky.pl/pub/fphp/dyplom-sample.jpg">na wzór tego</a>. Niech to będzie motywacją do wzięcia udziału w konkursie dla tych, którzy nie wystawili swoich prac przed publiczność.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/wyroznienie-artphppl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Przejście do Rapide</title>
		<link>http://athlan.pl/przejscie-do-rapide/</link>
		<comments>http://athlan.pl/przejscie-do-rapide/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 15:04:43 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[Private]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/przejscie-do-rapide/</guid>
		<description><![CDATA[Dziś ostatecznie zdecydowałem się w jaką inżynierię oprogramowania wejdę, co postaram się rozbudowywać i poświęcać temu czas. Postanowiłem zostać developerem Rapide Framework, propozycję współpracy dostałem dużo wcześniej, ale myśl o porzuceniu Vframe &#8211; nie ukrywam &#8211; bolała. Jakie wnioski? Nie ma sensu pisać wielkiego frameworka samemu&#8230; lepiej robić to w grupie ludzi, która zna się [...]]]></description>
			<content:encoded><![CDATA[<p>Dziś ostatecznie zdecydowałem się w jaką inżynierię oprogramowania wejdę, co postaram się rozbudowywać i poświęcać temu czas. Postanowiłem zostać developerem <a HREF="http://rapide.pl">Rapide Framework</a>, propozycję współpracy dostałem dużo wcześniej, ale myśl o porzuceniu Vframe &#8211; nie ukrywam &#8211; bolała. Jakie wnioski? Nie ma sensu pisać wielkiego frameworka samemu&#8230; lepiej robić to w grupie ludzi, która zna się na rzeczy, zawsze ktoś Cię może poprawić, wesprzeć, doradzić. Rola całkiem często odwraca się, że to właśnie Ty pomagasz i doradzasz. Decyzja zapadła ostatecznie, na Vframe napiszę ostatnią aplikację w ferie. Będę sięgał do jego pojedynczych komponentów jeżeli będzie taka potrzeba, ale to będą wyjątki.</p>
<p>Dlaczego porzuciłem projekt? Poddałem się? Nie. Projektu nie porzucilem, ale nie będę go już rozwijał, nie poddałem się, bo nic nie pójdzie do kosza. Możnaby było zapytać: co ze starymi klasami? Rapide jest gotów przyjąć parę moich rozwiązań, a jeżeli nie będą one dołożone w oficjalnym wydaniu, mogę korzystać z nich jako pomoce (pluginy bądź biblioteki).</p>
<p>Decydującym argumentem jest tutaj niewątpliwie modularność Rapide. <a HREF="http://forum.php.pl/Prph-m14481.html">Adrian (prph) </a>doskonale przewidział problemy, jakie mogą wystąpić przy dalszym toworzeniu frameworka. Prostym przykładem jest Config, który przyjmuje póki co dane jako tablicę, ale modularność aplikacji pozwala na dołączanie kolejnych możliwości, na przykład obsługe konfiguracji z poziomu plików INI, XML, itp. Drugim argumentem jest to, że pracujemy w grupie. Jak już wspomniałem w drugim akapicie jest to wspaniała sprawa, gdy grupa developerów pomaga sobie nawzajem, pozwala to na dalszy rozwój członka grupy.</p>
<p>Parę moich komponentów jest naprawdę dobrych, chociażby <a HREF="http://framework.vgroup.pl/expose-7706736af0a83eb21cebeec05f7e2c39.htm">Image</a>. Postaram się wingerować go do Rapide, lecz w sposób modularny, możliwe że ktoś napisze go za mnie, ważne są pomysły. Jeżeli macie jakieś osobiste refleksje dotyczące Rapide, odnoszę na <a HREF="http://forum.rapide.pl">oficjalne forum</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/przejscie-do-rapide/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Vframe 0.1.10 relased</title>
		<link>http://athlan.pl/vframe-0110-relased/</link>
		<comments>http://athlan.pl/vframe-0110-relased/#comments</comments>
		<pubDate>Sun, 28 Jan 2007 16:02:35 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/vframe-0110-relased/</guid>
		<description><![CDATA[Dziękuję za dotychczasowe opinie, wraz z pojawieniem się nowych opcji, pojawiła sie również nowa dokumentacja. Zacznę od tego, co zostało dodane do myśli technicznej: Dodano mapowanie całości core framewoka, czas działania diametralnie spadł, mapa jest tworzona dzien od ostatniej akutualizacji, lub gdy jakiejś klasy ni będzie w mapie. Jeżeli nie będzie jej po ponownym wygenerowaniu [...]]]></description>
			<content:encoded><![CDATA[<p>Dziękuję za dotychczasowe opinie, wraz z pojawieniem się nowych opcji, pojawiła sie również nowa dokumentacja. Zacznę od tego, co zostało dodane do myśli technicznej:</p>
<ul>
<li>Dodano mapowanie całości core framewoka, czas działania diametralnie spadł, mapa jest tworzona dzien od ostatniej akutualizacji, lub gdy jakiejś klasy ni będzie w mapie. Jeżeli nie będzie jej po ponownym wygenerowaniu mapy, wówczas zostanie wyrzucony wyjątek.</li>
<li> W pliku konfiguracyjnym nie muszą być zdefiniowane wszystkie stałe, potrzebne sa tylko niezbędne, resztę Vframe jest w stanie dopisać sobie automatycznie, na domyślne wartości</li>
</ul>
<p>Zmiany w funkcjonalności komponentów:</p>
<p><strong>Vsession, Vuser</strong> &#8211; dodano możliwość odwołania się do danych jako tablicy obiektu, gdyż implementowany jest interfejs ArrayAccess<br />
<strong>Vcontroller, Vview, Vmodel</strong> &#8211; otrzymały implementację interfejsu ArrayAccess i najważniejszych aliasów dla komponentów Lang(), Session(), Input(), Url(). Dziedziczą z klasy VcommonMVC i Vattributes.<br />
<strong>Vattributes</strong> &#8211; dodana nowa klasa, która daje możliwość operowania na atrybutach (tablicy $_aAttributes) poprzez metody __set(), __get(), has(), remove().<br />
<strong>Vinput</strong> &#8211; wprowadzone zmiany o ktore prosiliście, przy okazji bardzo mi się przydały w wykonaniu jednego z projektów. więcej:<br />
<a HREF="http://framework.vgroup.pl/read-input-data.html#4.7.1">http://framework.vgroup.pl/read-input-data.html#4.7.1</a><br />
<strong>Vlang</strong> &#8211; wykrywanie domyślnego języka użytkownika oraz wybranie odpowiedniego z dostępnych w aplikacji &#8211; główna myśl wersji 0.1.10, więcej:<br />
<a HREF="http://framework.vgroup.pl/read-languages.html#4.8.4">http://framework.vgroup.pl/read-languages.html#4.8.4</a><br />
<a HREF="http://framework.vgroup.pl/read-uzytkownik.html#4.11.4">http://framework.vgroup.pl/read-uzytkownik.html#4.11.4</a><br />
Zmienione nazewnictwo plików językow na skróty, zamiast Polish jest pl itd., więcej:<br />
<a HREF="http://framework.vgroup.pl/read-languages.html#4.8.1">http://framework.vgroup.pl/read-languages.html#4.8.1</a><br />
<strong>Vuser</strong> &#8211; ustawianie języka użytkownika, więcej:<br />
<a HREF="http://framework.vgroup.pl/read-uzytkownik.html#4.11.4">http://framework.vgroup.pl/read-uzytkownik.html#4.11.4</a></p>
<p>Vframe 0.1.10 możecie pobrać z działu download:<br />
<a HREF="http://framework.vgroup.pl/download.html">http://framework.vgroup.pl/download.html</a></p>
<p>Manual dostępny pod starym adresem:<br />
<a HREF="http://framework.vgroup.pl/manual.html">http://framework.vgroup.pl/manual.html</a></p>
<p>Dodany został DevServer, na którym stale działam, tam są publikowane natychmiastowe zmienay w CORE, które nie zostały opublikowane. Na devserwer tworzone są kolejne wersje fw:<br />
<a HREF="http://framework.vgroup.pl/devserver.html">http://framework.vgroup.pl/devserver.html</a></p>
<p>Wersję 0.1.10 zgłosiłem do konkursu <a HREF="http://art.php.pl">art.php.pl</a> , projekt <a HREF="http://art.php.pl/Projekt/47">możecie oglądać tutaj</a>.</p>
<p STYLE="text-align: center"><img HEIGHT="64" WIDTH="213" STYLE="width: 213px; height: 64px" SRC="http://img265.imageshack.us/img265/5454/img2pk2.png" /></p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/vframe-0110-relased/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mapa Core frameworka</title>
		<link>http://athlan.pl/mapa-core-frameworka/</link>
		<comments>http://athlan.pl/mapa-core-frameworka/#comments</comments>
		<pubDate>Sun, 21 Jan 2007 20:54:41 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/mapa-core-frameworka/</guid>
		<description><![CDATA[Ostatnio nurtował mnie problem, jak mają być ułożone pliki we frameworku, tak aby można było je bardzo łatwo ładować poprzez __autoload(). Rozmyślałem nad sposobem zastosowanym w Zend Framework oraz moim &#8211; rzucić pliki niezależnie od ich nazw. Dwa linki, gdzie publikowałem swe przemyślenia, wyciągłaem wnioski, porównywałem wyniki: Notka na blogu Temat na forum.php.pl Ostatecznie wygrał [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio nurtował mnie problem, jak mają być ułożone pliki we frameworku, tak aby można było je bardzo łatwo ładować poprzez<em> __autoload()</em>. Rozmyślałem nad sposobem zastosowanym w Zend Framework oraz moim &#8211; rzucić pliki niezależnie od ich nazw. Dwa linki, gdzie publikowałem swe przemyślenia, wyciągłaem wnioski, porównywałem wyniki:</p>
<ul>
<li><a href="http://athlan.vgroup.pl/uklad-plikow-core-frameworka-przemyslen-kilka/">Notka na blogu</a></li>
<li><a href="http://forum.php.pl/Uklad-klas-w-core-FW-t60523.html">Temat na forum.php.pl</a></li>
</ul>
<p>Ostatecznie wygrał mój sposób. Kładę pliki tam, gdzie chcę, niezależnie od nazwy klasy. Zend Framework ma sztywno ustalone ścieżki klas, w zlaeżności od jej nazwy. Ci co mnie znają wiedzą, że nie lubię się ograniczać :)</p>
<p>No tak&#8230; wygrał sposób dotychczas stosowany w moim frameworku Vframe, ale jak rozwiązałem problem skanowania folderu Core za każdym razem? Hak bardzo prosty: tworzenie tzw. mapy frameworka. Czym jest owa mapa? Zwykłą zaserializowaną tablicą, która tworzona jest po pierwszym skanie zawartości frameworka. Po co tworzyć ją od nowa za każdym odświeżeniem strony, skoro można ją raz zapisać (<a href="http://phpfi.com/195919">przykład wypluty przez <em>var_dump()</em> mapy</a>).</p>
<p><strong>Na jakiej zasadzie to działa?</strong> Mapa zapisywana jest w pliku <em>Vframe.map</em>, to, co pokazałem w powyższym linku to jeden z elemetów mapy (wartość indeksu tablicy <em>&#8220;files&#8221;</em>). Są jeszcze dwa indexy: <em>&#8220;date&#8221;</em> oraz <em>&#8220;version&#8221;</em>. Jeżeli wersja frameworka zmieni się, lub minie dzień od wygenerowania mapy, wówczas jest ona tworzona raz jeszcze. Mapa frameworka trzymana jest bezpośrednio w jego folderze. Dlaczego? Ponieważ zawiera mapę samego siebie.</p>
<p><strong>Podsumowywując:</strong></p>
<ul>
<li>zaoszczędziłem czas działania aplikacji</li>
<li>nie zmieniłem nazewnictwa klas</li>
<li>nie jestem uzależniony od nadawania nazw klas w stosunku do ich położenia</li>
<li>mapa aplikcaji jest na bieżąco aktualizowana, lub przy zmianie wersji ulega automatycznej zmianie</li>
</ul>
<p>Myślę, że publikując wyniki <em>&#8220;badań&#8221;</em> rozwieje wiele wątpliwości <em>&#8220;przeciwnikow&#8221;</em> układu plików w Zend Framework.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/mapa-core-frameworka/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Układ plików Core frameworka – przemyśleń kilka</title>
		<link>http://athlan.pl/uklad-plikow-core-frameworka-przemyslen-kilka/</link>
		<comments>http://athlan.pl/uklad-plikow-core-frameworka-przemyslen-kilka/#comments</comments>
		<pubDate>Sat, 20 Jan 2007 08:08:27 +0000</pubDate>
		<dc:creator>Athlan</dc:creator>
				<category><![CDATA[Framework]]></category>

		<guid isPermaLink="false">http://athlan.vgroup.pl/uklad-plikow-core-frameworka-%e2%80%93-przemyslen-kilka/</guid>
		<description><![CDATA[Wprawdzie mój framewoek ma jak widać finalny układ plików, ale zaczyna mnie gryźć&#8230; przed startupem cały core jest skanowany, dzięki czemu mogę rzucać sobie klasy w katalogu core gdzie popadnie, moge stworzyć 5 folderów i potem dać klase. Mnie się on coraz to mniej podoba. Ostatnio przeglądałem Zend Framework dziesiąty raz, postanowiłem zebrać w kupę [...]]]></description>
			<content:encoded><![CDATA[<p>Wprawdzie mój framewoek ma jak widać finalny układ plików, ale zaczyna mnie gryźć&#8230; przed startupem cały core jest skanowany, dzięki czemu mogę rzucać sobie klasy w katalogu core gdzie popadnie, moge stworzyć 5 folderów i potem dać klase. Mnie się on coraz to mniej podoba. Ostatnio przeglądałem Zend Framework dziesiąty raz, postanowiłem zebrać w kupę plusy i minusy mojego sposobu oraz sposobu wykorzystamyn w Zendzie.</p>
<p>Układ plików w Vframe:</p>
<blockquote><p><strong>(+)</strong> skanowanie core zapewnia porządek i elastyczność, mogę rzucić klasę gdzie popadnie<br />
<strong>(+)</strong> stosowanie nazw klas jest niezależne od ich położenia<br />
<strong>(-)</strong> czas działania nieznacznie się wydłuża</p>
</blockquote>
<p>Układ plików w Zend Framework:</p>
<blockquote><p><strong>(+)</strong> nie trzeba skoanować core<br />
<strong>(-)</strong> nazwy klas są ściśle uzależnione od ich położenia<br />
<strong>(-)</strong> robi się mase folderów, w ktorych jest zazwyczaj po jednym pliku</p>
</blockquote>
<p>Mimo tego, że moim zdaniem Zend ma więcej minusów przeze mnie wykrytych, jestem mu jakoś bardzie przychylny. Nie podoba mi się nazwa typu Zend_Folder_Klasa. Nie mam symapatii do „dolnych podkreśników‿. Wymyśliłem sobie, że w moim fw mogę zastosować inny sposób oddzielania ukladu pliku w nazwie klasy. Odpowiednikiem  Zend_Folder_Klasa byłoby wówczas VfolderKlasa lub VfolderPodfolderKlasa, lub po prostu Vklasa. Aby nie robić bałaganu, wszystkie wyjątli miałyby nazwę np. VexceptionCache, dzięki czemu nie tworze nowego folderu Cache, w którym jest tylko wyjątek. Tak to mam jeden folder z wyjątkami. To samo tyczy się interfejsów. Nazwa nie byłaby oddzielana podkreślnikiem, tylko kolejną wielką literą.</p>
<p>Jeżeli wdrożyłbym owy sposób, wówczas zmieniloby się 40% nazewnictwa klas. Następnym, że tak powiem „kompleksem‿ jest oddzielenie klas odpowiedzialnych za MVC od klas funkcjonalnych mojego fw. Obecnie trzymam je w folderze Mvc. Zapis kontrolera w nowym schemacie działania miłby postać VmvcController. ſeeeee, średnio mi się podoba&#8230; chociaż&#8230;</p>
<p>Kwestię zostawiam w fazie przymyślnia i omówienia przez opinię publiczną. Jeżeli wdrożyłbym owy sposób ulokowania plików, wyszłaby całkiem nowa wersja fw już ze znaczącymi zmianami. Być może pojawi się stosowny temat na forum.php.pl.</p>
]]></content:encoded>
			<wfw:commentRss>http://athlan.pl/uklad-plikow-core-frameworka-przemyslen-kilka/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
