Для примера приведу упрощенный код. Задача — разделить одно число на другое, ответ получить на той же странице.
Контроллер называется division.
<?php class division extends cmsFrontend { public function actionIndex() { $form = $this->getForm("division"); $errors = false; $numbers = []; $template = cmsTemplate::getInstance(); $template->render("index", [ "form" => $form, "errors" => $errors, "numbers" => $numbers ]); } public function actionCalc() { if ($this->request->isAjax() === false) { exit; } $post = (object)$_POST; $reply["result"] = (float)$post->source / (float)$post->divider; $reply["msg"] = "Расчет выполнен."; } else { $reply["result"] = "-"; $reply["msg"] = "Данные некорректны. Расчет не выполнен."; } echo $s; exit; } }
<?php class formDivisionDivision extends cmsForm { public function init() { return [ [ "type" => "fieldset", "childs" => [ new fieldNumber("source", [ "title" => "Исходное число", "rules" => [ ["required"] ] ]), new fieldNumber("divider", [ "title" => "Делитель", "rules" => [ ["required"] ] ]) ] ] ]; } }
<?php $d = "Деление"; $this->setPageTitle($d); $this->addBreadcrumb($d); ?> <h1><?php echo $d; ?></h1> <?php $this->renderForm($form, $numbers, [ //"action" => "", //"method" => "post", "submit" => ["title" => "Рассчитать", "id" => "calc"] ], $errors); ?> <div id="result"></div> <div id="msg"></div> <script> $('#calc').on('click',function(e) { var source = $('#source').val(); var divider = $('#divider').val(); $.ajax({ url: 'calc', data: { 'source' : source, 'divider' : divider}, type: 'post', success: function(response){ $('#result').html(response.result); $('#msg').html(response.msg); } }); e.preventDefault(); }); </script>
1. Как в шаблоне получить id формы? Чтобы не ковырять зачения так: var source = $('#source').val();
2. Почему в JS адрес обработчика формы задаётся фактически экшеном url: 'calc' ?
3. В моём варианте не работает атрибут required в input, что досадно.
Понимаю, что пошел своим путём и можно всё сделать "классически", но как это сделать пока не знаю.