Piszemy galerię zdjęć w Doctrine i OPT 2
Celem tego artykułu jest pokazanie zasad pracy z bibliotekami Doctrine i Open Power Template 2 na przykładzie budowy internetowej galerii zdjęć.
Spis treści
Celem niniejszego artykułu jest zapoznanie czytelnika z podstawami pracy w systemie ORM Doctrine oraz systemie szablonów Open Power Template 2 na przykładzie budowania prostej aplikacji internetowej, galerii zdjęć. Omówiona zostanie podstawowa konfiguracja oraz przygotowanie do pracy obu narzędzi, ich podstawowe zastosowanie oraz metody łączenia ich ze sobą. Z uwagi na objętość, w artykule zawarte zostały jedynie najważniejsze fragmenty kodu źródłowego, zaś kompletny, działający skrypt znajduje się w dołączonym do tekstu archiwum. W artykule zakładam, iż czytelnik ma już pewne doświadczenie w tworzeniu skryptów PHP oraz zna przynajmniej podstawy programowania obiektowego.
Ten tekst udostępniony jest na licencji Creative Commons Uznanie autorstwa-Użycie niekomercyjne-Bez utworów zależnych 2.5 Polska.
Dodaj komentarz
Komentarze
#1 Marcif ponad 3 lat temu Odpisz na ten komentarz
setAttribute
Jeśli zastosuje Doctrine w wersji 1.1 to generowanie tabel w bazie działa poprawnie lecz jeśli wersję 1.2 to już podczas generowania mam ostrzeżenia. W dokumentacji tej funkcji do obu wersji nie widzę żadnych różnic. O co więc chodzi?
Warning: PDO::setAttribute() expects parameter 1 to be long, string given in /var/www/opt_gallery/libs/Doctrine/Connection.php on line 341
Call Stack:
0.0003 116800 1. {main}() /var/www/opt_gallery/tools/doctrine.php:0
0.0945 2126648 2. Doctrine_Connection->setAttribute() /var/www/opt_gallery/tools/doctrine.php:22
0.0945 2127112 3. PDO->setAttribute() /var/www/opt_gallery/libs/Doctrine/Connection.php:341
#1.1 Marcif 4 minut później
Re: #1
No tak przypadkiem przeczytałem opis UPGRADE_TO_1_2 i tam wyczytałem:
The following code is no longer supported.
[php]
$connection->setAttribute('use_native_enum', true);
You must now always use the following code.
[php]
$connection->setAttribute(Doctrine_Core::ATTR_USE_NATIVE_ENUM, true);
Czyli już wszystko jasne :)
#2 Marcif ponad 3 lat temu Odpisz na ten komentarz
Nie generuje mi tabel
Po tej zmianie w wersji 1.2.1 błędów podczas generowania brak jednak tabele się nie zakładają. Jak prosto sprawdzić dlaczego ?
#2.1 Zyx 4 dni później
Re: #2
Kod z artykułu nie był jeszcze testowany pod Doctrine 1.2, więc na razie ciężko mi powiedzieć, co jest przyczyną problemu. Jednak jak tylko znajdę wolną chwilę, postaram się uaktualnić tekst i wyjaśnić ewentualne problemy. Cierpliwości.
#2.2 Marcif 6 dni później
Re: #3
Ok dzięki za zainteresowanie problemem. Ja w między czasie będę przegryzał ten artykuł na wersji 1.1
#3 Piraci ponad 3 lat temu Odpisz na ten komentarz
Autoloader OPT
W kodzie źródłowym w pliku index.php jest zła ścieżka do bibliotek - inna od tej w instrukcji w pliku README i inna od tej w artykule powyżej:
// Inicjuj autoloader OPT
require('../../wb_projects/Opl_20/lib/Base.php');
Opl_Loader::addLibrary('Opl', array('directory' => '../../wb_projects/Opl_20/lib'));
Opl_Loader::addLibrary('Opt', array('directory' => '../../wb_projects/Opt_20/lib'));
Opl_Loader::register();
#3.1 Zyx dzień później
Re: #3
U siebie na dysku mam po prostu wpisaną ścieżkę lokalną, by móc testować kod z najnowszymi wersjami OPT i szybko się między nimi przełączać - zapomniałem zmienić przy pakowaniu. Należy wpisać taką ścieżkę, jak w artykule, chyba że chcesz sobie biblioteki umieścić gdzie indziej.
#4 gaza ponad 3 lat temu Odpisz na ten komentarz
Bezpieczeństwo zdjęć
Witam.
Mam pytanie dotyczące bezpieczeństwa, a właściwie dostępności, zdjęć w galerii.
Jeżeli chciałbym zrobić aplikacjoę wielouzytkownikową i zabronić innym oglądania zdjęć innych niż swoje, to jak w proponowanym rozwiązaniu mógłbym to zrobić ? Obecnie jest tak, że folder ze zdjęciami jest ogólnodostępny i właściwie każdy może swobodnie wpisać ścieżkę i otworzyć dowolne zdjęcie.
#4.1 eXtreme około 2 godzin później
Re: Bezpieczeństwo zdjęć
Ja bym to zrobił w ten sposób:
Można by zrobić tak, aby zablokować dostęp do tego publicznego katalogu (ukryć go poza publicznym katalogiem na FTP albo poprzez wrzucenie odpowiedniego .htaccess). Następnie zrobić swego rodzaju bramkę (gate), która będzie przyjmować za parametr ID zdjęcia.
Kod PHP w bramce pobierałby nazwę pliku zdjęcia z bazy danych (na podstawie podanego ID) oraz sprawdzał uprawnienia. Jeżeli ten użytkownik nie może wyświetlać danego zdjęcia, to wyrzucać mu błąd http 404. Jeśli użytkownik może oglądać, to pobrać mime-type pliku poprzez mime_content_type() i wysłać jako nagłówek oraz wypluć zawartość zdjęcia (echo file_get_contents).
Wszystkie odwołania do zdjęć w galerii zmienić z bezpośredniego pliku na gate.php?id=XXX
Tym samym uniemożliwimy podgląd zdjęcia, jeżeli ktoś zdobyłby ścieżkę do niego oraz jeżeli zdobyłby jego ID, choć nie ma uprawnień.
#4.2 gaza 4 dni później
Re: #4
rozwiązanie prawie OK. Ale aby to zastosować, to musze ustawić content typ na tym obrazka i w takim przypadku poza obrazkiem nic nie wyświetlać na stronie !? Trzeba by zastosować iframe, a tego raczej nie chciałbym stosowac. Być może powyższe jest naiwne dla kogoś obeznanego, ale ja dotychczas nie musiałem mierzyć się z takim problemem.
#4.3 eXtreme 4 dni później
Re: #4
Bramka w zamierzeniu ma być odpowiednikiem bezpośredniego odwołania się do PLIKU obrazka, tym samym logiczne jest, że wyświetla tylko i wyłącznie zdjęcie.
Sprawdzanie uprawnień należy przeprowadzić także i równocześnie na stronie podglądu zdjęcia.