Arvind K.
Arvind K.

Reputation: 1294

How to modify an URL in a view in CakePHP 2.x

It seems quite simple but there is something I am not able to figure out. I hope someone can help me fast.

I have an url, something like http://host/controller/action/argument/named:1/?query1=1. I want to add another query param to look it like http://host/controller/action/argument1/argument2/named:1/?query1=1&query2=2. I fact I want to add query2=2 to all URLs on a particular page, through some callback or something.

An URL may or may not have query params in the existing page URL.

How do I do it?

Upvotes: 0

Views: 118

Answers (2)

Arvind K.
Arvind K.

Reputation: 1294

May be I am thinking too much of it but here is how it came out. I put it in a UtilityHelper.

function urlmodify($params = array(), $baseurl = true)  {

  $top_level_1 = array('plugin', 'controller', 'action'); //top level vars
  $top_level_2 = array('pass', 'named'); //top level vars

  //for integrated use
  $top_level = array_merge($top_level_1, $top_level_2); 

  $urlparams = array();
  //get top level vars
  foreach($top_level as $k)  {
    if(in_array($k, $top_level_1))  {
      $urlparams[$k] = $this->request->params[$k];
    }
    if(in_array($k, $top_level_2))  {
      $$k = $this->request->params[$k]; //create $pass & $named
    }
  }
  //get query vars
  if($this->request->query) {
    $urlparams['?'] = $this->request->query;
  }
  //check for custom pass vars
  if(isset($params['pass']))  {
    $pass = array_merge($pass, $params['pass']);
  }
  //pass var has to be in numarical index
  foreach($pass as $v) {
    array_push($urlparams, $v);
  }
  //check for custom named vars
  if(isset($params['named']))  {
    $named = array_merge($named, $params['named']);
  }
  //pass var has to be in key=>value pair
  foreach($named as $k=>$v) {
    $urlparams[$k] = $v;
  }
  //check for custom query vars
  if(isset($params['?'])) {
    $urlparams['?'] = array_merge($urlparams['?'], $params['?']);
  }
  return Router::url($urlparams, $baseurl);
}

}

I have an URL: http://localhost/project/exlplugin/logs/manage_columns/1/a:1/n:1/?b=1. On some links I want to add some certain parameters. Here is the result when i call

echo $this->Utility->urlmodify(array('pass'=>array(2), 'named'=>array('m'=>2), '?'=>array('c'=>2)));*

It gives: http://localhost/thecontrolist/spreadsheet/logs/manage_columns/1/2/a:1/n:1/m:2?b=1&c=2

I just wanted to add just a query parameter to all my listing urls deleted=0 or deleted=1 for the SoftDelete thing :)

Thank you @u2460470 for the answer but it's just about modifying (not removing or creating anything but just adding some params to) current URL on a view page.

Upvotes: 0

Supravat Mondal
Supravat Mondal

Reputation: 2584

Example url : http://www.example.com/myController/myAction/param1:val1/param2:val2

You can use :

$this->redirect(array("controller" => "myController", 
                  "action" => "myAction",
                  "param1" => "val1",
                  "param2" => "val2",
                  $data_can_be_passed_here),
            $status,
            $exit);

Hope it helps you.

Upvotes: 1

Related Questions