0

在 cakephp 2.3 中:

假设我有一个由controllerX. 我开始填写数据,在某处有一个用于执行某些任务的按钮,该按钮将打开一个由controllerYfor生成的新表单(模态窗口) 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>&nbsp;&nbsp;';
            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());
    }
4

1 回答 1

0

不是一个“完整”的答案,而是一些可能有助于实施解决方案的建议;

选项 1 - 自动保存(草稿)

实施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);
    }
}

选项 2 - 灯箱

另一种选择是在灯箱中打开“中断”表单;当前正在处理的表单将保持打开状态,提交灯箱表单不会中断此操作。

更新 - 一些建议

基本上,您想要实现的是;

  • 用户选择一个组织,输入备注并提交表单
  • 如果组织尚不存在,则允许用户通过模式/弹出窗口添加新组织。通过模态添加后选择该组织,输入备注并填写表格。

使用 AJAX 提交 Modal 框

目前,您的模态窗口将通过“常规”提交而不是通过 AJAX 提交,因此页面将在提交模态框后重新加载。

您应该通过 AJAX 提交 Modal 框,然后使用 AJAX“完成”处理程序将新创建的组织附加到下拉列表中。

但是,由于您还必须在 Modal 框中显示组织的验证错误,因此最好也通过 AJAX加载“添加组织表单”。

所有这些都需要对您的代码额外的 JavaScript 进行相当多的更改来执行 AJAX 处理。

创建新组织,同时提交备注

基本上,将两种形式组合成一个形式;

  • 默认情况下,“组织”的输入字段是隐藏的
  • 如果用户从下拉列表中选择现有组织,“组织”字段将保持隐藏状态
  • 如果用户从下拉列表中选择“其他组织...”,“组织”字段将变为可见,用户可以输入新组织的详细信息

提交表格后:

  • 如果用户选择了“其他组织...”,则插入新组织并使用新组织的“id”插入“备注”。
  • 如果用户选择了现有组织,则仅插入备注。
于 2013-04-03T21:38:54.140 回答