TastyCode devblog
7mar/102

Własna strona błędu 404 w Kohanie

Ostatnio odkryłem prawdziwy "pałer" frameworków. Zacząłem od CodeIgnitera. Całkiem fajny, w większości miejsc daje wolną rękę programiście. Jednak nie wygląda na to, żeby miał być dalej tworzony. Spróbowałem Kohanę, jedną (to ona jest? :) ) z jego forków.

Jako że dosłownie zakohałem się w Kohanie, będę co jakiś czas umieszczał tutaj jakieś porady.
Porada na dziś:
Własna strona błędu 404 w Kohanie
(docelowo pisane na Kohanę 2.3.4, ale na 2.4 też powinno działać)
Wbrew pozorom nie jest to takie trudne! Kohana (tak jak CodeIgniter) ma zaimplementowany system tak zwanych Hooków/Eventów (zdarzeń). Mogę zmienić standardową funkcję obsługi błędu 404, i podmienić ja na moją własną.
Na początku musimy się upewnić, czy mamy w naszej aplikacji włączone hooki. W tym celu otwieramy plik application/config/config.php, i prawdopodobnie w linijce 75 będzie znajdować się poniższy kod:

$config['enable_hooks'] = FALSE;

Zmieniamy FALSE na TRUE.
Następnie tworzymy nowy plik application/hooks/error_404.php. Kohana automatycznie wykonuje wszystkie pliki z katalogu application/hooks/, więc nie musimy go jakoś specjalnie włączać :)
W tym pliku zadeklarujemy klasę przechwytywania błędu (error_404), oraz podmienimy standardową funkcję obsługi błędu 404, na naszą własną z klasy error_404. Nasza funkcja będzie uruchamiać inny, podany w stałej, kontroler.

<?php
class error_404 {
	const error_controller = 'Error404'; // Nazwa kontrolera który chcemy wykonywać podczas błędu. (jeżeli mamy kontroler np. w pliku application/controllers/errors/Error404.php, wpisujemy tutaj errors/Error404)
	public static $page = '';

	public static function show_404() { // nasza funkcja przechwytująca błąd 404
		header("HTTP/1.0 404 Not Found"); // wysyłamy nagłówek ze statusem Not Found.
		if(Router::$current_uri != self::error_controller) { // zabezpieczenie, przed zapętleniem się strony, gdy podany kontroler obsługi błędu nie zostanie znaleziony
			self::$page = Router::$current_uri; // zapisujemy adres brakującej strony, więc możemy w kontrolerze strony błędu wyświetlić jej adres
			Router::$current_uri = self::error_controller; // Przekierowujemy na nasz kontroler
			Router::setup(); // i ponownie inicjalizujemy klasę Router.
		} else {
			Kohana::show_404(self::$page); // gdy nasz kontroler obsługi błędu nie istnieje, wyświetlamy standardową tablicę z Kohany, z adresem strony wcześniej zapisanej do zmiennej $page.
		}
	}
}

Event::replace('system.404', array('Kohana', 'show_404'), array('error_404', 'show_404')); // Podmieniamy standardową funkcję obsługi eventu "system.404", na naszą.
?>

Potem musimy zdefiniować nasz kontroler w pliku application/controllers/Error404.php. Nie będzie on się różnił specjalnie od innych, więc nie będę się tutaj specjalnie rozpisywał:

<?php
class Error404_Controller extends Controller {
	public function index() {
		echo '<html><body><b>404 Not Found</b><small> - '.error_404::$page.'</small><br /><br /><small>Powered by KohanaPHP</small></body></html>';
	}
}
?>

Stay tuned, następne tutoriale już niedługo!

20sty/100

“Nie jestem twoim chłopcem” – o prostytucji w internecie

Ostatnio poczułem się w internecie jakbym był żywym towarem na sprzedaż. A to za sprawą naszego rodzimego Facebooka - naszej-klasy.

Otóż pierwotnie założenia i wykonanie n-k pokrywały się z moimi oczekiwaniami. Nie było zbędnych funkcji, większych ograniczeń. Jednak z czasem portal społecznościowy, za przeproszeniem, zeszmacił się. Zaczęło przybywać reklam, np. takie wbudowane Allegro. Po co to komu?!

Uznałem, że w dobie Facebooka i świetnego Twittera nie potrzebuję konta na naszej-klasie i je usunąłem. Doszedłem do wniosku, że jestem towarem na sprzedaż. Ja jestem dla serwisu, nie serwis dla mnie. Z kolei serwis dla kasy. Dziękuję, postoję.
Z innej beczki: Harry Potter does Bananaphone!