PHP Storm – w poszukiwaniu optymalnego środowiska programistycznego

Ekran uruchamiania PHP Storm

Jest to pierwszy artykuł z serii „W poszukiwaniu optymalnego środowiska programistycznego„, w którym postaram się odpowiedzieć na pytanie czy istnieje IDE, które nie przeszkadza w codziennej pracy programisty i upraszcza najczęściej wykonywane operacje. Przeprowadzane testy polegały na pracy przez około 5 dni roboczych, w wybranym programie, nad tym samym projektem w celu zmarginalizowania przyzwyczajenia do mojego obecnego zintegrowanego środowiska programistycznego – Eclipse. Projekt składał się z kilku tysięcy linii kodu. Komputer na jakim pracowałem to 3 GB RAM, Intel Core 2 Duo T5500 i Windows 7 (Opcjonalne Mac OS X ale to w kwestii zrzutów ekranu z PHP Storm).

PHP Storm – zintegrowane środowisko programistyczne

Czym ma być PHP Storm, najlepiej mówią twórcy:

PhpStorm is a lightweight and smart PHP IDE focused on developer productivity that deeply understands your code, provides smart code completion, quick navigation and on-the-fly error checking. It is always ready to help you shape your code, run unit-tests or provide visual debugging.

Przekładając na język Polski:

PHP Storm to lekkie i mądre IDE dla PHP koncentrujące się na produktywności i zrozumieniu pisanego kodu. Oferuje podpowiadanie składni, szybką nawigację i sprawdzenie w locie błędów składni. Umożliwia szybkie udostępnianie kodu, testowanie kodu i wizualne debugowanie.

W tym artylule postaram się sprawdzić ile jest w tym prawdy. Zapraszam do lektury.

Tworzenie nowego projektu w PHP Storm

Pierwszym krokiem zaraz po instalacji IDE, która przebiegła bezproblemowo, było stworzenie nowego projektu. Operacja ograniczyła się do wybrania katalogu z projektem i poczekania kilku sekund aż IDE za-indeksuje pliki. Już na tym etapie, byłem pod wrażeniem szybkości i łatwości tej operacji (w Eclipse stworzenie projektu wymagało skorzystania z wizzardu i kilku kliknięć dalej, lecz też nie można powiedzieć że było to skomplikowane ale na pewno indeksowanie plików jest bardziej czasochłonne).

Ciekawym elementem jest to że podczas indeksacji mogłem pracować w projekcie praktycznie bez przeszkód. Jedynymi ograniczeniami był brak możliwości podpowiadania składni i wyszukiwania (Naturalnie w Eclipse też można pracować w trakcie indeksacji jednak to bardziej przypomina szarpankę niż pracę – subiektywne odczucie)

Po zindeksowaniu projektu przez PHP Storm zużycie pamięci było o ~250 MB mniejsze niż w przypadku Eclipse. Eclipse na starcie projektu potrzebuje ok ~550MB. Jest to ogromny plus dla PHP Storm, tym bardziej że w trakcie kilku godzinnej pracy ta wartość wzrasta dla tych IDE o kolejne ~200MB.

Kolejnym ważnym elementem jest automatyczne wykrywanie systemu kontroli wersji w projekcie, ale to nie jest wszystko jeżeli chodzi  o ten element. Integracja IDE z systemem kontroli wersji jest dużo bardziej dopracowana niż miałem okazję to spotkać w Eclipse. Na starcie dostajemy bardzo dopracowane moduły podglądu zmian. Selektywnego commit-owania. Automatycznie tworzenie change-logu i dużo dużo więcej.

Okno commiit-owania zmian

Przygotowanie PHP Storm do pracy

Kolejnym krokiem jest zapoznanie się z skrótami klawiszowymi. Tutaj bez zaskoczeń, „klawiszo-logia” w PHP Storm pokrywa się z Eclipse w pięciu procentach (np. zapisz, otwórz itp. ;) ). Na szczęście IDE umożliwia zmianę schematu klawiszy do wyboru mamy takie zestawy jak Eclipse, Emacs, NetBeans itp. Praktycznie po tej operacji poczułem się jak w domu.

