Search code examples
phpzend-frameworkroutesurlhelper

How to createe a URL string based on a named route and keep parameters


I need to create urls for category switching, switching category should reset page to 1st and change cat name but keep rest of url params.

Example of url:

http://example.com/cat/fruits/page/3/q/testquery/s/date/t/kcal/mine/26/maxe/844/minb/9/mint/4/maxt/93/minw/7/minbl/6/maxbl/96

Urls can contain many different params but category name and page should be always first, category without page should work too and show 1st page.

Currently I have defined two routes and I'm using Zend's url helper with named route but it resets params and as end resuls I have /cat/cat_name/page/1 url.

$category_url = $view->url(array('category'=>$list_item['url'],'page'=>1),'category',FALSE)


resources.router.routes.category_main.route = "/cat/:category/*"
resources.router.routes.category_main.defaults.module = "ilewazy"
resources.router.routes.category_main.defaults.controller = "index"
resources.router.routes.category_main.defaults.action = "results"
resources.router.routes.category_main.defaults.category = 
resources.router.routes.category_main.defaults.page = 1

resources.router.routes.category.route = "/cat/:category/page/:page/*"
resources.router.routes.category.defaults.module = "ilewazy"
resources.router.routes.category.defaults.controller = "index"
resources.router.routes.category.defaults.action = "results"
resources.router.routes.category.defaults.category = 
resources.router.routes.category.defaults.page = 1

Do I need to create custom method for assembling url in this case?


Solution

  • Solution is very simple, one just have to pass all current request params to url helper (and optionaly overwrite/add some of them, page and category in my case), last variable is set to FALSE to prevent route resetting.

    $view->url(
            array_merge(
                    $params,
                    array('category' => $list_item['url'],
                    'page' => 1)
                    ),
                    'category_main', 
                 FALSE
                );