Как отправить ajax при единой точке входа

228
19 декабря 2018, 10:10

Возник такой вопрос, необходимо отправить ajax при загрузке view, но из за того что создана единая точка входа, не можем указать адресс.

Немного кода: .htaccess:

#UTF-8 кодировка 
AddDefaultCharset UTF-8
# Запрещаем доступ просмотра листинга папок 
Options -Indexes
# Разрешаем проходить по символическим ссылкам 
Options +FollowSymLinks
# Включаем mode_rewrite
RewriteEngine On 
#Если запрос идет не к реально существующему файлу 
RewriteCond %{REQUEST_FILENAME} !-f 
# Если запрос идет не к папке
RewriteCond %{REQUEST_FILENAME} !-d
# Тогда запрос идет на index.php
RewriteRule .* index.php [L]

Написан простейший роутер, который скани $_SERVER['REQUEST_URI'] и режет его на части. Пример кода слишком длинный публикации, но постараюсь. /app/core/route.php :

<?php
/**
* Все маршруты тут 
*/
class Route
{
    static function start() 
    {
        //Контролер и действие по умолчанию 
        $controller_name = 'Main';
        $action_name = 'index';
        $params = null;
        $routes = explode('/', $_SERVER['REQUEST_URI']);
        /* Получаем мия контролера 
        routes[0-1] - после разделения будет пустое 
        routes[2] - имя контролера 
        routes[3] - имя экшена 
        routes[4] - параметры  */
        if (!empty($routes[2])){ #если контролер не пуст, перезаписываем его в переменную $controller_name
            $controller_name = $routes[2];
        }
        if (!empty($routes[3])){ #если экшн не пуст, перезаписываем его в переменную $action_name
            $action_name = $routes[3];
        }
        if (!empty(array_slice($routes, 4))) { #если параметр передан, записываем его в переменную $params
            $params = array_slice($routes, 4);
        }
        //Добавление префиксов к файлам 
        $model_name = 'Model_' . $controller_name; #формируется название модели (все модели model_%name%.php)
        $controller_name = 'Controller_' . $controller_name; #формируется название контроллера (все контроллеры controller_%name%.php)
        $action_name = 'action_' . $action_name; #формируется название экшена 
        //Подцепляем файл с классом модели (файла модели может и не быть)
        $model_file = mb_strtolower($model_name) . '.php'; #Добавляем .php в название модели
        $model_path = "app/models/" . $model_file; #Формируем полный адресс к файлу (исходя из правила)
        if (file_exists($model_path)) {
            include "app/models/" . $model_file;
        }
        //Подцепляем файл с классом контроллера 
        $controller_file = mb_strtolower($controller_name) . ".php"; #Добавляем .php в название контроллера
        $controller_path = "app/controller/" . $controller_file; #Формируем полный адресс к файлу (исходя из правила)
        if (file_exists($controller_path)) { 
            include "app/controller/" . $controller_file;
        } else { 
            /*
            Можно плюнуть исключение! 
            Пока редирект на 404 
            */
            Route::ErrorPage404();
        }
        //Если контроллер в файле не определен, то отправляем на 404 
        if (!class_exists($controller_name)) { 
            Route::ErrorPage404();
        } else { 
            //Записываем если определен 
            $controller = new $controller_name;
            $action = $action_name;
            if (method_exists($controller, $action)) { #method_exists - проверяет существует ли метод в классе
                if ($controller_name != 'Controller_auth') {
                    # Вызываем метод
                    if ($controller->check_login_status()) {
                        if ($params) {
                            $controller->$action($params);
                        } else {
                            $controller->$action();
                        }
                    }
                } else {
                    if ($params) {
                        $controller->$action($params);
                    } else {
                        $controller->$action();
                    }
                }
            } else {
                Route::ErrorPage404();
            }
        }

    }   

    //метод 404 (редирект)
    function ErrorPage404()
    {
        $host = 'http://' . $_SERVER['HTTP_HOST'] . '/super_crm/';
        header('HTTP/1.1 404 Not Found');
        header("Status: 404 Not Found");
        header('Location:' . $host . '404'); #редирект на контроллер 404
    }
    function AuthPage()
    {
        $host = 'http://' . $_SERVER['HTTP_HOST'] . '/super_crm/main';
        header('HTTP/1.1 404 Not Found');
        header("Status: 404 Not Found");
        header('Location:' . $host); #редирект на контроллер main
    }
}

Обработка и результат выдается в контроллере app/controller/controller_join.php :

function action_test() { 
        $ajax_test = $this->model->ajax_test();
        $ajax_json = json_encode($ajax_test, JSON_UNESCAPED_UNICODE);
        //header('Content-Type: application/json; charset=UTF8');
        return ($ajax_json);
}

Результат при хардкоде тесте выдается, все как нужно в JSON.

Сам AJAX отправлять необходимо в этом запросе и суть вопроса, заключается в том, как правильно указать адресс куда будет отправлен запрос (если указать /join/test (получаем ошибку 404), я предпологаю что нужно подправить .htaccess, так что бы можно было на прямую в файл отправлять запросы миную index.php пока слабо знаком с этим, хочется разобраться, если есть решения проще, буду очень признателен.

Сам jquery :

$(document).ready(function() {
    $('#main_table').DataTable( {
        "processing": true,
        "serverSide": true,
        "ajax": "join/test"
    } );
} );
Answer 1

Скажем так, лучше всего для ajax делать отдельный контроллер и такие действия выполнять в модели (хотя этот вопрос вызывает много споров).

В любом случае, у вас возврат из action_test() идет вникуда. Также вам необходимо добавить запуск View сюда.

по аналогии с этим:

function action_index(){
 $data = $this->model->getData(); // запуск модели
 //Если вы делаете не в модели то ниже вставляете ваш код`
 // до сюда
 $this->view->generate('ajax_view.php','ajax_template_view.php',$data);

}

а во View уже прописывать вывод данной json. Только не return $ajax_json, а echo $ajax_json

Так как возвращать то некуда.

В любом случае при выводе json из php в ajax вам следует использовать echo, а не return.

READ ALSO
Как вставить php в Custom field wordpresss?

Как вставить php в Custom field wordpresss?

Как в произвольное поле вставить php код и потом его вывести на этой же странице (записи)? есть запись = карточка товара, где цена на этот товар...

179
Как вывести из поля несколько значений?

Как вывести из поля несколько значений?

Есть таблица mysql, в ней есть в поле imgВ нем содержатся несколько фотографий, в одном поле может быть несколько фоток вот так:

186
Файлы загружаются не полностью

Файлы загружаются не полностью

Через любой FTP-клиент файлы загружаются не полностьюЗагрузил картинку например 500 Кб, а она загрузилась только на 320 Кб, со второго раза она...

183
Объединение объектов в один div

Объединение объектов в один div

Имеется вывод массива объектов:

267