Heavymind
Gdyby ludzie rozmawiali tylko o tym, co rozumieją, zapadłaby nad światem wielka cisza.

19/07/2008

Kolejna część samouczka Zend Framework opublikowana

Opublikowane jako: Zend — Tags: , , , — Kubek Bartosz @ 18:03

Zapowiadana od jakiegoś czasu, kolejna część samouczka z serii Zend Framework Tutorial, została opublikowana.
Jest to artykuł pt. “Zend Framework Tutorial - Rozwijanie Zend View - Implementacja Smarty“, do lektury którego serdecznie zapraszam!



05/07/2008

SEO porządki

Opublikowane jako: Off topic — Tags: — Kubek Bartosz @ 09:39

Ze względu na optymalizacje pod kątem silników wyszukiwania ( SEO ), m.in. adres tej strony bloga został przeniesiony na domenę www.heavymind.net. Mam nadzieję, że nie utrudni to Wam, moi drodzy czytelnicy, korzystania z jej zawartości.

Nadmienię przy okazji, iż na dniach powinienem byc gotów do opublikowania kolejnej części samouczka Zend Framework.



07/05/2008

Aktualizacja trzeciej cześći samouczka Zend Framework

Opublikowane jako: Zend — Tags: , , , , — Kubek Bartosz @ 20:52

Pragnę poinformować, iż zaktualizowałem trzecią część serii Zend Framework Tutorial, pt.: “Rozwijanie Zend View - Zend Layout“. Artykuł ten jest w tym momencie dostosowany do zmian jakie zostały wprowadzone wraz z wersją 1.5.0 Zend Framework.

Dodatkowo udostępniłem za pośrednictwem serwera SVN, kompletny kod źródłowy. Szczegóły w akapicie Repozytorium SVN.



12/04/2008

Dostęp do kodów źródłowych samouczków Zend Framework

Opublikowane jako: Subversion, Zend — Tags: , , , , — Kubek Bartosz @ 15:08

Świadom zapotrzebowania, przygotowałem drodzy moi czytelnicy, dostęp do kodów źródłowych, gotowych przykładów samouczków z serii Zend Framework. Dostęp do źródeł za pośrednictwem serwera SVN, udostępniam dzięki usługom Google Code.

Osobom nie znającym jeszcze systemu kontrolowania wersji Subversion (SVN), polacam zapoznanie się z jego możliwościami i obsługą, ponieważ jest to jedno z podstawowych narzędzi każdego programisty. Aktualnie, czasowo nie jestem w stanie, by streścić podstawy obsługi jakiegokolwiek klienta SVN, dlatego odsyłam do źródeł wujka Google.

Szczegóły nt. dostępu do kolejnych tagów repozytoriów odpowiednich części samouczka, znajdują sie w dodanych przez mnie sekcjach owych samouczków. Są nimi kolejno:

Celowo nie zamieściłem odnośników do repozytorium z kodem źródłowym aplikacji z III części samouczka “Zend Framework Tutorial - Rozwijanie Zend View - Zend Layout“, dlatego że po opublikowaniu Zend Framework w wersji 1.5.1, treść tego artykułu wymaga gruntownego przepisania. Wiąże się to bezpośrednio z faktem załączenia do jądra Zend Frameworka biblioteki Zend_Layout, która w III części samouczka jest opisana jako dodatkowa biblioteka rozszerzająca. Przy tej okazji nie radzę wręcz, by starać się korzystać z treści tej części samouczka.



07/04/2008

Nadchodzi Symfony 1.1

Opublikowane jako: Symfony — Tags: , , , , , , — Kubek Bartosz @ 22:34

Kilka nieatrakcyjnych cech, jakie pozwoliłem sobie wytknąć framework’owi Symfony w poprzednim wpisie, pokazuje jego niedoskonałość. Cóż, trudno - ponoć nie istnieją rozwiązania doskonałe.