Menu wyboru zestawu skrótów klawiaturowych w PHP Storm

Dodatkowo można skonfigurować IDE do pracy z bazą danych, GitHub’em, Debugerem. Standardem kwestii personalizacji IDE jest zachowania tabulatora, wklejania bloków kodu (inteligentne wcięcia), kolorystyki i setki innych elementów. Wszystko intuicyjnie i bezproblemowo.

Nawigacja w PHP Storm

Na tym etapie można dostrzec bardzo dopracowany mechanizm nawigacji po plikach w projekcie. Posiadamy takie elementy jak panel boczny z drzewem plików w projekcie ale również breadcrumbsy, które bardzo upraszczają nawigację. Praca na kilkunastu plikach rozrzuconych w modelu MVC i odszukiwanie ich w nawigatorze nie jest tak wygodna jak nawigacja w breadcrumbs, która trzyma kontekst aktywnie edytowanego pliku i szybko można przeskoczyć do pliku sąsiedniego.

Nawigacja breadcrumbs w PHP Storm

Nawigacja breadcrumbs w PHP Storm

Nie są to jedyne metody nawigacji, moimi ulubionymi sposobami, z których korzystam w codziennej pracy z Eclipse, a które też oferuje PHP Storm jest „przejdź do” typu, metody, pliku; przeskakiwania wstecz i wprzód do kolejnych edytowanych sekcji w kodzie oraz przeskakiwanie do definicji metody, klasy, funkcji poprzez najechanie na wykorzystywaną metodę kursorem myszki i naciśnięcie Ctrl+LMB lub podania nazwy w panelu pojawiającym się po naciśnięciu odpowiednich kombinacji klawiszy.

Programowanie w PHP Storm

Programowanie w PHP Storm jest jak najbardziej efektywne przez dużą ilość generatorów kodu i rewelacyjne szybkie podpowiadanie składni. Zwolennicy TDD poczują się jak w raju. Dla przykładu gdy tworzysz zmienną klasową i wciśniemy kombinację Ctrl+Alt+G wywołany zostanie panel z opcjami generowania kodu a wśród nich, generowanie setterów i getterów, implementacja metod interfejsu, nadpisywanie metod klasy głównej itp.

Panel wyboru opcji generowania kodu w PHP Storm

Panel wyboru opcji generowania kodu w PHP Storm

Dodatkowo odwołując się do zmiennej lub metody, która jeszcze nie istnieje PHP Storm pozwala ją bardzo szybko wygenerować.

Generowanie kodu dla nie istniejących metod

Generowanie kodu dla nie istniejących metod

Bardzo fajną rzeczą jest możliwość samodzielnego definiowania typu zmiennej w kodzie przez prosty komentarz /** @var $element Zend_Form_Element */, dzięki czemu możemy korzystać z podpowiadania składni w każdym miejscu:

Definiowanie typów zmiennych w PHP Storm

Definiowanie typów zmiennych w PHP Storm

Kolorowanie składni i rozpoznawanie błędów w PHP Storm

Teoretycznie prozaicznie prosty element jak kolorowanie składni, po którym nie spodziewałem się niczego nowego, zyskał nowe funkcjonalności poprawiające jakość i bezbłędność pisanego kodu. Teraz nie wykorzystywane nigdzie w kodzie zmienne są oznaczone kolorem szarym, nie zdeklarowane zmienne są podkreślone na czerwono a funkcja, która nie istnieje ma delikatnie żółte tło. Wychwytywanie błędów – natychmiastowe.

Rozpoznawanie błędów w locie w PHP Storm

Rozpoznawanie błędów w locie w PHP Storm

Praca z bazą danych w PHP Storm

