0

这个问题是在维护一个用 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 能做到这一点吗?

4

1 回答 1

0

不,您不能根据 post 参数将请求路由到不同的操作,也不能单独使用 php 更改表单的操作。这可能与任何框架都相同。

理想情况下,我想提交到 URL /widget/batch/X/append,但这是不可能的,因为附加部分不是固定的。

做到这一点的唯一方法是使用 javascript - 当然,编写一些适当的 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');
        }
    }
}

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

于 2012-12-28T19:42:18.427 回答