Jednak w przypadku tego framework’a, dużo ma się zmienić i to na lepsze. Zapoznając się z jednym z ostatnich wpisów na blogu Symfony, dowiadujemy się szczegółów nt. tego co ulec ma zmianie. Są nimi w większości:

  • całkowicie napisany od nowa Command Line Interface (CLI), wraz z solidnie rozpisanym helpem. Jest faktem że podczas procesu developerskiego, Symfony CLI jest wykorzystywany często. Jest więc to krok w dobrą stronę,
  • zbudowano nowy subframewok do budowy formularzy. Jest on całkowicie obiektowy. Konsekwencją tego zabiegu jest: wyeliminowanie View Helperów (bardzo dobrze, zalatywały PHP4 ), zastąpienie wątpliwego mechanizmu walidatorów budowanych w plikach YAML, walidatorami obiektowymi ( jako część wspomnianego subframeworka), oraz wszelka integracja warstwy widoku, oraz żądań (Request’ów) z tym systemem. Tutaj duże brawo,
  • integracja zabezpieczenia przeciw atakom Cross-site request forgery (CSRF), jako element subframeworku formularzy. W mojej opinii, mechanizmy przeciwdziałania CSRF, są bardzo ciekawym zjawiskiem jakie jest aktualnie w modzie. I dobrze, ponieważ obszar jaki pokrywają serwisy internetowe jest coraz większy. Zwiększanie bezpieczeństwa witryn poprzez propagowanie kolejnych standardów jest przez mnie jak najbardziej uznawane,
  • rozszerzono możliwości systemu cache’owania. Woila! Jedna z najgorzej przygotowanych rzeczy w wer. 1.0 została przystosowana do użyteczności. Będzie więc można:
    - łatwo usuwać cache’e innej aplikacji, niż aktualna,
    - podczas potrzeby uzyskania dostępu do grupy cache’ów w celu usunięcia ich, możemy skorzystać z znaków wieloznaczności ( wildcards ) ( zapowiada się dobra alternatywa dla tagów znanych z Zend Framework),
    - jako z miejsca składowania cache’y będziemy mogli wybrać Memcache ( przy aktualnych niskich cenach RAMu, trzymanie np aż 8GB cache’owanych danych w pamięci RAM serwera www nie jest żadnym problemem ),
    - generalnie cache w końcu będzie można zastosować nie tylko do warstwy widoku, lub całościowo MCV, ale do wszystkiego, np: warstwy modelu,
  • usprawniono pracę z konfiguracjami, tj: lepszy parser YAML, pomocne informacje o błędach w YAML, możliwość większego prze strukturyzowania warstwy konfiguracyjnej. Nie znajduję jednak tutaj żadnej rewolucji. Dotychczasowe rozwiązania były czytelne w mojej ocenie,
  • rozbudowano możliwości mapowania obiektowo-relacyjnego (ORM), wraz z aktualizacją przy tym PROPEL‘a do nowszej wersji. Co zwróciło mą uwagę, to poprawienie czytelności plików schematu YAML podczas “zrzucania” istniejącej DB do YAML, oraz dodana możliwość definiowana danych testowych w relacji wiele-do-wielu (w tzw. plikach “fixtures”, zawierających stałe dane testowe, które się exportuje do bazy danych )
  • usprawniono system routingu. Nie wiele tu do skomentowania. Dobrze, ot co!,
  • rozbudowano możliwości systemu wielojęzykowego ( i18n ). To chyba jedno z ważniejszych usprawnień! Dzięki podłączeniu silnika cache’owania, oraz dodaniu narzędzi CLI do zarządzania różnicami w treści szablonów widoku, a słownikami (XLIFF w tym przypadku), tworzenie projektu wielojęzykowego w Symfony będzie w końcu wygodne!

To większość zmian jaka idzie z nową wersją. Jak widać jest tego na tyle sporo, a w mojej ocenie zmiany mają na tyle znaczenie, są tak wspaniałe i usprawniające pracę i jej jakość, iż z własnej strony, osobie noszącej się z zamiarem nauki tego framework’a polecał bym zaczekać jeszcze. Tak by zacząć od studiowania najnowszej wersji 1.1. Opinię tę opieram na fakcie tego jak wiele z wersji 1.0 stanie się nieaktualne i nie zalecane, jak również na tym, iż dokumentacja w postaci książki “The Definitive Guide to symfony”, owszem dostępna on-line w wersji 1.1, nie jest jeszcze zaktualizowania ( przez co informacje w niej o rozwiązaniach z wersji 1.1 jest szczątkowa ).

Ostatnio opublikowana rewizja w wersji 1.1 to Beta2. Nie udało mnie się jednak dotrzeć do informacji, kiedy możemy sie spodziewać rewizji Public Release. Z pewnością będzie to jeszcze kilka tygodni, przynajmniej.