Praca z bazą danych w PHP Storm

Ale to nie wszystkie nowości w inteligentnej składni. Tworząc zmienne i przypisując im kod SQL czy HTML, PHP Storm sam wykryje jaki jest to rodzaj składni i oprócz pokolorowania jej umożliwi wykorzystywanie w jej obrębie podpowiadania składni – co według mnie jest genialne.

Rozpoznawanie składni w zmiennych w PHP Storm

Rozpoznawanie składni w zmiennych w PHP Storm

Podsumowanie

Osobiście PHP Storm zrobił dla mnie bardzo dobre wrażenie. Szereg funkcji i niuansów poprawiających komfort i efektywność pracy jest powalająca. Nie spotkałem się jeszcze z tak dopracowanym i kompletnym IDE.

Głównymi funkcjami, które uważam za najlepsze z jakimi miałem do czynienie dotychczas w pracy z IDE to:
  • szybkość działania IDE po kilkugodzinnej pracy jest bardzo dobra
  • nawigacja po kodzie jest bardzo szybka i sprawna
  • inteligentne podpowiadanie i kolorowanie składni
PHP Storm pomimo całej wspaniałości nie jest też bez drobnych wad. Oto niektóre z nich:
  • gdy piszemy aplikację w PHP 5.3 i wykorzystujemy przestrzenie nazw, tutaj często podpowiadanie kodu nie zadziała – trzeba deklarować ręcznie typy zmiennych.
  • ilość jednocześnie otwartych zakładek z plikami jest ograniczona do ok 20 kart
  • w jednym oknie edytora możemy mieć otwarty tylko jeden projekt, otwarcie kilku projektów to otwarcie nowego okna edytora

Zachęcam wszystkich programistów do przeprowadzenia prostego eksperymentu i samemu odpowiedzenia sobie czy zmiana IDE na PHP Storm jest warta świeczki.

P.S. W powyższym artykule przedstawiłem tylko część funkcjonalności, z których korzystałem w trakcie pracy i nie wątpię że kruczków i smaczków wspomagających codzienną pracę jest dużo więcej.

Zend Framework 2 na horyzoncie

Okładka magazynu Imagine z moim artykułem Zend Framework 2 na Horyzoncie

Pod powyższym tytułem został opublikowany artykuł w najnowszym magazynie Imagine.
Magazyn jest wydawany przez Empathy i można się z nim zapoznać całkowicie za darmo online:
http://issuu.com/imaginemagazine/docs/imagine_no2

Artykuł powstał dwa miesiące temu, ale z dzisiejszego punktu widzenia mogę powiedzieć że kierunek rozwoju Zend Framework 2 trzyma się planu. Zagłębiając się bardziej w jego temacie napisałem pierwszą aplikację na FB właśnie przy użyciu ZD2 i Doctrine2.
Mogę powiedzieć że z punktu widzenia programisty jest dużo nowych rzeczy do nauki. ZF2 zmienia sposób pisania aplikacji internetowych. Ale na ten temat na pewno jeszcze napiszę jeszcze kilka słów :)

Jako że w magazynie artykuł ukazał się w wersji skróconej, umieszczam go poniżej w pełnej wersji.
Życzę smacznego!

Wstęp

Deweloperzy pracujący nad rozwojem framework’a postawili duży nacisk na to by produkt, który tworzą, był bardziej spójny, dobrze udokumentowany, zwiększający produktywność i szybkość uruchamiania aplikacji. Artykuł opisuje dlaczego i w jaki sposób developerzy chcą zrealizować postawione przez siebie cele. Do pełnego zrozumienia będzie potrzebna podstawowa znajomość pierwszej wersji Zend Framework, wzorców projektowych i PHP 5.3.

Prosty i szybki proces nauki

