问题描述
每次加载页面时,我都试图提交一个隐藏的表单,为此我在控制器中创建了一个函数。我的问题是我不想离开当前视图,但是我不能重定向到我想停留的视图,因为那样会创建一个不断的页面加载循环,加载完成后调用我的函数,然后再次重定向。因此,我想在不重定向到上一个视图的情况下调用此函数,但是也没有渲染新视图,为此我正在使用以下命令:
$this->autoRender = false;
$this->layout = false;
$this->render(false);
尽管如此,这些行似乎对我不起作用,因为该动作一直被重定向到此函数,尝试呈现不存在的视图,而不是停留在前一个视图中。因此,我想知道是否还有另一种方法可以在控制器中调用一个函数,但仍停留在我所在的页面上(由于循环方面,因此不进行重定向)。如果有帮助,我将添加用于此操作的代码:
这是我要保持呈现的视图的一部分,我具有与隐藏表单相关的功能
<?= $this->Form->create('Save data',array('url'=>'/exportations/save_data/'.$id,'enctype' => 'multipart/form-data','method' => 'post','id' => 'data'))?>
<input type="hidden" id="svgGraph" />
<div class="" id="cont" style="display:none;"></div>
<?=$this->Form->end()?>
</div>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function(){
var chart = Highcharts.chart( // code to create graph
);
var svg = chart.getSVG();
$("#svg1").val(svg1);
});
$(document).ready(function () {
document.getElementById('data').submit();
});
</script>
这是我当前的控制器'/ exportations / save_data /'函数:
public function save_data(){
$this->autoRender = false;
$this->layout = false;
$this->render(false);
if($this->request->is('post')) {
$data = $this->request->data;
$exportation = $this->Exportation->save($data);
}
return;
}
当前,使用此代码成功存储了数据,但是由于控制器尝试呈现save_data视图,用户最终得到了一个空视图。
解决方法
如果只有 1 个(或几个)操作加载此表单,您可以在操作中处理。
在最初呈现表单的控制器操作中,检查帖子和数据,执行您需要的操作,然后完成其余操作并完成呈现视图。您不必在帖子中重定向。
这种保存成功的方式你可以设置一个请求数据参数,它可以反映在视图中,如果设置,JS不会“重新触发”表单。
@Greg Schmidt 在 UX 方面的 AJAX 想法是一个更好的解决方案,我会在任何一天选择它而不是我的建议。我只在你不想使用 AJAX 时才建议这个