Problemy, jakie napotykamy podczas programowania wszelkiego rodzaju aplikacji można podzielić na dwie główne kategorie - wymagające doświadczenia i wymagające wiedzy. O ile te związane z doświadczeniem można rozwiązać bez pomocy innych - rozwiązania można po prostu wywnioskować na podstawie doświadczenia, o tyle związane z wiedzą nie są takie proste. Ich rozwiązanie to zdobycie informacji o tym, co należy zrobić, żeby było dobrze, a do rzeczonej informacji czasem bardzo ciężko się dostać. W dzisiejszym wpisie chciałbym właśnie dla swojej i Waszej referencji opisać jeden problem związany z “wiedzą” w symfony.

symfony: Pobieranie wszystkich wiadomości typu “flash”.

Framework symfony, podobnie jak kilka innych na rynku oferuje funkcjonalność tzw. “flashów” [flashy?]. Czym jest flash? Otóż, jest to jednorazowa wiadomość [komunikat, informacja - ogólnie jakaś wartość, najczęściej typu string], która kasuje się automatycznie po wyświetleniu, a właściwie pobraniu z kontenera która jest przechowywana tylko podczas jednego żądania - jest ona usuwana pod koniec jego wykonywania [dzięki za komentarz, @Kuba ;]]. Może to np. być komunikat o poprawnym zalogowaniu w serwisie - wiadomo, że wyświetlimy go tylko raz po zalogowaniu, bo potem jest on zwyczajnie niepotrzebny.

Flashe w symfony tworzymy w następujący sposób:

$this->getUser()->setFlash('name', 'This is flash message!');

A następnie możemy je wyświetlić w następujący sposób:

echo '<span class="flash">'.$sf_user->getFlash('name').'</span>';

Problem powstaje jednak w momencie, kiedy chcemy uzyskać listę wszystkich zarejestrowanych w trakcie wykonywania skryptu wpisów. Otóż zmienna $sf_user [obiekt klasy sfUser] niestety nie posiada metody getAllFlashes(), albo jakiejkolwiek innej, która realizowałaby jej założenia.

Oczywiście my wiemy w kontrolerze, jakie nazwy nadaliśmy naszym wiadomościom, ale dobrze byłoby dostać listę zarejestrowanych, zamiast próbować wszystkich identyfikatorów. Przyznam, że w Internecie jest bardzo mało informacji na ten temat i aż się zdziwiłem, kiedy znalazłem rozwiązanie dopiero gdzieś w małym poście na grupach dyskusyjnych symfony. Czy nikt nie miał wcześniej tego problemu i nie potrzebował takiej listy? Dziwne, ale może faktycznie każdy używał flashów zgodnie z ich założeniem używając jednej nazwy w całym serwisie.

Cóż, nawet jeśli tak było, to zgodnie ze wstępem publikuję kod, pozwalający na pobranie listy wszystkich wiadomości typu flash w symfony 1.4:

$allFlashes = $sf_user->getAttributeHolder()->getAll('symfony/user/sfUser/flash');

W zmiennej $allFlashes znajduje się prosty array zawierający klucze i wartości poszczególnych flashów. Można z niego skorzystać np. tak:

foreach($allFlashes as $flash => $value)
	{
	$flashMessage = $sf_user->getFlash($flash);
	switch($flash)
		{
		// different flash types as case options
		default:
			{
			echo '<div class="flash">'.$flashMessage.'</div>';
			}
		}
	}

Tym pozytywnym akcentem pragnę zakończyć dzisiejsze rozważania - do zobaczenia w piątek!