06/04/2008

Panowanie nad Symfony

Opublikowane jako: AJAX, Symfony, Zend — Tags: , , , , , , , , — Kubek Bartosz @ 19:23

Pochłonięty światem frameworka Symfony, całkowicie zatraciłem poczucie czasu i “przespałem” moment, w którym to pewnie wszyscy “wymacywali” wszystkie nowe “ficzery” Zend Frameworka 1.5. Zajęty jednak mnogością zagadnień jakie pokrywa swoją funkcjonalnością Symfony, nie sposób było zrobić inaczej.

Po bardzo dokładnym jednak zapoznaniu się z Symfony, wyrobiłem sobie własną opinię na jego temat, która w paru detalach stawia go w nie najlepszym świetle. W mojej opinii :

  • model cache’owania jest na tyle niewygodny podczas potrzeby usunięcia “nieaktualnych cache’y”, że jedynym rozwiązaniem pozwalającym użyć ten mechanizm w dużym, a nawet średnim projekcie, jest rozszerzenie go samodzielnie o “tagi”, którymi poszczególne cache można by oznaczyć (co nie było by takie łatwe uwzględniając bardzo rozbudowaną strykturę cache’owania w Symfony)
  • i18n (moduł budowania aplikacji wielojęzykowej) jest straszny. Otóż podczas pracy z nim potrzeba jest przenoszenia każdej frazy z template’a do pliku słownika, który można budować np. w formacie XML Localization Interchange File Format (XLIFF) (co akurat jest dobrym rozwiązaniem ze względu na to, że istnieją programy wspomagające pracę z słownikami w tym formacie). Jednak każdorazowa potrzeba pisania frazy w template’cie oraz ponownego zdefiniowania jej w XLIFF’ie jest niewygodna. A już na pewno nie do zniesienia jest, w razie potrzeby poprawienia frazy w oryginale ( w template’cie ), wymóg poprawiania jej w słowniku (np XLIFF). Stosując w kolejnych projektach stałe i sprawdzone rozwiązanie oparte na kluczach stałych ( np “NAVIGATION_ITEM_MEMBER_HOME” ), zastanawiam się skąd takie podejście. Owszem, są sposoby by to obejść, jednak nie w tym rzecz by trzeba było obchodzić domyślne schematy.
  • integracja JavaScript ( w tym Prototype oraz Scriptaculous ) w szablony HTML ( template’y ) poprzez zastosowanie licznych tzw View Helperów (znane zagadnienie również dla programistów Zend Framework) jest jeszcze bardziej straszne i w mojej ocenie nie do zaakceptowania! Otóż, idąc tą drogą, jako rezultat szablonu zawierającego udogodnienia web2.0 (w kontekście interaktywności JavaScript i AJAX), otrzymujemy kod HTML, licznie posiekany wstawkami “<script></script>”, czy też CDATA. Mimo więc mej znajomości wszelkich “remote” Helperów (właśnie tych od komunikacji AJAX, oraz wstawek zwykłego JavaScript) w Symfony , pasuję i wybieram tworzenie logiki po stronie klienta (JavaScript) w dotychczasowym stylu: jako osobne pliki .js.
  • ostatecznie odniosłem wrażenie, że autorzy książki “The Definitive Guide to symfony“, opisując liczne Helpery widoku (tj. input_tag(),  object_input_tag() itp.), nieraz sami próbowali na siłę przekonać samych siebie do potrzeby pisania template’u za ich użyciem. W mojej skromnej ocenie, szablony HTML, mają być szablonami HTML, a nie zbitką kodu PHP, gdzieniegdzie tylko poprzedzielaną znacznikami DIV. Tak jak w przypadku podstawowych Helper’ów widoku w Zend Framework, pachnie to sztuką dla sztuki.

Jednak to już wszystko co mogę powiedzieć złego o Symfony. Zauważyć więc należy, że by wytypować większość zalet tego framework’a, musiałbym napisać serię felietonów. Szala przeważa za tym, by traktować Symfony jako poważny framework, gotowy by pisać w nim duże, wielojęzyczne i nowoczesne aplikacje www.

Swoją drogą, framework ten w aktualnej stabilnej wersji 1.0 ma już ponad rok, co każe domniemywać , iż w nadchodzącej wersji 1.1 dużo się zmieni. I owszem, ale o tym już w następnym wpisie wkrótce.



