调用cakephp 2控制器函数而不呈现视图(autoRender false不起作用)

nbnkbykc  于 2022-11-12  发布在  PHP
关注(0)|答案(1)|浏览(172)

我试图在加载页面时提交一个隐藏的表单,为此我在控制器中创建了一个函数。我的问题是我不想离开当前视图,但我也不能重定向到我想停留的视图,因为这将创建一个加载页面的恒定循环,在加载完成后调用我的函数,然后再次重定向。因此,我希望在不重定向到前一个视图的情况下调用此函数,但也不呈现新视图,为此我使用了以下代码:

$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视图。

7d7tgy0s

7d7tgy0s1#

如果只有一个(或几个)操作加载此表单,则可以在操作中处理此问题。
在最初呈现表单的控制器操作中,检查post和数据,执行您需要的操作,然后完成操作的其余部分并完成视图的呈现。您不必在post时重定向。
通过这种方式,在保存成功时,您可以设置一个请求数据参数,该参数可以反映在视图中,如果设置了,JS不会“重新触发”表单。
从用户体验的Angular 来看,@施密特的 AJAX 想法是一个更好的解决方案,我会选择它而不是我的建议。

相关问题