Pierwszy krok jest najtrudniejszy, to stwierdzenie, dokładnie oddaje najczęściej napotykany problem, przez rozpoczynających przygodę z pierwszą wersją framework’a, programistów. Pomimo dobrej dokumentacji i dopracowania rozdziału „Quick Start”, programista napotyka na dodatkowe problemy związane z rozwojem aplikacji:

  • Spójność. Dokumentacja opisuje jak korzystać z poszczególnych komponentów takich jak Zend_Cache, Zend_Translate, Zend_Form, itd. ale brakuje kompletnego przykładu, pokazującego jak połączyć istniejące komponenty, w bardziej złożonej i dynamicznie rozszerzanej o nowe funkcjonalności aplikacji.

  • Niekonsekwencja API. Pierwsza wersja framework’a zawiera hepler’y, plugin’y i filtry, niektóre z nich posiadają spójny interfejs a pozostałe już nie. Cześć z nich posiada niejawne metody tworzone poprzez __call(), które trudniej jest znaleźć w kodzie. Część z komponentów pozwala na konfigurację poprzez przekazanie array lub obiektu Zend_Config natomiast pozostałe wyłącznie array. Niektóre komponenty pozwalają na konfigurację camelCaseOption natomiast inne na underscore_separated.

Rozwiązanie, które deweloperzy zaproponowali jako remedium na powyższe problemy można przedstawić w kilku zwięzłych punktach:

  • Stworzenie podręcznika demonstrującego kompletny cykl tworzenia aplikacji internetowej w ZF2.

  • Udokumentowanie i przedstawienie wszystkich przypadku użycia dla każdego z komponentów

  • Ujednolicenie interfejsów w całym obszarze framework’a, które nie tylko ułatwi proces nauki ale także zwiększy produktywność programisty poprzez eliminację dezorientacji wynikającej z niekonsekwencji w API.

  • Standaryzacja mechanizmu konfiguracji – stworzenie nowego komponentu, który będzie odpowiedzialny przekazywanie i walidację danych.

  • Przygotowanie sandbox ZF2, który umożliwia błyskawiczny start z framework’iem.

Prostota w rozszerzaniu

Główną zaletą Zend Framework jest jego możliwość rozszerzania, przez dewelopera, o nowe komponenty czy funkcjonalności. Jednak mimo tego że w pierwszej wersji framework’a jest to relatywnie proste to istnieje kilka kluczowych przypadków, dla których taka możliwość jest bardzo utrudniona:

  1. Wykorzystanie Singleton’ów w wielu miejscach w aplikacji, bardzo komplikuje lub wręcz uniemożliwia rozszerzenie lub podmianę funkcjonalności. Przykładami takich komponentów to Zend_Controller_Front, Zend_Auth, Zend_Session.

  2. Częste użycie klas abstrakcyjnych zamiast interfejsów, powoduje rozszerzanie lub podmianę komponentów znacznie trudniejszym. Część z klas abstrakcyjnych jest już bardzo bogata w elementy, które w nowej funkcjonalności nie potrzebujemy, w konsekwencji podmieniony kod posiada dużą ilością zbędnych metod.

  3. Twarde zależności uniemożliwiają w wielu miejscach rozdzielenie funkcjonalności  lub jej podmianę na nową. Najlepszym przykładem jest Zend_View, który jest nierozłącznym składnikiem wielu komponentów np.: Zend_Controllerze_Action, Zend_Form przez co próba skorzystania z Smarty lub OPT zamiast standardowego systemu szablonów jest bardzo utrudniona.

  4. Brak możliwości rozszerzenia elementów, z których użytkownik mógłby wynieść wiele korzyści. Idealnym przykładem jest Zend_Db, który gdyby oferował możliwość rozszerzania o plugin’y mógłby zaoszczędzić pracy przy tworzeniu struktur drzewiastych, cachowania itp. a dodatkowo kod byłby wielokrotnego użytku.

