เรียกใช้ฟังก์ชันคอนโทรลเลอร์ cakephp 2 โดยไม่แสดงมุมมอง (autoRender false ไม่ทำงาน)

ฉันกำลังพยายามส่งแบบฟอร์มที่ซ่อนอยู่ทุกครั้งที่โหลดเพจ ซึ่งฉันได้สร้างฟังก์ชันในคอนโทรลเลอร์ของฉันแล้ว ปัญหาของฉันคือฉันไม่ต้องการออกจากมุมมองปัจจุบัน แต่ฉันไม่สามารถเปลี่ยนเส้นทางไปยังมุมมองที่ฉันต้องการคงอยู่ได้เพราะนั่นจะสร้างการวนซ้ำของการโหลดเพจอย่างต่อเนื่องโดยเรียกใช้ฟังก์ชันของฉันเมื่อการโหลดเสร็จสิ้นแล้ว เปลี่ยนเส้นทางอีกครั้ง ดังนั้น ฉันจึงต้องการเรียกใช้ฟังก์ชันนี้โดยไม่เปลี่ยนเส้นทางไปยังมุมมองก่อนหน้า แต่ไม่แสดงมุมมองใหม่เช่นกัน ซึ่งฉันใช้สิ่งต่อไปนี้:

        $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


person pepito    schedule 16.10.2020    source แหล่งที่มา
comment
ผู้ใช้ควรเห็นอะไรแทนหน้าว่าง?   -  person Greg Schmidt    schedule 17.10.2020
comment
ผู้ใช้ควรเห็นมุมมองที่ใช้เรียกฟอร์มที่ซ่อนอยู่ ซึ่งประกอบด้วยเพจที่มีข้อความที่โหลดบางส่วนและอีกฟอร์มหนึ่งที่สามารถแก้ไขได้ ตอนแรก ฉันกำลังเรียกเมธอดของมุมมองนี้เพื่อบันทึกกราฟด้วย แต่เมื่อบันทึกข้อความเหล่านั้น หน้าจะถูกเปลี่ยนเส้นทางไปยังหน้าเดียวกันแต่โหลดข้อความซ้ำ นั่นอาจทำให้เกิดการวนซ้ำไม่สิ้นสุดที่ฉันกล่าวถึงก่อนหน้านี้ ฉันหวังว่าฉันจะสามารถอธิบายตัวเองได้   -  person pepito    schedule 18.10.2020
comment
เมื่อแบบฟอร์มของคุณถูกโพสต์ เบราว์เซอร์จะไปจากหน้าที่แสดงแบบฟอร์มไปยังหน้าที่เป็นผลจากการประมวลผลแบบฟอร์ม นั่นคือวิธีการทำงานของแบบฟอร์มตามค่าเริ่มต้น หากคุณต้องการเก็บหน้าเดิมไว้ คุณจะต้องโพสต์แบบฟอร์มของคุณผ่าน Ajax   -  person Greg Schmidt    schedule 18.10.2020


คำตอบ (1)


หากมีการดำเนินการเพียง 1 (หรือสองสามรายการ) ที่โหลดแบบฟอร์มนี้ คุณสามารถจัดการได้ภายในการดำเนินการนั้น

ในการดำเนินการกับคอนโทรลเลอร์ที่เรนเดอร์แบบฟอร์มตั้งแต่แรก ให้ตรวจสอบโพสต์และข้อมูล ทำสิ่งที่คุณต้องการ จากนั้นดำเนินการส่วนที่เหลือให้เสร็จสิ้นและเรนเดอร์มุมมองให้เสร็จสิ้น คุณไม่จำเป็นต้องเปลี่ยนเส้นทางในการโพสต์

ด้วยวิธีนี้ เพื่อบันทึกความสำเร็จ คุณสามารถตั้งค่าพารามิเตอร์ข้อมูลคำขอ ซึ่งสามารถสะท้อนให้เห็นในมุมมอง และหากตั้งค่าไว้ JS จะไม่เริ่มการทำงานของแบบฟอร์มอีกครั้ง

แนวคิด AJAX จาก @Greg Schmidt ในแง่ของ UX เป็นทางออกที่ดีกว่า ฉันจะเลือกสิ่งนั้นแทนคำแนะนำของฉันวันไหนก็ได้ ฉันเสนอสิ่งนี้เฉพาะในกรณีที่คุณไม่ต้องการใช้ AJAX

person SidMalde    schedule 04.02.2021