18/02/2008

Podróże kształcą - Symfony, YAML, Propel, Prototype

Opublikowane jako: Symfony, Zend — Tags: , , , , — Kubek Bartosz @ 21:47

Kilak spraw organizacyjnych.

Dla osób, które zniecierpliwienie oczekują kolejnych artykułów, przekazuję i proszę - cierpliwości. Na zastój w publikacji zapowiadanych artykułów ma wpływ jedna szczególnie rzecz - nadchodząca wersja 1.5 Zend Framework.

Najprzód, chcę pokreślić, iż aktualnej wersji “1.5 Preview Release” (czyt. wdania zapowiadającego co będzie nowego) , nie wspieram/nie przyjmuję do wiadomości. Zespół autorów Zend Framework wyjaśnia, iż wiele metod w nowo dodanych funkcjonalnościach, może zmienić zasadę swego działania, jak również mogą zostać całkiem usunięte w części. Dlatego też niech dojrzewa swoim tempem nadchodzące wydanie tego frameworka.

Jedną z większych zmian jakie oferować mają nowe biblioteki, to spore zmiany w Zend_View. A dokładnie rzecz ujmując, autorom bibliotek rozszerzających możliwości Zend_View (tj. Zend_Layout, Zend_View_Helper_Placeholder), udało się wprowadzić ich rozwiązania jako składnik podstawowy pakietu Zend Framework w nadchodzącej wersji. Brawo im za to.

Co za tym idzie, istniejący już artykuł na łamach tej strony nt. Zend_Layout , będzie do przeróbki, a trzeci z serii który miał powstać, traktujący o widokach komponentowych, widokach częściowych itd. nie powstanie na bazie wcześniejszych, zewnętrznych i dodatkowych bibliotek. Owszem - powstać może, ale już w oparciu o przyszłą stabilną wersję 1.5.

Inna rzecz, że przygotowany materiał na artykuł drugi z serii Zend_View, traktujący o implementacji Smarty, nadal może powstać, ponieważ nie koliduje z tym co nadchodzi w nowym Zend Framework. Mam nadzieję iż będę gotów z publikacją tego artykułu przed stabilna nową wersją Zend Framework.

A między czas oczekiwania na Zend Framework 1.5, polecam poświęcić podróżom po po nowych lądach. Moim wyborem jest Symfony - ogromny framework, z równie olbrzymią społecznością używających go programistów. Pokuszę się o stwierdzanie, że jest to drugi co do rozmachu i zaawansowania framework, obok Zend Framework. Również w pełni obiektowy, posiadających wiele wspaniałych wbudowanych rozwiązań, do których Zend Framework albo już dąży w stosunku do jednych, albo jeszcze o tym nie wie że dążyć będzie, w stosunku do innych. Budowanie modułów z poziomu linii poleceń, implementacja i integracja z PROPEL‘em, który zapewnia część Modelu struktury MVC, integracja z Prototype, pełna konfigurowalność wszystkiego dzięki plikom YAML, część View modelu MVC posiadająca takie rozwiazania jak: widok layout’owy, komponentowy, częściowy itp. To wszystko od dawna już jest, doskonale udokumentowane, stabilne i gotowe na każde zastosowanie. Polecam przejście “kalendarza adwentowego” - 24 części samouczka, opisujących jak w Symfony zbudować aplikację web2.0.

Idąc więc z nurtem słów, często wypowiadanych przez mego przyjaciela: “podróże kształcą”, polecam serdecznie zapoznanie się z w/w frameworkiem. Można nabrać cennego dystansu do różnego rodzaju rozwiązań (lub ich brak), znajdujących się w naszym “upatrzonym” Zend Framework’u.



14/02/2008

Walentynkowy dzień programisty w pracy

Opublikowane jako: Off topic — Tags: , — Kubek Bartosz @ 15:21

