Вызовите функцию контроллера 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