Добрый день! Недавно столкнулся с задачей реализовать AJAX на MVC. Думаю это является тривиальной задачей и во всех фреймворках реализована. Но вот в интернете я не нашёл того, что мне было нужно и пришлось делать самому. Данная задача у меня появилась в учебных и производственных целях. Мой руководитель поручил сделать простое web-приложение для отработки возражений клиентов во время телефонного разговора. Приложение нужно было сделать как можно быстрее. Оно должно было быть производительным и работать без перезагрузок. Так как я пока не овладел никакими фреймворками для создания SPA, то решено было сделать на MVC с использованием AJAX и Jquery, тем более что мне это очень интересно.
Роутер подключает файл с роутами и получает путь, введённый в адресной строке. Далее он проходит по роутам и сопоставляет его с адресом. Если он находит совпадение, то подключает соответствующий класс и вызывает метод, и передаёт параметры.
Роут: ‘view-ajax.php’=>’ajax/MakeAjax’
Если мой роутер получит путь view-ajax.php, то подключит класс (php) AjaxController (ajax) и использует его метод actionMakeAjax (MakeAjax)
$.post( "view-ajax.php", {'action': 'AddNotes', 'TEL': tel, 'TEXT': text}, function( data ) { $( ".notes" ).html( data ); });
Метод Jquery $.post посылает запрос по адресу view-ajax.php и сообщает ему объект: {‘action’: ‘AddNotes’, ‘TEL’: tel, ‘TEXT’: text}, где AddNotes это метод, который я вызываю в классе. Это очень похоже на то, как это реализовано в wordpress, можете ознакомиться с wordpress ajax в моей статье.
class AjaxController { public function actionMakeAjax(){ $actionName = $_POST['action']; $params = $_POST; unset($params['action']); $actionFile = ROOT . '/models/ajax/makeAjax.php'; $actionFile = str_replace('/', '\\', $actionFile); if (file_exists($actionFile)){ include_once($actionFile); } $action = 'make'.$actionName; $controllerObject = new makeAjax(); $result = call_user_func_array(array($controllerObject, $action), $params); return true; } }
AjaxController содержит единственный метод actionMakeAjax. В нём я получаю название action’а и остальные переданные параметры. Далее я подключаю модель(класс) makeAjax.php, в которой содержатся все функции, которые могут быть в вызваны по AJAX.
Второй шаг: я определяю название action’а (метода класса makeAjax) $action = ‘make’.$actionName; и создаю экземпляр объекта $controllerObject = new makeAjax();
Далее я вызываю метод класса и передаю ему параметры строкой. $result = call_user_func_array(array($controllerObject, $action), $params);
Данная запись позволяет передавать параметры как переменные, а не хранить их в $_POST. Однако вам потребуется знать очерёдность пришедших переменных, чтобы верно их именовать.
Обращаю внимание на строку $actionFile = str_replace(‘/’, ‘\\’, $actionFile); Данная строка требуется только для разработки на компьютерах windows и её требуется убрать перед заливкой на сервер.
Класс makeAjax() содержит методы класса по определённому правилу именования приставка всегда make и далее название action’а который вы передаёте в $.post Jquery
Для ‘action’: ‘AddNotes’ метод класса makeAjax() будет назван makeAddNotes()
Это пример для ‘action’: ‘GetPost ‘
public function makeGetPost($id){ $id = intval($id); if($id){ $db =Db::getConnection(); $result = $db->query('SELECT `detail_text` from `data-text` WHERE id=' . $id); $result->setFetchMode(PDO::FETCH_ASSOC); $result->execute(); $res = $result->fetch(); //$newsItem = $result->fetch(); //var_dump($newsItem); $res = $res['detail_text']; echo $res; return true; } }
Этот метод печатает детальный текст записи по её id. У вас может быть любая другая функция, которая вам нужна. Главное, что вы сможете расширять вашу модель и без проблем пользоваться AJAX в MVC.
Если что-то непонятно задайте вопрос в комментариях!