Zend Framework umożliwia specjalizację finalnego widoku(layoutu) dla każdej z akcji poprzez tzw. helpery("pomocniki") widoku. Jak to się dzieje odsyłam do podręcznika.
Wszystko działało idealnie do dnia gdy nadeszła chwila integracji stronki z Google Maps API.
W widoku akcji korzystam z wymiotnego w temacie pomocnika:
$this->headScript()
->appendFile('http://maps.google.com/maps?file=api&v=2&key='.$this->apiKey);
nagłówek strony produkuje mi coś takiego:
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAnCqO9l1WMOgTCJlg9kVlMRREqxHjot-MVdGv4W7rNtdAWxNh4hS2-gRBnLrWFzhAC8SpBzYmGVYZgA" type="text/javascript"/>
a powinien
<script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAAnCqO9l1WMOgTCJlg9kVlMRREqxHjot-MVdGv4W7rNtdAWxNh4hS2-gRBnLrWFzhAC8SpBzYmGVYZgA" type="text/javascript"></script>
jak łatwo zauważyć problem leży w & -> &.
Inicjowanie map googla tej zmiany nie lubi. Problem tkwi w funkcji htmlspecialchars, użytej w Zend_View_Helper_HeadScript::append() itd.
Żeby nie ingerować w kod w/w klasy można zastosować funkcję htmlspecialchars_decode w szablonie w następujący sposób...
// & -> & becouse gmaps crash!
print htmlspecialchars_decode($this->headScript());
.. i wszystko działa, tak jak powinno od samego początku.
(Zastanawiam się czy ZF nie jest aż nad to ostrożny w wszystkim [ma to plusy .. i minusy])
Pozdrawiam.
środa, 12 listopada 2008
Zend_View_Helper_HeadScript->appendFile() psuje integrację z Google Maps API
piątek, 17 października 2008
Eclipse Ganymede + PDT2.0 na ubuntu 64bit
PHP Development Tools w wersji 2.0 ujrzy światło dzienne 29 grudnia 2008 roku, ale to mi nie przeszkadza by pracować na wersji rozwojowej (:.
Poniżej przedstawiam przetłumaczony poradnik instalacji PDT2.0 na najnowszej wersji mojego ulubionego IDE Eclipse.
Pobieramy i rozpakowujemy Eclipse IDE for Java EE Developers (162 MB) do wybranego katalogu.
Do pełni szczęścia brakuje nam jeszcze trzech paczek.
- DLTK (Integration) link bezpośredni do paczki
- PDT2.0 (2.0.0 Integration Builds) link bezpośredni
- WTP (tą paczkę sugeruję pominąć, bo w Java EE już jest!)
- Help > Software Updates... > Available Software
- Add Site... > Local > dodajemy katalog rozpakowanego pakietu DLTK
- Add Site... > Local > dodajemy katalog rozpakowanego pakietu PDT2.0
- Add Site... > Local > dodajemy katalog rozpakowanego pakietu WTP
- Gdy odświeżenie listy pakietów nie wykona się automatycznie - wciskamy "Refresh"
- Zaznaczamy pakiet the "Dynamic Languages Toolkit - Core Frameworks .."
- Zaznaczamy pakiet "PDT Feature"
- Zaznaczamy "WTP Feature" (jeżeli jeszcze nie jest jest zainstalowany)
- Klikamy "Install"
Uwaga na koniec, w Eclipse Ganymede w okienku "Software Updates" jest możliwość wpisywania nazw pakietów należy w tym polu wpisywać pełne nazwy pakietów do instalacji a nie ich akronimy tj. zamiast DLTK należy wpisać Dynamic Languages Toolkit
piątek, 19 września 2008
Eclipse SVN vs. NetBeans SVN
Kilka projektów WWW na głowie, przeskakiwanie z jednego do drugiego i kontrolowanie zmian wprowadzonych w każdym z nich.
Nic prostego SVN!
Google umożliwia hosting SVN OpenSource'owych projektów.
W utrzymaniu wszystkiego pod kontrolą pomoże nam NetBeans 6.5 z wsparciem dla PHP lub plugin do Eclipse Subversive.
Pomijam proces instalacji SVN na komputerze i inne programy wspierające jak np. RapidSVN gdyż zależy mi wyłącznie na integracji SVN z IDE.
NetBeans 6.5 jest w wersji deweloperskiej ale obsługa SVN jest nadzwyczajnie przyjemna!
- automatyczne wykrywanie katalogów SVN w projekcie i oznaczanie odpowiednią wizualizacją zakładek, plików, katalogów
kolory- zielony - nowy plik
- niebieski - plik zmodyfikowany różny od wersji SVN
- wizualizacja katalogów podpiętych pod SVN
Jak można zuwazyć na załączonym obrazku, nie koniecznie cały projekt (np.: "kontorx-cms") musi być podpięty do repozytorium SVN jako całość (np.: "widmogrod.info") jest możliwość wyselekcjonowania pojedynczego katalogu w projekcie (np. "KontorX" czy "application") poddanego kontroli wersji.
- szybka analiza zmian (można sprawdzić określoną gałąź projektu np.: wybrany plik lub katalog)
- wizualizacja różnic wersji lokalnej i na serwerze, IDEALNA!
Eclipse Subversive
- wizualizacja projektu jako SVN
W przeciwieństwie do NetBeans brak możliwości posiadania kilku oddzielnych repozytoriów SVN w jednym projekcie.
- Analiza zawartości zdalnego repozytorium SVN
- Nie znalazłem wizualizacji różnic pomiędzy wersją lokalną a serwerową
brak diff .. chyba że jestem ślepy ..
Głownem kryterium, na którym bazuje jest możliwość posiadania w projekcie kilku oddzielnych bibliotek, które są wsparte obsługa SVN.
Ponadto brak kontroli różnic lokalnych i zdalnych w Eclipse dyskwalifikuje je całkowicie.
Wygrywa NetBeans 6.5 z wczesnym wsparciem dla PHP!
Dla zainteresowanych konfiguracją Subversive na Eclipse źródła, z których korzystałem.
czwartek, 21 sierpnia 2008
Zend_View_Helper_Action jako aplet + Zend_View_Helper_Url = niespodzianka
Wykorzystując Zend_View_Helper_Action w layout-cie (jako aplet w layout)
$this->action('list','index','calendar', array('rowCount' => 5));
dostałem wyjątek
Zend_Controller_Router_Exception: module is not specified in ..
O co chodzi?
Na początku anializy myślałem że jest błąd w tym helperze i dispachowaniu akcji ale naszczęście się myliłem. Rozwiązanie problemu okazało się dużo bardziej trywialne jak i zaskakujące!
Wykorzystując pomocnik widoku Zend_View_Helper_Url w pliku widoku dla wywoływanej akcji (czyli list.phtml) nie można korzystać z "skróconej" wersji generowani url!
tj. zamiast
$this->url(array('action' => 'display','id' => $row->id),'frontend')
należy stosować pełny zapis
$this->url(array('module' => 'calendar','controller' => 'index','action' => 'display','id' => $row->id),'frontend')
EDIT:
Można stosować skróconą wersję pomocnika widoku dla akcji tylko 2gi parametr określający url w/w przykładzie nie może być 'frontend' tylko musi być domyślnym tj. musi zostać pominięty
dixi.
poniedziałek, 18 sierpnia 2008
mktime - w przyładach
Jak ugryźć funkcję php mktime?
W poniższych przykładach zmienna $time posiada postać.
$time = time();
Początek dnia
np.: 2008-08-18 00:00:00
$startDay = date('Y-m-d H:i:s', mktime(0,0,0,date('m', $time), date('d', $time), date('Y',$time)));
Koniec dnia
np.: 2008-08-18 00:00:00
$endDay = date('Y-m-d H:i:s', mktime(0,0,0,date('m', $time), date('d', $time)+1, date('Y',$time)));
Początek tygodnia
np.: 2008-08-18 00:00:00
$startWeek = date('Y-m-d H:i:s', mktime(0,0,0,date('m', $time), date('d', $time), date('Y',$time)));
Koniec tygodnia
np.: 2008-08-25 00:00:00
$endWeek = date('Y-m-d H:i:s', mktime(0,0,0,date('m', $time), date('d', $time)+1, date('Y',$time)));
Pierwszy dzień miesiąca
np.: 2008-08-01 00:00:00
$firstDayInMonth = date('Y-m-d H:i:s', mktime(0,0,0,date('m', $time), 1, date('Y',$time)));
Ostatni dzień miesiąca
np.: 2008-08-29 00:00:00
$lastDayInMonth = date('Y-m-d H:i:s', mktime(0,0,0,date('m', $time)+1, -1, date('Y',$time)));
Gdzie zastosować?
System statystyk. Wyłowienie z bazy danych rekordów z danego dnia, tygodnia, miesiąca.
SELECT * FROM stats WHERE time BETWEEN '$startDay' AND '$endDay'
Jedno pytanie mnie nurtuje. Czy 00:00:00 tj. północ - jest traktowana jako początek czy koniec dnia? wydaje mi się ze to jest ostatnia godzina danego dnia.
piątek, 1 sierpnia 2008
Backend - jak wygląda twoje zaplecze?
Na początku mojej przygody z PHP i tworzeniem paneli administracyjnych towarzyszył mi mały niedosyt. Zawsze byłem ciekaw jak wyglądają zaplecza, zarządzające, profesjonalne serwisy internetowe. Jakie rozwiązania stosują? w jakim stopniu są to rozwiązania innowacyjne a w jakim stare sprawdzone, użyteczne wzorce. Czy mój PA nie jest za skąpy czy zbyt lamerski.
Teraz mamy możliwość zaobserwowania jak prezentują się różnego rodzaju rozwiązania w wielu otwartych systemach zarządzania treścią. Weźmy pierwsze z brzegu
Teraz troszeczkę zmieniłem podejście do tworzenia backendów. Od czasu do czasu gdy nie mam natchnienia przeglądam już istniejące rozwiązania i szukam drogi środka - by wszystko bez nadmiaru niosło ze sobą intuicyjność i wygodę pracy.
Przegląd paneli administracyjnych jakie stworzyłem w roku 2008.
KontorX GWT - wszystko szło rewelacyjnie GWT zawładnęło moim sercem ale sam fakt płynącego czasu i ograniczeń EXT GWT i zachcianek klięta spowodował że ..
.. powstał panel ..
KonotrX HTML
- Zaraz po zalogowaniu wita nas mały dashbord
- Kategorie w sklepie
- Zarządzanie produktami
- Załanczanie grafiki do produktu
WiDooM - prostota przeźroczystość to jest to!
A jak wygląda Twoje zaplecze?
czwartek, 8 maja 2008
Trochę historii - www i ja
Internet ... co to było! pierwszy rok studiów stałe łącze, nieograniczone możliwości surfowania po sieci ... ach .. miło się to wspomina :)
Pierwszy raz (...) yhym .. ;) pierwsza strona WWW powstała w okresie Szkoły podstawowej - ślad po niej zaginął.
Pierwsza strona, od której zabawa zaczeła się na dobre to:
http://x100help.za.pl (jeszcze działa! ach te darmowe hostingi ;])
wykonana w: HTML
Następnie kontynuacją były jej modyfikacje
http://sghx100.za.pl - już wzobagacona w proste skryty PHP
wykonana w: HTML, CSS, PHP(wstawki)
Co to jest CMS? - też to chcę mieć! - zaczeło się powstała kolejna odsłona strony o samsung x100
http://www.widoom-cms.freehost.pl/x100/ - oparta na prostym CMS-ie
wykonana w: HTML, CSS, PHP(CMS WiDooM v1)
który napędzał też stronę:
http://www.widoom-cms.freehost.pl/
wykonana w: HTML, CSS, PHP(CMS WiDooM v1)
.. w międzyczasie
http://testament.za.pl/
wykonana w: HTML, CSS, PHP(wstawki)
miała być to strona o zespole TestAmenT .. wyszła strona z ogłoszeniami dla mojego kierunku .. hehe zabawne :P ..
Z serii stron dla ZiIP powstały jeszcze:
http://www.widoom-cms.freehost.pl/ziip/
wykonana w: HTML, CSS, PHP(CMS WiDooM v1)

