【问题标题】:Call cakephp 2 controller function without rendering view (autoRender false not working)在不渲染视图的情况下调用 cakephp 2 控制器函数(autoRender false 不起作用)
【发布时间】:2021-01-31 05:18:34
【问题描述】:

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

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

【问题讨论】:

  • 用户应该看到什么而不是空白页?
  • 用户应该看到调用隐藏表单的视图,该视图由一个带有一些加载文本的页面和另一个可以编辑文本的表单组成。起初,我也调用此视图的方法来保存图形,但是当保存这些文本时,页面被重定向到同一页面但重新加载文本,这将导致我之前提到的无限循环。我希望我已经设法解释了自己。
  • 当您的表单被发布时,浏览器将从显示表单的页面转到处理表单的页面。默认情况下,这就是表单的工作方式。如果您想保留原始页面,则需要通过 Ajax 发布表单。

标签: javascript jquery cakephp view cakephp-2.0


【解决方案1】:

如果只有 1 个(或几个)动作加载此表单,您可以在动作中处理。

在最初呈现表单的控制器操作中,检查帖子和数据,执行您需要的操作,然后完成其余操作并完成视图渲染。您不必在帖子上重定向。

这样保存成功后可以设置请求数据参数,可以反映在视图中,如果设置了,JS不会“重新触发”表单。

@Greg Schmidt 在 UX 方面的 AJAX 想法是一个更好的解决方案,任何一天我都会选择它而不是我的建议。如果您不想使用 AJAX,我只建议这样做

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 2018-02-24
    相关资源
    最近更新 更多