flash baking
Tytuł może i jest trochę mylący. Jednakże jeśli go odpowiednio zinterpretować - wszystko stanie się jasne. Z góry zaznaczam, że całośc tyczyć się będzie CakePHP
W CakePHP (framework PHPowy, który ostatnio katuję) wiadomości flash (ogłoszenia, ukazywane zwykle po edycji, dodaniu rekordu etc.) tworzy się raczej prosto:
-
$this->flash('Komunikat','url');
-
// lub
-
$this->Session->setFlash('Komunikat');
-
$this->redirect('url');
Podany dziś na Cake'owym wiki pojawił się całkiem ciekawy przepis na wiadomości flash, które ładnie pojawiają się w domyślnym layoucie strony i ładnie znikają. Automagicznie tak. Przyszło mi jednak do głowy, że znikać mogą jeszcze ciekawiej, jeśli tylko skorzystać z biblioteki script.aculo.us, konkretnie z modułu Effects. Całość można bardzo ładnie zautomatyzować, wymaga to zastosowania się do owego przepisu i przyprawienia własną inwencją twórczą. Oto zatem jak to zrobić.
Wpierw utwórzmy mały plik js, zamiast całość wciskać do kodu z 'laoutem' strony - plik nazywamy hideflash.js i zapisyjemy w folderze app/webroot/js/
-
function hideFlash()
-
{
-
var theClass = 'flashMessage';
-
Effect.Puff(theClass);
-
}
.
Effect.Puff() to oczywiście sposób, w jaki wiadomość "się" zniknie :), inny można sobie wybrać z tych prezentowanych w dokumentacji script.aculo.us.
W głównym pliku odpowiedzialnym za wygląd strony (app/views/layouts/default.thtml) powinno znaleźć się coś następującego:
(w sekcji HEAD):
-
<?php print $javascript->link('prototype') ?>
-
<?php print $javascript->link('scriptaculous.js') ?>
-
<?php print $javascript->link('effects.js') ?>
-
<?php print $javascript->link('hideflash.js') ?>
W deklaracji BODY:
-
body onload="setTimeout('hideFlash()',3000);">
Warto by też postarać się o odpowiedni wygląd komunikatu (dopisujemy do app/webroot/css/css.default.css)
-
.message
-
{
-
position:relative;
-
top:0px;
-
left:100px;
-
width:300px;
-
font-size:15px;
-
border: solid 1px #c9b484;
-
-
padding:12px;
-
color:#000;
-
background-color:#fff9d9;
-
text-align:center;
-
}
Na tym etapie kończą się bezpolesne zmiany dokonywane w kodzie naszej aplikacji, czas na małą ingerencję w kod Cake'a. Ostatnia zmiana (tylko dla wersji CakePHP < = 0.10.8.2152 RC6) tyczy się pliku cake/libs/controller/components/session.php - w linii 145 należy zmienić fragment dotyczący wyglądu warstwy, tak by cały fragment wyglądał tak:
-
if($layout == 'default' || $layout == null)
-
{
-
$out = '
-
<div id="flashMessage" class="message">'.$flashMessage.'
-
';
-
}
To chyba wszystko, co należy zrobić. Zmian jest na prawdę niewiele, a efekt ciekawy. Komunikaty oczywiście wywołuje się przed:
-
$this->Session->setFlash('Komunikat');
-
$this->redirect('url');
Edit 16.03.2006:
- poprawiono delikatnie tekst - w wersji poprzedniej byly błędy
- w nowej wersji (czyli następnej po 0.10.8.2152 RC6) nie będzie już konieczności zmiany plików Cake'a (cake/libs/controller/components/session.php) - Session::setFlash() domyślnie tworzy warstwę z ID="flashMessage". Dumny z siebie jestem, bo mój bug report został przyjęty :)

10przykazan.com
pozdrawiam fana kejka, ja właśnie kończe pisac sklep pod kejkiem.
O, dobre! ;-) Zaraz to u siebie przetestuję...
Czyli jednak w .pl ktoś w Cake'u robi :P
do tej pory używałem mojavi (mojavi.org) ale gdy zobaczyłem cake długo się nie zastanawiałem nad przesiadką i ostatnie kilka aplikacji zbudowałem właśnie za pomocą cake. wspaniały framework.