routing - How to redefine the URLs generation without changes at the HtmlHelper#link(...) calls in CakePHP? -


i have cakephp website many internal links, build htmlhelper:

/app/view/mycontroller/myaction.ctp

<?php echo $this->html->link(     $item['search']['name'],     array(         'controller' => 'targetcontroller',         'action' => 'targetaction',         $profileid,         $languageid     ) ); ?> 

it works fine default route:

/app/config/routes.php

router::connect('/pages/*', array('controller' => 'pages', 'action' => 'display')); 

the generated links that: /mycontroller/myaction/$profileid/$languageid.

now want use search engine friendly urls (with profile names , iso-639-1 language codes instead of ids) part of website , added new route:

/app/config/routes.php

router::connect(     '/:iso6391/:name.html',     array('controller' => 'mycontroller', 'action' => 'myaction'),     array(         'iso6391' => '[a-za-z]+',         'name' => '[0-9a-za-zäöüßÄÖÜ\-]+',     ) ); 

and works fine , incomming uris /producer/en/testname.html interpreted correctly.

but htmlhelper still generating old uris /mycontroller/myaction/1/1.

the docu says:

reverse routing feature in cakephp used allow change url structure without having modify code. using routing arrays define urls, can later configure routes , generated urls automatically update.

well, htmlhelper gets routing array input, means: i'm using reverse routing.

why not work? how make htmlhelper generate new urls (without changing htmlhelper#link(...) calls)?

bit of explanation first

you technically not using reverse routing. see, output link, /mycontroller/myaction/1/1 definitively doesn't match /iso/name.html. like, in no way. so, routing skips rule because doesn't apply.

code

try this

echo $this->html->link(     $item['search']['name'],     array(         'controller' => 'targetcontroller',         'action' => 'targetaction',         'iso6391' => $somestringwithiso,         'name' => $somename     ) ); 

but that, have change routing bit, because not passing parameters (check the docs examples)

router::connect(     '/:iso6391/:name.html',     array('controller' => 'mycontroller', 'action' => 'myaction'),     array(         'pass' => array('iso6391', 'name'),         'iso6391' => '[a-za-z]+',         'name' => '[0-9a-za-zäöüßÄÖÜ\-]+',     ) ); 

and have mind first string match /:iso6391/:name.html. want match route every controller , action in project, or the one controller , the 1 view. if projects, precaution, use this

  /:controller/:action/:iso6391/:name.html 

if for, say, controller1 , action "view", use

  /controller1/view/:iso6391/:name.html 

the detail need consider extension use .html, necessary in url? if is, add parameter in html#link

echo $this->html->link(     $item['search']['name'],     array(         'controller' => 'targetcontroller',         'action' => 'targetaction',         'iso6391' => $somestringwithiso,         'name' => $somename          'ext' => 'html'     ) ); 

and add parseextensions routing file. read this. easier if don't add extension, that's you.

in end, still have change calls html->link...


Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

Python ctypes access violation with const pointer arguments -