在cakephp 2.3中:
假设我有controllerX
生成的表单。我开始填写数据,某处有一个按钮用于执行某项任务,该按钮将打开controllerY
为ModelY
生成的新表单(模态窗口)。
每当我完成第二种形式时,我都会丢失所有我填写的第一种形式。
我尝试了几件事,包括重定向到$this->referrer()
,但都没有用。
由于
更新1) 我正在添加一段代码: 注意:我正在使用twitter bootstrap。下面的代码是从“违规”添加视图。在此表单中,我想让用户添加一个新的组织。
<script type="text/javascript">
/****** helper functions *******/
function onClickAddOrgLink() {
$('#myModal').modal();
}
</script>
<?php
echo $this->Form->create();
echo $this->Form->input('number');
echo $this->Form->input('organization_id');
//Add new organization button
echo '<a id="addOrgLink" href="#myModal" role="button" class="btn" data-toggle="modal">Add new Org</a>';
$this->Js->get('#addOrgLink')->event('click', 'onClickAddOrgLink()');
echo $this->Form->input('remarks', array('type'=>'textarea','rows'=>'6'));
echo $this->Form->end(array('class'=>'btn btn-primary', 'div'=>false,'name'=>'submit', 'label' => 'add'));
?>
<!-- Modal -->
<div id="myModal" class="modal hide fade" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h3 id="myModalLabel">adding a new org</h3>
</div>
<div class="modal-body">
<p>
<?php
echo $this->Form->create('Organization', array('controller'=>'organizations', 'action'=>'add'));
echo $this->Form->input('company_name', array('div'=>false));
echo $this->Form->input('address1', array('div'=>false));
echo ' <div class="modal-footer">
<button class="btn" data-dismiss="modal" aria-hidden="true">cancel</button> ';
echo $this->Form->end(array('class'=>'btn btn-primary', 'div'=>false, 'name'=>'submit', 'label' => 'ADD'));
echo '</div>';
?>
</p>
</div>
</div>
这是添加新的组织操作:
var $helpers=array('Session', 'Js', 'Html');
public function add() {
$this->autoRender=false;
$this->Organization->create();
$this->Organization->save($this->request->data);
$this->redirect($this->referer());
}
答案 0 :(得分:0)
不是一个“完整”的答案,而是一些可能有助于实施解决方案的建议;
实施autosave
;在包含表单的任何页面上,添加一个JavaScript,用于以特定间隔(例如,每隔xx秒)将表单(通过AJAX)提交到服务器端自动保存处理程序或,当用户导航到页。
服务器端处理程序将提交的数据存储在会话中,使用页面的URL作为“标识符”(例如/ Users / edit / 123)。返回页面时,检查会话中是否存在草稿(自动保存),并使用该信息填写请求数据;
public function beforeRender() {
if (!$this->request->is('post')) {
// restore autosave data for the current url if no form is posted
$this->request->data = $this->AutosaveComponent->restore($this->request->here);
} else {
// form is posted; flush the autosave data for the current URL
$this->AutosaveComponent->flush($this->request->here);
}
}
另一种选择是在灯箱中打开“打断”表格;目前正在处理的表格将保持打开状态,提交灯箱表格不会打断这个。
基本上,你想要达到的是;
目前,您的模态窗口将通过“常规”提交而不是通过AJAX提交,因此在提交模式框后将重新加载页面。
您应该通过AJAX提交模态框,然后使用AJAX“完整”处理程序将新创建的组织附加到下拉列表。
但是,因为您还必须在“模式”框中显示组织的验证错误,所以加载“添加组织表单”可能更好也可以通过AJAX。
所有这些都需要对您的代码进行一些更改和其他JavaScript才能执行AJAX处理。
基本上,将两种形式合并为一种形式;
提交表格后: