cakephp How can I convert passed params to named params to prefill element form?

711 views Asked by At

I'm using CakePHP version 2.2.3 I have an element with a search box and a few dropdowns that use CakeDC's search plugin. It works great and just passes the selected/searched items in the URL like this www.mydomain.com/products/cid:1/mid:3/terms:these%20terms where cid is category id, and mid is manufacturer id.

I created pages that allow you to click a category to find all products in that category, but I can't get the category select box, in the element, to select the category of the page it is on. It works if I use the same URL structure as my element submits but I want a clean URL for SEO so I setup the following custom route:

/**
* Categories
*/
Router::connect(
    '/products/category/:cid-:slug', // E.g. /products/category/3-my_category
        array('controller' => 'products', 'action' => 'category'),
        array(
            'pass' => array('cid', 'slug'),
            'cid' => '[0-9]+'
    )
);

this results in a nice looking URL but doesn't pre-select the value of my select list.

I was able to get it working with the code below in my element, but it seems "hacky/clunky"

if(isset($this->params['named']['cid']) && !empty($this->params['named']['cid'])){
                echo $this->Form->input('cid', array('label' => false, 'default' => $this->params['named']['cid'], 'options' => $categories, 'empty' => ' ( Category ) '));
            }elseif(isset($this->params['pass']['0']) && !empty($this->params['pass']['0'])){
                echo $this->Form->input('cid', array('label' => false, 'default' => $this->params['pass']['0'], 'options' => $categories, 'empty' => ' ( Category ) '));
            }else{
                echo $this->Form->input('cid', array('label' => false, 'options' => $categories, 'empty' => ' ( Category ) ')); 
                    }

Also, in my controller I've tried this:

$this->params['named']['cid'] = $this->params['pass']['0'];

but I get this error: Indirect modification of overloaded element of CakeRequest has no effect

I believe the plugin automatically sets the selected value if using named params, unless thats a default behavior of cake. How can I convert the passed params to named params, or can I force my plugin to use passed params?

output from var_dump($this->$params):

object(CakeRequest)[9]
public 'params' => 
array
  'plugin' => null
  'controller' => string 'products' (length=8)
  'action' => string 'category' (length=8)
  'named' => 
    array
      empty
  'pass' => 
    array
      0 => string '2' (length=1)
      1 => string 'This_and_that' (length=13)
  'cid' => string '2' (length=1)
  'slug' => string 'This_and_that' (length=13)
public 'data' => 
array
  empty
public 'query' => 
array
  empty

Thanks

0

There are 0 answers