Autor wpisu: batman, dodany: 11.02.2014 16:30, tagi: internet
Autor wpisu: Śpiechu, dodany: 09.02.2014 22:17, tagi: php
I’m still inspired by Scala way of thinking. I wonder if some functional paradigms can be smuggled into PHP. My goal is to quickly code flexible string converter without using loops or if’s (ternary operators doesn’t count ;-) ). I’ll be using functions that take other functions as their arguments, which are known as higher order functions in Scala. Of course, in Scala you can force what kind of arguments function takes, and what it returns. In PHP you can use callable typehint and tedious reflection processing.
Enough talking, gimme some code!
Autor wpisu: matipl, dodany: 07.02.2014 12:54, tagi: php
Już za 2 miesiące będziemy mogli spotkać się w Warszawie. 7 kwietnia 2014 odbędzie się kolejna edycja konferencji 4Developers.
Obecnie każdy z branży IT znajdzie na tej imprezie coś ciekawego, ponieważ nie jest to jedna konferencja, a raczej wiele połączonych w jedną. W 2013 roku na 4Developers było aż 13 ścieżek, w tym roku Organizatorzy proponują m.in. Java, .Net, PHP, Python, Front-end, UX, IT Security, Application Architecture (łącznie do 15 ścieżek). Na obecną edycją trwa właśnie Call for Papers, ale można zaryzykować i zapisać się w ciemno.
W trakcie trwania 4Developers możemy dowolnie migrować pomiędzy ścieżkami, jeśli dany temat nam aktualnie nie odpowiada. Dzięki temu możemy wycisnąć z 1 dnia naprawdę dużo. Do 10 lutego obowiązuje promocyjna cena 200 zł netto.
Miejsce: Hotel Gromada Airport, Warszawa Czas: 7 kwietnia 2014
Autor wpisu: Jacek Skirzyński, dodany: 31.01.2014 23:08, tagi: php
Trochę czasu mineło od ostatniego i w końcu udało mi się znaleźć chwilę na opisanie kolejnych elementów Phinga – filtrów i maperów.
Filtry
Filtry pozwalają na wykonywanie różnych operacji na zawartości plików – na przykład usuwanie komentarzy z kodu. Wywołanie filtrów grupuje się w tagu <filterchain>
, przykład poniżej:
<copy todir="kopia" overwrite="true"> <fileset dir="."> <patternset refid="ogolne" /> </fileset> <filterchain> <stripphpcomments /> </filterchain> </copy>
Przykładowy kod definiuje operację kopiowania plików (zdefiniowanych w elemencie <patternset>
o ID: „ogolne” do katalogu „kopia”. Oprócz zwykłego kopiowania pliki są przetwarzane przez łańcuch filtrów. W tym wypadku zawierający jeden filtr, który usuwa z plików komentarze PHP.
W momencie pisania tego posta Phing dostarczał 19 wbudowanych filtrów, listę można znaleźć w dokumentacji. Natomiast z popularniejszych filtrów myślę, że należy wymienić:
ExpandProperties
– podstawianie wartości dla odwołań do zmiennych Phing;IconvFilter
– zmiana kodowania plików;ReplaceTokens
,ReplaceTokensWithFile
– podmiana „tokenów” zawartych w plikach na odpowiednie wartości;ReplaceRegexp
– podmiana wartości z wykorzystaniem wyrażeń regularnych.
Z praktycznego punktu widzenia filtry są bardzo przydatne, ale mogą powodować pewne problemy w połączeniu z systemem kontroli wersji – o tym co można poradzić napiszę w dalszej części.
Mapery
Efektem działania filtrów jest zmiana zawartości plików, natomiast mapery działają analogicznie, ale z nazwami plików. W momencie przygotowywania wpisu Phing dostarczał 6 maperów. W moim odczuciu najbardziej przydatne są:
GlobMapper
– podmiana nazw plików według prostych wzorców;RegexpMapper
– to samo, ale z wykorzystaniem wyrażeń regularnych we wzorcach.
Użycie maperów odbywa się w analogiczny sposób jak filtrów – w ramach jakiejś operacji plikowej (przykład zaczerpnięty z oficjalnej dokumentacji):
<copy todir="/tmp"> <mapper type="glob" from="*.php" to="*.php.bak"/> <fileset refid="someid" /> </copy>
Praktyczny przykład użycia
Za dobry przykład użycia Phinga (filtry, mapery) i systemu kontroli wersji uważam generowanie plików konfiguracyjnych projektu.
Idea opiera się na plikach o rozszerzeniu .dist
(kwestia umowna). Do systemu kontroli wersji trafiają pliki „szablonowe” (.dist
), tak żeby ich struktura mogła być śledzona. Z drugiej strony, aby nie zawierały konkretnych informacji (np. dostęp do bazy danych). W tych plikach zamiast wartości pojawiają się Phingowe odwołania do zmiennych. Utworzenie działającego pliku konfiguracyjnego polega na:
- skopiowaniu pliku
- zmianie rozszerzenia z
.php.dist
na.php
- podstawieniu wartości w miejsce wywołań zmiennych
Plik config/Config.php.dist
:
<?php class Config { const DB_HOST = '${config.db.host}'; const DB_NAME = '${config.db.name}'; const DB_USER = '${config.db.user}'; const DB_PASSWORD = '${config.db.password}'; }
Plik srodowisko.properties
:
Autor wpisu: zleek, dodany: 27.01.2014 14:12, tagi: php, zend_framework
Autor wpisu: Łukasz Socha, dodany: 23.01.2014 19:09, tagi: php
W tym wpisie pokażę jak łatwo można nanosić obiekty wraz z ich opisami na mapę wykorzystując API Google Maps. Jest to trzecia część z cyklu o geolokalizacji i Googlee maps.
Jeżeli drogi czytelniku nie czytałeś poprzednich części cyklu zachęcam Cię do przeczytania pierwszego wpisu. Wiedza tam zawarta jest niezbędna do zrozumienia poniższego kodu.
Gotowy? No to przejdźmy do kodu i jego analizy
<!DOCTYPE html> <html> <head> <style> html, body, #map_canvas { height: 100%; margin: 0px; padding: 0px; } #map-container{ height: 100%; } </style> <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false&libraries=places"></script> <script> /** * * @type @exp;google@pro;maps@call;Map Obiekt mapy */ var map; /** * * @type Array Tablica markerow */ var marker = new Array(); /** * * @type Array Tablica chmurek z opisami dla markerow */ var infowindow = new Array(); /** * Tworzy obiekt mapy z podstawowymi ustawieniami * @returns void */ function initialize() { var myLatlng = new google.maps.LatLng(52.24125614966341, 20.9619140625); var mapOptions = { zoom: 7, center: myLatlng }; map = new google.maps.Map(document.getElementById('map_canvas'), mapOptions); addMarker(new google.maps.LatLng(52.24125614966341, 20.9619140625), 'Warszawa', 'Stolica Polski'); addMarker(new google.maps.LatLng(50.0647793, 19.9475100), 'Kraków', 'Piękna starówka :)'); addMarker(new google.maps.LatLng(51.1462584, 21.9684219), 'Opole Lubelskie', 'A tu mieszkam i pracuję...'); } /** * Dodaje marker do mapy * @param Latlng latlng obiekt ze wspolrzednymi geograficznymi * @param string name Nazwa markera * @param string description Opis markera do chmurki * @returns void */ function addMarker(latlng, name, description) { console.log("Wspolrzedne: " + latlng.lat() + ' ' + latlng.lng()); marker.push(new google.maps.Marker({ position: latlng, map: map, title: name })); infowindow.push(new google.maps.InfoWindow({ content: description })); // wyswietla dymki po kliknieciu na marker google.maps.event.addListener(marker[infowindow.length - 1], 'click', (function(i) { return function() { infowindow[i].open(map, marker[i]); } })(infowindow.length - 1)); } google.maps.event.addDomListener(window, 'load', initialize); </script> </head> <body> <div id="map-container"> <div id="map_canvas"></div> </div> </body> </html>
Najbardziej interesującym fragmentem kodu jest dla nas funkcja addMarker(). Funkcja ta posiada 3 argumenty: obiekt latlng (zawierający współrzędne geograficzne), nazwę oraz opis pozycji.
W linii 57 dodaję do tablicy nowy obiekt markera – jako jego parametry ustawiam pozycję, nazwę oraz podaję obiekt mapy, na której ma być narysowany. W kolejnej linii tworzę obiekt InfoWindow, który zawiera opis pozycji. Opis ten może zawierać kod HTML, dzięki czemu mamy spore pole manewru :).
W linii 66 dla każdego elementu tablicy z markerami dodaję listener, który po kliknięciu na marker otwiera okno z opisem danej pozycji.
W funkcji initialize() tworzę 3 przykładowe markery. Dlaczego akurat tam? Przed jakąkolwiek modyfikacją musi być stworzony obiekt mapy.
Jak to wygląda w praktyce możesz zobaczyć pod tym linkiem.