Pliki w formie binarnej w bazie

Wcześniej pisałem o tym problemie, gdy pliki trzymamy fizycznie na dysku a w bazie tylko informację np. nazwę pliku (Co się dzieje, gdy dane są nie tylko w bazie).

Jako, że nowe projekty także służą do eksperymentowania z nowymi rozwiązaniami, dlatego próbujemyz nowymi rozwiązaniami:

  1. Po pierwsze komponent: ma dostawać tablicę po uploadzie (chodzi o pola “file”), zwracać nazwę zapisanego pliku (dla standardowego podejścia) lub zawartość gotową do wrzucenia do BLOBa
  2. Po drugie Helper, który będzie się zajmował wyświetlaniem takich zdjęć (a w przyszłości także zajmie się cache’owaniem ze wspomnianą w powyższym artykule metodą z nagłówkami expire)

W takim rozwiązaniu niestety pojawia się problem (strzałki oznaczają przepływ danych, uwaga: diagram nie przedstawia dosłownie przebiegu jednego zapytania, ale dwóch zapisu (do kontrolera) i wyświetlenia obrazka (od kontrolera)) :

Chodzi o fragment zaznaczony na czerwono. To jest nadmiarowe zachowanie. Lepiej byłoby, gdyby komponent (poprzez kontroler) przekazał nazwę pliku, Helper sprawdził, czy plik istnieje, a w razie gdyby nie istniał – musiałby ‘poprosić’ komponent o aktualizację pliku. A to jest w konflikcie z tym co napisałem przy okazji Dobrych praktyk #2 – Helper nie może używać kontrolera, ani komponentu.

I tu się wydarzyła rzecz ciekawa, w tym poście chciałem napisac o problemie, na który nie widzę dobrego sposobu. Chciałem przedstawić ideę pierwszego podejścia.
Dla bardziej przejrzystego przekazania idei postanowiłem zbudowac diagram i uświadomiłem sobie jak bardzo wizualizacja pomaga w zrozumieniu problemu.
A od zrozumienia problemu do jego rozwiązania jest raczej niedaleko.

No i w tym momencie wpadłem na pomysł bez komponentu i bez Helpera, ale za to sam Behavior. Myślę sobie, że Behaviors są rozszerzeniem Modeli, które odpowiadają za warstwę przechowywania danych.
Pomysł jest taki, że -pomijając kwestię uploadu i sapisu – behavior w afterRead() sprawdził, czy plik fizycznie jest aktualny, jeśli jest – zwróci jego nazwę. Jeśli nie jest – utworzy go na podstawie danych w bazie (koniecznie z inną nazwą) i zwróci jego nazwę (relatywną do img/) ścieżką.

Sprawdzę to empirycznie i napiszę Wam jak poszło.

Share Button

firePHP zbawieniem twym (w przypadku nieprzejednanych klientów)

Jeśli nigdy nie musiałeś wprowadzać poprawek na systemie w wersji produkcyjnej – jesteś prawdziwym szczęściarzem.
Często jednak bywa tak, że musisz poprawić kilka “pierdół”, więc robisz to bezpośrednio. Jednak jeśli Twój klient nie może zaakceptować informacji z debugowania na stronie, a Ty bez nich nie możesz efektywnie pracować – FirePHP przyjdzie Ci z pomocą.

FirePHP to rozszerzenie, do Firebug – rozszerzenia do Firefoxa :)
Pozwoli Ci wyświetlać debug z kodu PHP w konsoli firebuga właśnie. Jak go zintegrować z Cake (1.2) jest opisane na http://bakery.cakephp.org/articles/view/baking-cakes-with-firephp.

Poniżej efekt:

Przy wykorzystaniu tych narzędzi twój debug jest widoczny tylko dla Ciebie (no i jeszcze tych co mają zainstalowany ten dodatek… na 99% Twój klient nie ma).

Życzę Wam i sobie więcej takich narzędzi, które pojawiają się zanim uświadomimy sobie ich potrzebę.

ps. Radzę raczej użyć firebuga w wersji beta 7, gdyż w nowszych pojawia się błąd, w którym aby zobaczyć informacje w konsoli – trzeba najpierw przełączyć się na inną zakładkę, a później do niej wrócić. Zatem jeśli nie potrzebujesz poprawek z wersji beta 15 (taka była najnowsza w momencie pisania tego tekstu) – wybierz 7.

Share Button

HttpSocket z cake 1.2 w cake 1.1.x

Jeśli potrzebujesz funkcjonalności zapewnianej przez HttpSocket(na przykład musisz pracować na danych w xml-u dostarczanych choćby przez kanał rss), a z jakichś powodów nie możesz korzystać/migrować na CakePhp1.2, zastosuj poniższą sztuczkę:

Z biblioteki CakePhp1.2 (cake/libs/) do katalogu vendors w Twojej aplikacji (1.1.x) skopiuj pliki
– socket.php
– http_socket.php

W pliku socket.php gdzieś na początku, przed definicją klasy jest linia
uses(‘validation’);
zakomentuj ją (lub usuń) .
Z kolei w pliku http_socket.php linię
uses( ‘socket’, ‘set’);
Zamień na
vendor(‘socket’);
uses(‘set’);

Sposób działający pomiedzy wersją 1.2.0.6311 beta a 1.1.16.5421.
Powodzenia

Uwaga: działa jedynie przy zapytaniach GET. Dla POST brakuje potrzebnych klas i trzeba by nieco pogrzebać w kodzie HttpSocket, żeby można było wywoływać zapytania POST.

Share Button