Podstawowy plan działań jaki został obrany przez deweloperów by rozwiązać powyższe problemy, można streścić w kilku punktach:

  • Identyfikacja kluczowych interfejsów dla komponentów i typowanie/żutowanie do nich zamiast do klas abstrakcyjnych.

  • Usunięcie singletonów gdzie tylko jest to możliwe, natomiast jeżeli nie jest to możliwe przenieść zachowanie do obiektów współpracujących (collaborating objects)

  • Usunięcie twardych zależności na rzecz DI

  • Określenie komponentów, które powinny pozwalać na rozszerzalność i współpracę z innymi obiektami.

Poprawiona wydajność

Szybkość działania pierwszej wersji framework’a, zachwycała tylko na początku (do wydania 1.5) a z każdą jego kolejną odsłoną szybkość stopniowo spadała. Developerzy, podejmując pracę nad drugą wersją framework’a, określili sobie za cel poprawę wydajności rzędu 200-300%.

Jako że jest już dostępne do testowania developerskie wydanie ZF2 to można stwierdzić iż separacja zależności i wykorzystanie na szeroką skalę dependency injection oraz lazy load przynosi spodziewane korzyści, ale to nie wszystko. Całkowicie został przebudowana modułowość i MVC. Teraz moduł jest elementem niezależnym od MVC. Moduł może korzystać z MVC i definiować własny bootstrap, routing i konfigurację. W dużych i różnorodnych projektach takie podejście do problemu może mieć ogromny wpływ na poprawę wydajności gdyż moduł będzie ładował tylko to co jest konieczne dla jego prawidłowego działania.

Kolejnym etapem w poprawie wydajności jest pomoc programiście w zdobyciu informacji o dobrych praktykach optymalizacyjnych. Developerzy chcą to osiągnąć poprzez stworzenie odpowiedniego działu w dokumentacji.

Rozwój i utrzymanie

Rosnąca popularność ZF niesie za sobą ogromną ilość zmian i nowych komponentów. Na chwilę obecną projekt składa się z 2 milionów linii kodu w tym 14 tysięcy linii testów jednostkowych. Nad jego rozwojem i spójnością czuwają trzy osoby z zespołu Zend’a i ogromna ilość programistów z całego świata zaangażowana w jego rozwój i tworząca nowe komponenty.

Projekt o takiej skali wymaga odpowiedniego podejścia do rozwoju i utrzymania. Jednym z rozwiązań mającym pomóc w tym zadaniu jest przejście z centralizowanego systemu kontroli wersji na rozproszony system kontroli wersji – GIT – jest on znany developerom, zapewnia możliwość weryfikacji i identyfikowania programistów współpracujących nad kodem, umożliwi łatwe łatanie i łączenie zmian dzięki czemu jest bardziej skutecznym narzędziem w prowadzeniu i utrzymywaniu projektu.

Kolejnym aspektem rozwoju jest integracja z projektami firm trzecich. Do tej pory taka integracja była nie lada wyzwaniem (wprowadzenie Zend_Application uprościło ten proces). Teraz developerzy zamierzają jasno i klarowne określić w jaki sposób biblioteki powinny być integrowane z ZF2 co zapewni dostęp do bardziej wszechstronnych rozwiązań dla użytkownika bez nakładu dodatkowej pracy.

Wzór wykorzystania PHP 5.3

PHP 5.3 wnosi do języka wiele nowości: przestrzenie nazw, funkcje anonimowe, late static binding, goto itd. dlatego jak najbardziej zrozumiałym jest podejście developerów do wykorzystania tego potencjału.

Można wyróżnić następujące etapy, które zostaną uwzględnione podczas re-factoringu kodu źródłowego framework’a:

  • Migracja na przestrzenie nazw w celu zniwelowania kolizji w nazewnictwie z bibliotekami firm trzecich jak i kodu prywatnego użytkownika.

  • Usunięcie wszystkich wywołań create_funciton() i zastąpienie go funkcjami anonimowymi.

  • Identyfikacja kodu, który może skorzystać z nowości w PHP 5.3

Podsumowanie

