INDEX
Oui j’ai mis le titre en anglais car je compte beaucoup sur le SEO de cet article, gniarf.
Based on this article at Rapidop
Goal of the application
– You create a CMS where you can register Pages
– Each page has a slug URL, i.e. : « nananana.com/slug » <— as in WordPress « pages »
– You want Kohana 2.x to load an article based on the slug
– So you need to catch the 404 (beware not to name your slugs as real Controllers names !!)
– And you need to redirect to the Main Controller and use the __call() method.
Go !
Config : enabling hooks
in /application/config/config.php :
/** * Enable or disable hooks. */ $config['enable_hooks'] = TRUE;
Create a hook file named my_errors in /application/hooks folder.![]()
In /application/hooks/my_errors.php :
<?php
defined('SYSPATH') or die('No direct script access.');
Event::clear('system.404', array('Kohana', 'show_404'));
Event::add('system.404', 'my_404');
function my_404() {
// get the first part of the requested URI
$segment = Router::$current_uri;
url::redirect('main/'.$segment);
}
?>
Checking the Main Controller
– First things first, you can use any Controller name you need. Mine is called « main ».
– Check that you have a __call() methode inside, like this :
public function __call($method, $arguments) {
// Disable auto-rendering
$this->auto_render = FALSE;
// By defining a __call method, all pages routed to this controller
// that result in 404 errors will be handled by this method, instead of
// being displayed as "Page Not Found" errors.
echo 'This text is generated by __call. If you expected the index page, you need to use: welcome/index/' . substr(Router::$current_uri, 8);
}
At this step if you go to, for example, https://localhost/main/polarity-therapy you should see this error message generated by Kohana :
This text is generated by __call. If you expected the index page, you need to use : welcome/index/arity-therapy
Updating the __call() method
public function __call($method, $arguments) {
// the page we're trying to reach == the method kohana tries to load
$page = Router::$method;
// is there such a slug in the pages?
$temp = ORM_MPTT::factory('pages')->where('slug', $page)->find_all();
if (count($temp)) {
// in the Page Controller you deploy a normal page serving system
url::redirect('main/page/' . $page);
} else {
// the slug doesn't exist, so we need to throw a real 404 page this time.
$this->template->texte = new View('404');
}
}
Comments are explicit so I leave this block to your appreciation.
It works like this. Enjoy !
