(顺便说一下重大消息:cake出稳定版了^_^)
Router代码如下:
1. Router::connect('/admin/:controller/:action/*', array('prefix' => 'admin', 'admin' => true));
当表单Add时候,也就是
1. $form->create('Model', array('url' => array('admin' => true)));
生成的代码是/admin/models/add,正是所期望的。
但是表单为编辑时,也就是$this->data填充了$form表单值后,问题就出来了,同样上面的create代码,生成的结果却为/models/edit/{id}/admin:1。
这显然不是我们所要的,正确应当为/admin/models/edit/{id}。
这个问题困扰了我很久,一直找不出十分完美的解决方案。
起先采用更改$form->create时,url写成绝对路径,如
1. $form->create('Model', array('url' => Router::url(array('action' => 'admin_edit', 'admin' => true, $form->value('Model.id')))));
但是实在是别扭,总感觉没达到cake懒人的要求。
后来,翻了formHelper源码,貌似当表单为编辑时,url里,会自动多出个参数(named)id。
大概源码如下:
1. ......
2. if ($recordExists) {
3. $created = true;
4. $id = $this->data[$model][$data['key']];
5. }
6. ......
7. $actionDefaults = array(
8. 'plugin' => $this->plugin,
9. 'controller' => $view->viewPath,
10. 'action' => $options['action'],
11. 'id' => $id
12. );
所以问题就来了,因为我的路由规则是
1. Router::connect('/admin/:controller/:action/*', array('prefix' => 'admin', 'admin' => true));
是不带named形式参数的。所以,上面编辑表单时的url路径当然就不匹配了。
在此规则后,再添加如下规则
1. Router::connect('/admin/:controller/:action/:id', array('prefix' => 'admin', 'admin' => true));
一切完美……
http://www.71151461.cn/articles/view/35