将用户提供的(但与模型无关)参数传递给控制器​​?

时间:2012-12-27 14:02:05

标签: php cakephp cakephp-1.3

在维护用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']
  • 其他一些不需要安装自定义路线且不需要JavaScript的方法

Cake Cake 1.3可以做到吗?

1 个答案:

答案 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');
        }
    }
}

通过这种方式,您可以将现有代码重构为更易于管理和逻辑的方法。