Na rozluźnienie, oto wycinek z chata firmowego z dnia dzisiejszego. Szczególna dziś pamięć o naszych Paniach nie pozwala całkowicie oddać się pracy :
[14:11:05] Bartosz napisał(a): bu!
[14:11:23] Robert napisał(a): co za bu??
[14:11:43] Bartosz napisał(a): takie typu “łu!”
[14:11:58] Łukasz napisał(a): brakuje m w bu
[14:12:04] Łukasz napisał(a): i p w Łu
[14:12:06] Robert napisał(a): nudzi ci sie? ;)
[14:12:14] Łukasz napisał(a): :)
[14:12:17] Kubek napisał(a): :)
[14:12:22] Robert napisał(a): znajdz sobie jakies zajecie :P
[14:12:35] Robert napisał(a): bo chyba programowanie ci dzis zaszkodzilo :P
[14:12:46] Łukasz napisał(a): właśnie porównuję nową dokumentację
[14:12:52] Bartosz napisał(a): ?
[14:12:58] Łukasz napisał(a): i szukam roznic
[14:13:00] Łukasz napisał(a): :)
[14:13:06] Robert napisał(a): kolejny ktoremu sie nudzi ;)
[14:13:07] Bartosz napisał(a): aaaa… nice!
[14:13:20] Bartosz napisał(a): ile trzeba znaleźć by wygrać?
[14:13:35] Robert napisał(a): !@#$%)_+*&@



02/01/2008

Porządki noworoczne - aktualizacja samouczków do Zend Framework 1.0.3

Opublikowane jako: Zend — Tags: , , — Kubek Bartosz @ 22:16

Rzecz najważniejsza - Życzenia Wszystkiego Najlepszego w Nowym 2008 Roku dla wszystkich moich szanownych Czytelników! Niech Nowy Rok przyniesie Wam masę nowych i eskcytujących doświadczeń w dziedzinie programowania.

Wraz z nowym rokiem, warto bym przekazał wyrazy wdzięczności wszystkim czytelnikom, którzy do końca ubiegłego roku odwiedzili stronę tego bloga ponad 24 000 razy, a samouczki Zend Framework Tutorial czytali ponad 15 000 razy przez okres dokładnie ostatniego pół roku - odkąd strona ta istnieje. Przez czas ten także, witryna ta zdobyła czwarty poziom rangi PageRank w indeksie stron Google - a to sporo ! Więc serdeczne podziękowania dla wszystkich czytelników - po raz kolejny!

Gdy tylko wyszła kolejna odsłona Zend Framework, doszły mnie informacje, iż kody źródłowe z samouczków nie chcą działać prawidłowo z najnowszą wersją bibliotek Zend’a. Dlatego też w dniu dzisiejszym opublikowałem aktualizację wszystkich trzech części Zend Framework Tutorial.

Dla osób, które będą doszukować się bezpośrednio różnic jakie muszą wykonać w swoim kodzie, streszczę listę zmian jakie nanieść należy w odpowiednich miejscach.

Zend Framework Tutorial - Pierwsze kroki z Zend Framework - nie wymaga żadnych zmian! Wystarczy podmienić zawartość katalogu /library/Zend/ na tę z najnowszej wersji.

Zend Framework Tutorial - Rozwijanie aplikacji - po podmianie bibliotek w katalogu /library/Zend/, należy jeszcze zająć się użyciem nowo dodanej funkcji w Zend_Loader’ze.

Odszukajmy następujące miejsce w bootstraper’ze:

plik: public/index.php

   ...
   //If class not found instanciate it automatically
   require_once 'Zend/Loader.php';
   function __autoload($class)   {
      Zend_Loader::loadClass($class);
   }

i zastąpmy ten kawałek kodu następującym:

   ...
   //If class not found instanciate it automatically
   require_once 'Zend/Loader.php';
   Zend_Loader::registerAutoload();

Jest to jedyna zmiana wymagana by poprawnie uruchomić aplikację testową

Zend Framework Tutorial - Rozwijanie Zend View - Zend Layout - W tym przypadku wystarczy zastosować identyczną zmianę z Zend_Loader::registerAutoload() co we wcześniejszym wystąpieniu. Proszę jednak zwrócić szczególną uwagę, by podczas podmieniania bibliotek z katalogu /library/Zend/, pamiętać o tym by przywrócić (z powrotem skopiować do tej samej lokalizacji) dodatkowe biblioteki Zend_Layout, o których mowa w III części tutorial’a.

Dziękuję wszystkim za bieżące wsparcie w utrzymywaniu kodów tutorial’i w dobrej kondycji, poprzez zgłaszanie wszelkich błędów. Pozdrawiam.



20/12/2007

Zend Framework Tutorial - Rozwijanie Zend View - Zend Layout - nowy artykuł

