Hardcoded thoughts… mostly in C# or php

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:

PHP:
  1. $this->flash('Komunikat','url');
  2. // lub
  3. $this->Session->setFlash('Komunikat');
  4. $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/

JavaScript:
  1. function hideFlash()
  2. {
  3. var theClass = 'flashMessage';
  4. Effect.Puff(theClass);
  5. }

.
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):

HTML:
  1. <?php print $javascript->link('prototype') ?>
  2. <?php print $javascript->link('scriptaculous.js') ?>
  3. <?php print $javascript->link('effects.js') ?>
  4. <?php print $javascript->link('hideflash.js') ?>

W deklaracji BODY:

HTML:
  1. body onload="setTimeout('hideFlash()',3000);">

Warto by też postarać się o odpowiedni wygląd komunikatu (dopisujemy do app/webroot/css/css.default.css)

CSS:
  1. .message
  2. {
  3. position:relative;
  4. top:0px;
  5. left:100px;
  6. width:300px;
  7. font-size:15px;
  8. border: solid 1px #c9b484;
  9.  
  10. padding:12px;
  11. color:#000;
  12. background-color:#fff9d9;
  13. text-align:center;
  14. }

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:

PHP:
  1. if($layout == 'default' || $layout == null)
  2. {
  3. $out = '
  4. <div id="flashMessage" class="message">'.$flashMessage.'
  5. ';
  6. }

To chyba wszystko, co należy zrobić. Zmian jest na prawdę niewiele, a efekt ciekawy. Komunikaty oczywiście wywołuje się przed:

PHP:
  1. $this->Session->setFlash('Komunikat');
  2. $this->redirect('url');

Edit 16.03.2006:

  1. poprawiono delikatnie tekst - w wersji poprzedniej byly błędy
  2. 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 :)

Comments

  1. kwdowicz
    March 12th, 2006 | 06:57

    pozdrawiam fana kejka, ja właśnie kończe pisac sklep pod kejkiem.

  2. March 12th, 2006 | 09:17

    O, dobre! ;-) Zaraz to u siebie przetestuję...

  3. tas
    March 12th, 2006 | 15:07

    Czyli jednak w .pl ktoś w Cake'u robi :P

  4. June 9th, 2006 | 21:13

    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.

Leave a reply