我试图在加载页面时提交一个隐藏的表单,为此我在控制器中创建了一个函数。我的问题是我不想离开当前视图,但我也不能重定向到我想停留的视图,因为这将创建一个加载页面的恒定循环,在加载完成后调用我的函数,然后再次重定向。因此,我希望在不重定向到前一个视图的情况下调用此函数,但也不呈现新视图,为此我使用了以下代码:
$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/保存_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;
}
目前,使用此代码可以成功地存储数据,但用户最终得到的是一个空视图,因为控制器试图呈现保存_data视图。
1条答案
按热度按时间7d7tgy0s1#
如果只有一个(或几个)操作加载此表单,则可以在操作中处理此问题。
在最初呈现表单的控制器操作中,检查post和数据,执行您需要的操作,然后完成操作的其余部分并完成视图的呈现。您不必在post时重定向。
通过这种方式,在保存成功时,您可以设置一个请求数据参数,该参数可以反映在视图中,如果设置了,JS不会“重新触发”表单。
从用户体验的Angular 来看,@施密特的 AJAX 想法是一个更好的解决方案,我会选择它而不是我的建议。