我正在使用 CakePHP 2.2.3 版我有一个带有搜索框的元素和一些使用 CakeDC 搜索插件的下拉菜单。它工作得很好,只需传递 URL 中选择/搜索的项目,如 www.mydomain.com/products/cid:1/mid:3/terms:these%20terms 其中 cid 是类别 id,mid 是制造商 id。
我创建的页面允许您单击一个类别以查找该类别中的所有产品,但我无法在元素中获取类别选择框来选择它所在页面的类别。如果我使用与我的元素提交的 URL 结构相同的 URL 结构,但我想要一个干净的 SEO URL,所以我设置了以下自定义路由:
/**
* 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]+'
)
);
这会产生一个漂亮的 URL,但不会预先选择我的选择列表的值。
我能够让它在我的元素中使用下面的代码,但它似乎“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 ) '));
}
另外,在我的控制器中我试过这个:
$this->params['named']['cid'] = $this->params['pass']['0'];
但我收到此错误:CakeRequest 的重载元素的间接修改无效
我相信如果使用命名参数,插件会自动设置选定的值,除非那是蛋糕的默认行为。 如何将传递的参数转换为命名参数,或者我可以强制我的插件使用传递的参数?
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
谢谢