1

我正在尝试模拟以下工作场景。在 cakephp 博客文章的编辑阶段,我需要添加Prev&Next按钮。当我按下 时Next,我需要保存当前表单,并且下一篇博客文章需要以编辑模式出现。

在我的编辑表单中,我有:

//form create
echo $this->Html->link('Next', 
    array('controller' => 'posts', 'action' => 'next', $id, $nextId), 
    array('class' => 'btn', 'escape' => false)
  );
//inputs
//form submit

中的next()方法PostsController如下所示:

  <?php
  // ... 
  public function next($id = null, $nextId = null) {
    $this->Post->id = $id;
    if (!$this->Post->exists()) {
        throw new NotFoundException('Invalid id', 'info');
    }
  debug($this->request);
    //if ($this->request->is('post') || $this->request->is('put')) {
        if ($this->Post->save($this->request->data)) {
            $this->Session->setFlash('saved', 'ok');
            $this->redirect(
              array('controller'=>'posts', 
                    'action' => 'edit', 
                    $nextId));
        } else {
            $this->Session->setFlash('cant save', 'error');
        }
    //}
}

乍一看,request->data是空的,我不知道为什么。那么问题来了:我的逻辑OK吗?我可以使用这种方法解决我的问题吗?

你能分享一个更好的解决方案吗?

4

2 回答 2

1

@nahri 是正确的,因为您没有通过单击上一个或下一个链接来提交表单数据。

为简单起见,您应该在表单中包含多个提交按钮,以确保数据被提交,但为它们提供适当的名称,以便您可以在控制器中相应地处理请求:

在您看来:

echo $this->Form->submit('Next', array('name'=>'next'));
echo $this->Form->submit('Previous', array('name'=>'previous'));

在您的控制器中

if($this->request->is('post') && (isset($this->data['next']) || isset($this->data['previous')) {
    // save post as draft...
    // then redirect 
    if(isset($this->data['next'])){
        $this->redirect(array('action' => 'next'));
    }else{
        $this->redirect(array('action' => 'previous'));
    }
}

上面的代码应该说明了实现所需功能的一种方式的原理——您需要为您的应用程序定制它。

请记住,您仍然将表单发回,就像您实际保存它一样(即使是相同的操作),唯一的区别是您的上一个或下一个按钮的存在被附加到表单数据中。

我怀疑如果这没有按照您希望的方式进行,那么您可能必须将表单 AJAX 回服务器,然后在 JavaScript 中重定向窗口。

于 2013-04-28T11:20:46.357 回答
0

您没有提交表单,这就是为什么$this->request->data是空的。

你可以这样做:

$this->Form->create('YourModelName', array('action' => 'next'));

// here you want to include your $next value as a hidden form field
$this->Form->input('next', array('type' => 'hidden', 'value' => $next));

// rest of your form
//..  

$this->Form->end(__('Submit'));

然后您可以使用控制器中的逻辑来保存数据并重定向到下一个编辑页面。(值将在$this->request->data['YourModelName']['next'])。

于 2013-04-28T10:02:19.783 回答