这个问题是在维护一个用 CakePHP 1.3 编写的应用程序时出现的。请记住,虽然我可以并且确实阅读了文档,但我对 Cake 的经验非常有限。
该应用程序有一个 Widget 模型和一个 WidgetController。编辑 Widget 时,用户可选择的一种选择是以三种模式之一将数据大量导入 Widget:添加、删除或用导入的内容替换 Widget 数据。
当前的实现完全是一团糟(有一个“编辑”操作执行 Widget 支持的所有 10 种左右不同的变异功能;它通过从提交的表单中嗅探参数来决定要做什么),所以我打破了“大量的东西”变成一个新的动作:
function batch($id)
{
// massively apply data to Widget $id; either add, remove or replace
}
此操作由“编辑”视图中的表单触发:
// Only relevant elements shown
echo $form->create('Widget', array('enctype'=>'multipart/form-data', 'action' => 'batch')); ?>
echo $form->input('id');
echo $form->input('action', array('type'=>'select',
'options'=>array(
'append'=>__('Append', true),
'replace'=>__('Replace existing', true),
'delete'=>__('Delete specified', true)
));
echo $form->end(); ?>
就目前而言,这种形式将action
参数捆绑到Widget
数组中,我可以从控制器中获取它的唯一方法是使用$this->data['Widget']['action']
.
这是丑陋的并且在语义上是错误的,所以我希望有更好的方法来做到这一点。
理想情况下,我想提交到 URL /widget/batch/X/append
,但这是不可能的,因为该append
部分没有固定。所以我会解决以下任何一个问题:
- 以某种方式将操作作为控制器参数传递,例如
$id
- 以某种方式将动作作为命名参数传递,允许
$this->params['named']['action']
- 其他一些不需要安装自定义路由且不需要 JavaScript 的方式
Cake 1.3 能做到这一点吗?