http://www.widoom-cms.freehost.pl/ziip2/
wykonana w: HTML, CSS, PHP(CMS WiDooM v2)

http://samsung.ovh.org/ziip3/
wykonana w: HTML, CSS, PHP(CMS WiDooM v3)

Dwie powyższe strony zostały oparte na txtdb v1 - tekstowej bazie danych, wersja 1 obslugowala proste zapytania SQL, w puźniejszych z tego zrezygonowałem (nie działało to optymalnie wersja 3.1 dorobiła się jojnowania, sortowania, obsługi struktury hierarhicznej i wielu wielu bajerów :)
Teraz kolej na strony pod tytułem "dla innych" ;) nie zawsze za $
maszyny-jaro.prv.pl - strona wykonana w połączeniu PHP i MySQL, miała być katalogiem produktów sprzedawanych przez firmę Jaro - umarł projekt
wykonana w: HTML, CSS, PHP, MySQL

wpktuning.pl
wykonana w: HTML, CSS, PHP, txtdb v3.1

firmawpk.pl
wykonana w: HTML, CSS (blueprint - jak widać ;])

krzysztofzaba.pl -niedziala - ktoś czegoś nie opłacił ..
wykonana w: HTML, CSS, PHP
(znaleść screanshot ^^)
Dla promotor.krakow.pl
dietetyka.krakow.pl
wykonana w: HTML, CSS, jQuery, PHP(CMS Light v1)

