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 !