Opublikowane jako: Zend — Tags: , , — Kubek Bartosz @ 00:34

Sporo czasu minęło odkąd po ukończeniu drugiej części ZendFramework Tutorial, miałem zamysł napisania części trzeciej. Plany były o tyle poważne, że przygotowałem od razu kod źródłowy, wokół którego powstać miał kolejny artykuł. Była jednak rzecz pewna, która nie dawała mi spokoju, nie pozwalała zacząć opisywać przygotowanego materiału, a była nią niedostateczna wiedza nt. szerokiego spektrum możliwości jakie można wycisnąć z abstrakcji oferowanej przez Zend View. Inaczej mówiąc, byłem świadom iż dalsze studiowanie przypadków użycia różnych wzorców projektowych w obszarze Widoków, może przynieść nowe wnioski, które mogły by przynieść potrzebę zmiany podejścia do opisania przygotowanego już materiału. I tak też się stało. Widoki częściowe („Partial View”), wzorzec Widoku Kompozytowego ( „Composite View”), „Two Way View”, „Layout View”, elementy rezerwujące miejsce w widoku („placeholders”) - to terminy, które kryją za sobą sporą ilość teorii. Poznanie i przyswojenie jej jest najlepszą drogą do utarcia sobie własnego zdania na temat najlepszego zastosowania konsensusu tej wiedzy w praktyce.

Z własnych więc doświadczeń i wniosków, wypracowałem model Widoku, dla Zend Framework, wykorzystujący wzorzec Layout View wraz z Composite View i jego pomocnikami. Model ten oparłem o biblioteki stworzone głównie przez pewnych dwóch wybitnych programistów: Pádraic’a Brady oraz Matt’a Weier’a O’Phinney. Ich prace w tej dziedzinie mają wielką szansę wejść na stałe do bibliotek Zend Framework. Póki jednak ich tam nie ma, a potrzeba pracy z dobrze zorganizowanym komponentem Widoku struktury MVC nadal istnieje, skorzystałem z ich kodu. Kod ten wymagał jednak kilku poprawek oraz przystosowania do pracy z najnowszą na dzień pisania artykułu wersją Zend Framework, tj. 1.0.2 – co uczyniłem i mam zamiar opisać.

Efektem jest zestaw bibliotek, które chciałbym przedstawić dzieląc temat na dwie artykuły: Zend_Layout oraz rozszerzenie Zend_View („widoki kompozytowe”). Podział ten ma o tyle sens, że zastosowanie pierwszego nie wymusza istnienia drugiego. I odwrotnie.

W miejscu tym zaznaczyć jednak chciałbym, iż wszelkie prawa do odpowiednich bibliotek należą do ich autorów. Z własnej strony dla celów naukowych i nie komercyjnych poddaję je modyfikacjom by móc je zaprezentować możliwe przypadki ich użycia.

Szczegółowe informacje na ich temat można uzyskać na stronach autorów:
* Pádraic Brady: http://blog.astrumfutura.com/
* Matthew Weier O’Phinney: http://weierophinney.net/matthew/
oraz na Zend Framework Wiki :
* Zend_Layout Component Proposal
* Zend_View Enhanced Component Proposal

Chcę także wyjaśnić, iż celem mych artykułów nie będzie wprowadzenie w teoretyczne podstawy zastosowanych w artykułach wzorców projektowych, lecz przybliżenie esencji i okazanie ich możliwości w praktyce.

Dzięki zastosowaniu rozdziału na dwa artykuły, mogę pozwolić sobie także na wprowadzenie trzeciego, który zaplanowany był pierwotnie jako właśnie trzecia część serii Zend Framework Tutorial pt: „implementacja Smarty”. Uwzględniają jednak powyższe, zajmę się tym tematem nie od razu.

Tyle słowem wstępu. Zapraszam więc do lektury pierwszego z serii artykułu, pt :
Zend Framework Tutorial – Rozwijanie Zend View - Zend Layout”.

PS: W międzyczasie pisania artykułu, pojawiłą się kolejna odsłona Zend Framework w wersji 1.0.3. W świątecznym międzyczasie postaram się zaktualizować istniejące kolejne części serii Zend Framework Tutorial by były kompatybilne z najnowszą odsłoną frameworka.



Newer Posts »

Oparte na WordPress