Op dinsdag 27 december 2005 10:30, schreef Dries Buytaert:
I think WP doesn't use an intermediate table that contains (source URL, destination URL)-tuples. Instead, it directly translates the URL to a database query that looks up the post.
I will try to explain the RoR way of doing this. ITs absolutely brillant in ts simplicity. really! And it has absolutely no performance penalty. (but then again, php != Ruby) RoR has, to start with a much cleaner default url structure: example.com/say/hello <= example.com/controller/action For drupal that would be: example.com/say/hello <= example.com/module/function We currently hardwire this in hook_menu. Now, I must add here, that due to RoRs 'build on top of existing stuff' you get all sorts of actions for free. my_controller/list, my_controller/add etc. The next step, obviously is to map these to new actions: RoR calls this routing. We call it hook_menu. In fact, they are so similar in nature, that i suspect the menu author had a peek at RoR :) So, the good news, is that in RoR you need nothing more. The URL generation in RoR uses these maps to make its urls. That is clean, simlpe and fits well in the philosophy 'don't repeat yourself' (aka no-copy-paste-coding). I suggest we adapt this mechanism for Drupal in Core. Then we can do all our path/url mapping in code. Code we already have. Variables that are already built and loaded ($menu). What we cannot do, is hand-editing ni our GUIS. But then I ask myself: If i have pathauto, which does all the mapping in the code, then why the ** do i need to store that in a database, other then for some caching? Hence I suggest we ignore the hand-coded urlmapping for now. And focus on this menu-mapping. After that, we can just use our current database mapping (path.module), through this menu mechanism, to handle those few hand-edited paths. Or is there anyone out there, who maintains over a few hundred hand-edited path aliases? and if so, is that because you want to, or because you lack a [book-structure-mapper|taxonomy-mapper|username-mapper] ? Some pseudoish flowchart code: function hook_menu() { $menu_item[] = array(title => 'foo', original_path => 'bar/%d', original_replace => '$object->oid', 'map' => 'bar/%s', 'map_replace' => 'urlencode($obj->name)'; //replace is to know what to replace the sprintf tokens in a path } .... function create_path($path, $object) { global $menu $mid = menu_find_by_path('') $original_path = sprint_f($menu[$mid][original_path], $menu[$mid] [original_replace]) $new_path = sprint_f($menu[$mid][map_path], $menu[$mid][map_replace]) return _path_str_replace($path, $menu[$mid]); } This way we need no extra hooks, no extra variables, and no extra memory. Or hardly, anyway. While it saves a lot of code. Bèr 'who wants to think this trough more thoroughly, though' Kessels -- | Bèr Kessels | webschuur.com | website development | | Jabber & Google Talk: ber@jabber.webschuur.com | http://bler.webschuur.com | http://www.webschuur.com |