Niezalogowany [ logowanie ]
Subskrybuj kanał ATOM Kanał ATOM    Subskrybuj kanał ATOM dla tagu php Kanał ATOM (tag: php)

Autor wpisu: Jacek Skirzyński, dodany: 28.02.2014 23:18, tagi: php, symfony2

Ostatnio miałem okazję uruchamiać na hostingu współdzielonym od home.pl aplikację w Symfony2. Uruchomienie było testowe, ale jak zwykle były problemy.

Google podpowiedziało rozwiązanie umieszczone na forum PHP. Opis jest szczegółowy, jednak w moim wypadku efekt nie działał, więc zacząłem sam kombinować. Poniżej moje zapiski:

  1. utworzenie konta FTP z dostępem do katalogu /strona (oczywiście nazwy każdy dobiera indywidualnie);
  2. skierowanie domeny/subdomeny na katalog /strona/web, serwis musi być bez separacji;
  3. przegranie plików projektu do katalogu / konta FTP (tzn. do katalogu /strona całego konta hostingowego);
  4. dodanie pliku php.ini z poniższymi wpisami:
    short_open_tag = Off
    magic_quotes_gpc = Off
  5. w pliku web/.htaccess należy dodać komentarze w linijkach:
    RewriteCond %{ENV:REDIRECT_STATUS} ^$
    RewriteRule ^app\.php(/(.*)|$) %{ENV:BASE}/$2 [R=301,L]
  6. jeżeli wersja PHP nie jest przełączona w panelu zarządzania hostingiem, trzeba to zrobić w pliku web/.htaccess dodając linijki:
    :Location /*.php
    Use php53 
    :Location

    minimum dla Symfony2 to PHP 5.3.3, ale home.pl udostępnia też PHP 5.4 (Use php54)

  7. po wyczyszczeniu cache i skonfigurowaniu aplikacja powinna już działać.

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

4Developers - logoJuż 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

Rejestracja

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ć:

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:

  1. skopiowaniu pliku
  2. zmianie rozszerzenia z .php.dist na .php
  3. 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:

Czytaj dalej tutaj (rozwija treść wpisu)
Czytaj dalej na blogu autora...

Autor wpisu: zleek, dodany: 27.01.2014 14:12, tagi: php, zend_framework

Pracując przy ostatnim projekcie bazującym na Zend Framework 2 napotkałem dziwny błąd. Mianowicie dla pól formularza, które miały atrybut required miały ustawiony na true, nie mogłem ustawić własnego komunikatu błędu. Pomimo tego, że walidator dla tego pola ustawiony w InputFilter, wyglądał na prawidłowy, wyświetlana była domyślna wartość komunikatu błędu. Okazało się, że problem nie leżał […]

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&amp;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.

Autor wpisu: Śpiechu, dodany: 12.01.2014 20:46, tagi: php

I’ve always looked for a rational explanation of using traits in PHP and I think I’ve found one. Let’s say we have a bunch of status codes which are set using constants. To remind: constants can also be set in interfaces (notice that constant interface pattern is considered as a bad practice).

We are writing an utils library and simply don’t trust users :-) It means we need to check if status codes set on object are valid. One way is to keep status codes as a range from number to number. Validating is easy in that case. We’re simply check if status is in range. This is obviously not common. In that case we can use reflection to list all class constants. And what if we have unrelated hierarchies of objects? We must duplicate some code. It’s against DRY principle. Trait to the rescue!

Take look at my rich documented gist and see how it works at the bottom of listing. Code is licensed under MIT License, so grab it and use it.

Wszystkie wpisy należą do ich twórców. PHP.pl nie ponosi odpowiedzialności za treść wpisów.