我正在尝试模拟以下工作方案。在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
是空的,我不知道为什么。然后,问题是:我的逻辑是否正常?我可以用这种方法解决我的问题吗?
你能分享一个更好的解决方案吗?
答案 0 :(得分: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'));
}
}
上面的代码应该说明您可以通过一种方式实现所需功能的原则 - 您需要为应用程序自定义它。
请记住,您仍然将表单发回,就好像您实际保存它一样(即使是相同的操作),唯一的区别是您的上一个或下一个按钮的存在会附加到表单数据。< / p>
我怀疑如果不按照您希望的方式执行此操作,那么您可能需要将AJAX表单重新发送回服务器,然后使用JavaScript重定向窗口。
答案 1 :(得分: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']
)。