Pierwsze szkice planu rozwoju drugiej odsłony framework’a jasno wskazywały że będziemy mieli do czynienia z ewolucją ukierunkowaną na wykorzystanie nowych możliwości PHP 5.3, aktualizację dokumentacji, poprawienie wydajności. Jednak z czasem obraz ten nabiera coraz to większej ostrości.Obecnie, mimo że mamy do czynienia jeszcze z wydaniem alpha, to projekt w implementacji jest na tyle rewolucyjny w porównaniu do poprzedniej wersji framework’a że przez moment zastanawiałem się czy nie było by stosownym zmienić jego nazwę. Osobiście podoba mi się kierunek rozwoju i z niecierpliwością czekam na pierwszą betę, która ma zostać wydana pomiędzy 17-20 października podczas trwania ZendCon 2011. Zachęcam wszystkich zainteresowanych programistów PHP do śledzenia projektu na github oraz uczestnictwa grupie dyskusyjnej.

Słownik:

  • ZF – Zend Frameork

  • DI – Dependency Injection

  • MVC – Model View Controller

Linki:

Zaktualizowałem wiki o kilka ciekawych działów

Dzisiaj zabrałem się za porządkowanie mojej wiki, która jest dla mnie najlepszym sposób kolekcjonowania informacji.
Wiki znajdziecie pod adresem wiki.widmogrod.info.

Tak „biblioteka wiedzy” wzbogaciła się m.in. w:

Jak by ktoś z was był zainteresowany różnego rodzaju dodatkowymi informacjami o Cappuccino Framework i społeczności wokuł niego to zapraszam do działu Szkice i różne materiały dodatkowe o Cappuccino Framework.

Z działu programowanie najbardziej podoba mi się ciekawy wzorzec projektowy Circuit Breaker.
Umieściłem w tym dziale link do artykułu, który zawiera  POC implementacji go w Zend Framework.

Natomiast w dziale JavaScript podoba mi się nowy język programowania, który jest kompilowany do JavaScript – CoffeeScript.

To tyle, pozdrawiam!

DataGrid w PHP – KrakSpot TECH #3

Moja pierwsza prezentacja na KrakSpotTECH, przed tak dużą publiką (ok 200 osób na sali). Dużo się nauczyłem a szczególnie to że jeżeli nie czujesz stresu to nie znaczy że go nie ma :)

Temat mojej prezentacji dotyczył zagadnienia DataGrid w PHP.
Dla zainteresowanych umieszczam poniżej prezentację:

Buzz:
- http://krakspot.pl/2011/02/01/krakspot-tech-3-agenda/

Konfigurowanie socket’u MySQL w PHP5 po instalacji via MacPorts

Nie opiszę całości instalacji gdyż już w wielu źródłach jest opisana szczegółowo. Przedstawię tylko szybkie rozwiązanie problemu, który mnie nawiedził już po procesie instalacji.

Po zainstalowaniu MySQL, utworzeniu bazy danych, przypisaniu uprawnień i skonfigurowaniu pierwszego połączenia w PHP – może Cię spotkać ot taki komunikat:

Warning: PDO::__construct() [pdo.--construct]:
[2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in

Rozwiązaniem jest uzupełnienie odpowiedniej sekcji w php.ini.
MacPort’s zapisują php.ini w katalogu: /opt/local/etc/php5/php.ini
Otwieramy go dowolnym edytorem i odszukujemy sekcję pdo_mysql.default_socket

W moim przypadku ta sekcja była pusta. Teraz wystarczy wskazać socket zainstalowanej lokalnie BD.
W moim przypadku:

pdo_mysql.default_socket=/opt/local/var/run/mysql5/mysqld.sock

Można sprawdzić jaka jest lokalizacja soketu, wykonując polecenie w termianlu:

mysql5 -u root -p test

… i odszukaniu fragmentu zaczynającego się od UNIX socket.

Teraz tylko – zapisz plik, zrestartuj serwer i gotowe ;)