psychodynamika.pl
wykonana w: HTML, CSS, jQuery, PHP(CMS Light v1.2)

http://www.eu1.pl/
wykonana w: HTML, CSS, jQuery, PHP(Light Framework)

http://krakkable.pl/
wykonana w: HTML, CSS, PHP
wkład: nie szablon :P

http://kalendarze.kr.com.pl/
wykonana w: HTML, CSS

kcp.krakow.pl
wykonana w: HTML, CSS, jQuery, PHP(CMS Light v1.5)

Dla kreatywni.net.pl
ramy-verso.pl
wykonana w: HTML, CSS, jQuery, PHP(CMS Light v1.3)
wkład: oparcie na CMS

fotorowecki.pl
wykonana w: HTML, CSS, jQuery, PHP(CMS Light v1.3)
wkład: oparcie na CMS

http://optotechmedical.pl/
wykonana w: HTML, CSS, PHP(CMS KontorX), Light Framework (czyli domowa produkcja ;)), jQuery
wkład: kodowanie od A-Z, cięcie szablonu

salonagd.com
wykonana w: HTML, CSS, PHP(CMS KontorX), Zend Framework, jQuery
wkład: kodowanie od A-Z, cięcie szablonu

Z tego projetu jestem zadowolony, nauczyłem się przy nim ZF + panel administracyjny w wersji pierwotnej był wykonany za pomocą GWT + EXT jednak z powodu - brak rąk do pomocy - zrezygnowałem z GWT i postawiłem na HTML + biblioteję jQuery
Wyciągłem z niego jeszcze jedną mądrą naukę, własne framework-i są ok, ale co jest dziełem tak ogromnej społeczność wychodzi poza wymiar ok!
Jest już kilka innych tytułów w drodze, nieomieszkam ich nie opisać.
niedziela, 24 lutego 2008
HTTPRequest.asyncPost
Nie myślałem że trzeba się tak natrudzić by wysłać dane POST z poprawnymi nagłówkami.
Dokumentacja mówi:
asyncPost(java.lang.String url, java.lang.String postData, ResponseTextHandler handler)Zastosowanie trywialne ..
Makes an asynchronous HTTP POST to a remote server.
HTTPRequest.asyncPost("http://example.pl","id=2",new MyResponseTextHandler());..prawie, bo żadne dane nie zostały przesłane.
Firebug pokazuję jakie dane POST zostały wysłane (nie do w/w przykładu):


wystarczy dodać w kodzie php takie 2 linie kodu i wszystko działa :)
$postData = array();
parse_str(file_get_contents('php://input'), $postData);