Cakephp:临时转到另一种形式时如何保持表格填充?

时间:2013-04-03 19:36:15

标签: cakephp cakephp-2.3

在cakephp 2.3中:

假设我有controllerX生成的表单。我开始填写数据,某处有一个按钮用于执行某项任务,该按钮将打开controllerYModelY生成的新表单(模态窗口)。 每当我完成第二种形式时,我都会丢失所有我填写的第一种形式。 我尝试了几件事,包括重定向到$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());
    }

1 个答案:

答案 0 :(得分: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 - 灯箱

另一种选择是在灯箱中打开“打断”表格;目前正在处理的表格将保持打开状态,提交灯箱表格不会打断这个。

更新 - 一些建议

基本上,你想要达到的是;

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

使用AJAX提交模态框

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

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

但是,因为您还必须在“模式”框中显示组织的验证错误,所以加载“添加组织表单”可能更好也可以通过AJAX。

所有这些都需要对您的代码进行一些更改其他JavaScript才能执行AJAX处理。

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

基本上,将两种形式合并为一种形式;

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

提交表格后:

  • 如果用户选择了“其他组织......”,请插入新组织并使用新组织的“ID”插入“评论”。
  • 如果用户选择现有组织,则只插入备注。