Jeden błąd mniej! można iść dalej :)

Zend Framework DataGrid – „Out of the box”

Niezależnie od rodzaju, wielkości i skomplikowania aplikacji internetowej można wyróżnić w niej kilka podstawowych (prawie zawsze występujących) elementów; autoryzacja, model, prezentacja danych, itp.

Przykład wyglądu i zastosowania KontorX_DataGrid

KontorX_DataGrid

Ten wpis chciałbym poświęcić bardzo powszechnemu elementowi – prezentacji, a dokładniej prezentacji danych tabelarycznych z j.ang. „data grid”. Notorycznie napotykamy ten element w prawie każdym panelu administracyjnym. Przybiera on różne formy w zależności od postawionych wymagań. Można wyróżnić:

Formy prezentacji danych tabelarycznych

  • Podstawową – dane są prezentowane w tabeli HTML bez możliwości sortowania, filtrowania i stronicowania
  • Rozszerzoną - tabela z możliwościami stronicowania i filtrowania kolumn danych
  • Dedykowaną- rozwiązanie jest połączeniem w/w typów z elementami rozszeżającymi, np.:
    • tabelę z możliwościami eksportowania danych tabelarycznych do różnych formatów (csv, pdf, itp…)
    • spersonalizowany wygląd komórek danych w zależności od typu: data, godzina, waluta, url, grafika, ….
    • możliwość edycji danych w bezpośrednio w wierszu tabeli (inline editing)
    • prezentacja danych za pomocą biblioteki JavaScript (np. Ext.DataGrid i inne,… )

Rodzaje istniejących bibliotek poruszających ten problem

Natywne PHP:

JavaScript + PHP:

Powyższe biblioteki implementują mniej lub więcej form prezentacji danych. Każda z nich wymaga wykonania kilku „ruchów” by je skonfigurować ale czy można prościej?… Tak. Dlatego chciałbym w tym wpisie omówić bibliotekę – KontorX – jest to biblioteka, którą nieprzerwanie rozwijam od  prawie 3 lat. Bibliotekę KontorX zawiera w sobie wiele elementów a jednym z nich jest KontorX_DataGrid.

Czym jest biblioteka KontorX_DataGrid

Biblioteka umożliwia elastyczne prezentowanie danych tabelarycznych w dowolny sposób i prawie w dowolnej formie. Poniżej przedstawiam główne cechy biblioteki:

  • Adaptowanie danych różnych typów np. Doctrine, Zend_Db_Table, Zend_Db_Select, natywna tablica – array, …. (więcej w budowie :) )
  • Różnorodna forma prezentacji danych. Data_Grid prezentuje dane jako czysty HTML oraz dynamiczny widok ExtJS Grid. Biblioteka pozwala również na implementacje nowych sposobów prezentacji danych np. jako plików .csv, .xls, .pdf.
  • Integracja z Zend_Form.
  • Zbiór gotowych rozwiązań. Biblioteka posiada już zaimplementowane elementy odpowiedzialne za filtrowanie, grupowanie i stronicowanie danych.
  • Elastyczność i rozszerzalność poprzez dopisywanie plugin’ów.

Powyższy opis może nie wiele mówić dlatego zapraszam do przykładów demonstrujących, niektóre możliwości komponentu:
http://kontorx.widmogrod.info/#http://kontorx.widmogrod.info//KontorX/DataGrid/example1.php

DataGrid – „Out of the box”

Jeżeli korzystasz z ZF wystarczy że pobierzesz bibliotekę z Google Code umieścisz ją w include_path aplikacji i zaimplementujesz powyższy kod w kontrolerze wybranej akcji przekazując model danych (na chwilę obecną zaimplementowałem obsługę Zend_Db_Table, Zend_Db_Select, array).

Biblioteka posiada już zaimplementowany domyślny sposób prezentacji danych więc niczym nie musisz się martwić  (jedynie tabelę możesz ostylować w/g własnych upodobań :) )

