Помогите разобраться с PHP MVC AJAX

162
08 июля 2019, 13:30

Помогите разобраться как сделать запись в базу и вывод на страницу без перезагрузки страницы, моя мысль такова при переходе по url, в моем случае корневая папка сайта, используется контроллер CommentsController, его метод actionComment вызывает статические методы модели, Comments::addComents на запись в базу Comments::getComments() на вывод из базы. без ajax все работает исправно с ajax добавляет на страницу но не пишет в базу, я так понимаю у меня проблема с url к контроллеру(пробовал разные варианты подключения ) Роутинг `

class Router{
        private $routes;
        public function __construct(){
            $routersPath = ROOT.'/config/routers.php';
            $this->routes = include($routersPath);
        }
        private function getURI(){
            if (!empty($_SERVER['REQUEST_URI'])) {
                return trim($_SERVER['REQUEST_URI'], '/');
            }
        }
        public function run(){
            $uri = $this->getUri();
            foreach ($this->routes as $uriPattern => $path){
                if (preg_match("~$uriPattern~", $uri)){
                    $internalRoute = preg_replace("~$uriPattern~", $path, $uri);
                    $segments = explode('/', $internalRoute);
                    $controllerName = array_shift($segments).'Controller';
                    $controllerName = ucfirst($controllerName);
                    $actionName = 'action'.ucfirst(array_shift($segments));
                    $parameters = $segments;
                    $controllerFile = ROOT . '/controllers/' . $controllerName . '.php';
                    if (file_exists($controllerFile)){
                        include_once ($controllerFile);
                    }
                    $controllerObject = new $controllerName;
                    $result = $controllerObject->$actionName($parameters);
                    if ($result != null){
                        break;
                    }
                }
            }
        }
    }`

Роутинг

return array(
        '' => 'comments/comment');

Вот код контроллера

    class CommentsController {
    public function actionComment() {
        if (isset($_POST['submit'])){
            $name = $_POST['name'];
            $email = $_POST['email'];
            $comments = $_POST['comments'];
            $result = Comments::addComents($name, $email, $comments);
        }
        $commentsList = Comments::getComments();

        require_once(ROOT. '/views/comments/comments.php');
        return true;
    }
}

МОДЕЛЬ

    class Comments {
    public static function addComents($name, $email, $comments){
        $db = Db::getConnection();
        $sql = 'INSERT INTO user_comments (name, email, comments) '
                .'VALUES (:name, :email, :comments)';
        $result = $db->prepare($sql);
        $result->bindParam(':name', $name, PDO::PARAM_STR);
        $result->bindParam(':email', $email, PDO::PARAM_STR);
        $result->bindParam(':comments', $comments, PDO::PARAM_STR);
        $result->execute();
    }
    public static function getComments(){
        $db = Db::getConnection();
        $commentsList = array();
        $sql = 'SELECT id, name, email, comments '
                                    . 'FROM user_comments '
                                    . 'ORDER BY id DESC '
                                    . 'LIMIT 9';
        $result = $db->query($sql);
        $i = 0;
        while($row = $result->fetch()){
            $commentsList[$i]['name'] = $row['name'];
            $commentsList[$i]['email'] = $row['email'];
            $commentsList[$i]['comments'] = $row['comments'];
            $i++;
        }
        return $commentsList;
    }
}

INDEX

$router = new Router();
$router->run();

Форма

<form action="" method="POST" id="form-message">
            <div class="form-group-wrapper">
              <div class="form-group">
                <label for="name">Имя</label>
                <input type="text" class="form-control" id="name" name="name">
                <label for="email">E-Mail</label>
                <input type="email" class="form-control" id="email" name="email">
              </div>
            </div>
            <div class="form-group form-group-flex">
              <label for="comments">Комментарий</label>
              <textarea class="form-control" id="comments" rows="" name="comments"></textarea>
            </div>
            <div class="col-xs-12 text-right reset-padding">
              <button type="submit" name="submit" class="btn btn-danger" id="btn-submit">Записать</button>
            </div>
          </form>

Проверка формы и Ajax запрос

$(document).ready(function(){
    $('#form-message').on('submit', function(e){
        e.preventDefault();
                console.log('asfd')
        var form = $(this);
        var name = $('#name');
        var email = $('#email');
        var comments = $('#comments');
        if(name.val() == ''){
            name.css("border", "1px solid red");
            return;
        } else {
            name.css("border", "1px solid transparent");
        }
        if(email.val() == ''){
            email.css("border", "1px solid red");
        }
        else {
            var r = /^([a-z0-9_\.-])+@[a-z0-9-]+\.([a-z]{2,4}\.)?[a-z]{2,4}$/i;
            if (!r.test(email.val())) {
                email.css("border", "1px solid red");
                return;
            }
            else {
                email.css("border", "1px solid transparent");
            }
        } 
        if(comments.val() == ''){
            comments.css("border", "1px solid red");
            return;
        } else {
            comments.css("border", "1px solid transparent");
        }
            $.ajax({
          type: "POST",
          async: false,
          url: "../../controllers/Comments",
          data: 'email='+email.val()+'&name='+name.val()+'&comments='+comments.val(),
          dataType: "html",
          success: function(data) {
            console.log('success')
            $('.message-container').append(
                    '<div class="col-md-4 col-sm-6 col-xs-12 comment-item">'+
                      '<div class="item text-center">'+
                        '<div class="item-header">' +
                          name.val() +
                        '</div>' +
                        '<div class="item-body">' +
                          '<div class="item-body-email">'+ email.val() +'</div>' +
                          '<div class="item-body-message">' + comments.val() + '</div>'+
                        '</div>'+
                      '</div>' +
                    '</div>'
            );
            //$form.trigger( 'reset');
          }
        });
    })
});
Answer 1

Разобрался, проблема была в контроллере, в изменил условие if в ajax запросе url пустой

class CommentsController {
    public function actionComment() {
        if (isset($_POST['name'], $_POST['email'], $_POST['comments'])){
                $name = $_POST['name'];
                $email = $_POST['email'];
                $comments = $_POST['comments'];
                $result = Comments::addComents($name, $email, $comments);
        }
        $commentsList = Comments::getComments();
        require_once(ROOT. '/views/comments/comments.php');
        return true;
    }
} 
READ ALSO
Запуск flowplayer из списка

Запуск flowplayer из списка

История такая: я вывожу из базы адреса и названия видео роликов и помещаю их спискомПроигрыватель хочу использовать flowplayer

161
Как добавить точки на гугл карту, сгенерированные php

Как добавить точки на гугл карту, сгенерированные php

нужно в js добавить точки на карте, которые тащаться с mysqlКак это реализовать

166
Как переместить папку в laravel используя Storage?

Как переместить папку в laravel используя Storage?

Как переместить папку с подпапками и файлами в ларавел используя Storage?

147
Как выделить дин. память для char[]?

Как выделить дин. память для char[]?

Собсна, насколько я понял, я не могу изменять строку, если я инициализировал на неё указатель, примером, char* a("dududu"); (вызывается исключение...

530