在维护用CakePHP 1.3编写的应用程序时出现了这个问题。请记住,尽管我能够并且确实阅读过文档,但我对Cake的体验非常有限。
该应用程序具有Widget模型和WidgetController。编辑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']
。
这是丑陋和语义错误,所以我希望有更好的方法来做到这一点。
理想情况下,我想提交到网址/widget/batch/X/append
,但这是不可能的,因为append
部分未修复。所以我会解决这些问题:
$id
$this->params['named']['action']
Cake Cake 1.3可以做到吗?
答案 0 :(得分:0)
不,你不能根据post参数将请求路由到不同的动作,也不能用php单独更改表单的动作。这可能与任何框架相同。
理想情况下,我想提交到URL / widget / batch / X / append,但这是不可能的,因为附加部分不是固定的。
唯一的方法是使用javascript - 当然it's not hard to write some appropriate js来做到这一点。
如果您不想在用户更改其选择时使用javascript来操作表单操作,或者只是想要最简单的解决方案 - 您可以使用setAction在内部将请求重定向到更合适,专用,控制器动作:
function batch() {
if (!empty($this->data['Widget']['action'])) {
$this->setAction($this->data['Widget']['action']);
}
}
function append() {
if ($this->data) {
if ($this->Widget->append($this->data)) {
$this->Session->setFlash('Widget appended successfully');
} else {
$this->Session->setFlash('Error: Unable to append widget');
}
}
}
通过这种方式,您可以将现有代码重构为更易于管理和逻辑的方法。