Poniżej przedstawiam najszybszą drogę  do wy-renderowania prostej prezentacji danych tabelarycznych:

// prosty przykład
$dataGrid = KontorX_DataGrid::factory($dbTable);
$dataGrid->render();

Zainteresowanych źródłami zapraszam do strony projektu na Google Code: http://code.google.com/p/kontorx

System szablonów, który „sam dba” o aktualizację cache plików CSS i JavaScript

W dniu dzisiejszym postanowiłem zaimplementować pewną nowa funkcjonalność w systemie szablonów.

Dodana została możliwość sprawdzanie czasu modyfikacji pliku CSS i JavaScript. Czas ostatniej modyfikacji pliku jest teraz doklejany do nazwy pliku jako parametr GET.

Dla przykładu, nazwa pliku przed:

plik.css

i nazwa pliku po:

plik.css?s=123123123

Co dzięki temu zyskałem?

  • jestem zwolniony z ciągłego czyszczenia cache przeglądarki po dokonaniu zmian w plikach CSS lub JavaScript
  • zmiany wizualne i funkcjonalne na stronie są widoczne natychmiastowo po ich wprowadzeniu

Jaki to ma wpływ na wydajność?

Z przeprowadzonych testów wywoływanie funkcji filectime(); w pętli 100 razy trwało ~0.0001. W najgorszym z przypadków w projekcie wykorzystuję 10 plików CSS i 5 JavaScript, w których dokonuje zmian, zatem czas generowania strony wzrośnie niezauważalnie.

Jakie pomysły na przyszłość?

Jako że konfigurację szablonu przechowuję w zewnętrznym pliku konfiguracyjnym, daje mi to możliwość napisanie narzędzia, które będzie łączyć pliki CSS i JavaScript w jeden plik globalny. Zatem czas wczytywania strony WWW (w najgorszym z przypadków)  wzrośnie znacząco :) .

PS. Wiem że mogę w/w czynności mogę wykonywać ręcznie (i teraz tak robię) ale z odpowiednim skryptem jest o wiele szybciej i przyjemniej!

EDIT: Dzięki ^brand zmodyfikowałem testy o wywołanie funkcji clearstatcache() i wydajność delikatnie spadła ale nadal jest to poziom akceptowalny.

Zawijanie tekstu w Zend_Pdf

W dniu dzisiejszym pracowałem nad generowaniem plików PDF w swojej aplikacji. Wybrałem do tego celu Zend_Pdf dlatego że backend jest oparty na Zend Framework.

Współprace z tą biblioteką mogę ocenić na 4/6. Przyjemnie. Jednak brakuje w niej kilku kluczowych elementów jednym z nich jest możliwość zawijania długiego tekstu. W sposób natywny ZF nie ma zaimplementowanej takiej metody.

Poniżej przedstawiam prostą funkcję, która w szybki i sprawny sposób zawinie (przełamie) przekazany tekst po określonej długości znaków.

/**
* Zawin tekst po określonej długości znaków.
*
* @param Zend_Pdf_Page $page
* @param string $text
* @param int $x
* @param int $y
* @param int $width
* @param string $brake
* @param bool $cut
* @return void
*/
function drawTextWrap($page, $text, $x, $y, $width, $brake = "\n", $cut = true)
{
// przygotuj tekst
$text = wordwrap($text, $width, $brake, $cut);
$token = strtok($text, $brake);

$fontSize = $page->getStyle()->getFontSize();

// rysuje każdą linię tekstu niżej od poprzedniej
// o wysokośc (wielkość) czcionki
while (false !== $token)
{
$y -= $fontSize;

$page->drawText($token, $x, $y);

$token = strtok("\n");
};
}

Jeżeli ktoś pracował z Zend_Pdf to wytłumaczenie jak użyć w/w kawałek kodu jest zbyteczne. Pozdrawiam.