PHP - обёртка для AJAX

Илья777

Новичок
Здравствуйте. Есть необходимость создать обёртку для AJAX, дабы отсылать на файлы-обработчики данные через AJAX без расписывания каждый раз, а просто вызвав функцию. Чтобы не было важно, что на входе $data (просто значение или массив, и не важно, сколько в массиве элементов)
Исходник взял отсюда.
Не работает.
PHP 5.6

Я поместил класс в файл, который повсеместно подключен в проекте, допустим functions.php и добавил туда функцию вызова:
PHP:
<?php
class Async
{
    public function __construct() {}   
    public function request($uri = '', $data = [])
    {       
        $formDataScript = '';
        if (!empty($data)) {
            $method = 'POST';
            $formDataScript = <<<HEREDOC
var formData = new FormData(); \r\n
HEREDOC;
            foreach ($data as $key => $value) {
                $formDataScript .= <<<HEREDOC
formData.append("$key", "$value"); \r\n
HEREDOC;
            }
        } else {
            $method = 'GET';
            $formDataScript = <<<HEREDOC
var formData = null;
HEREDOC;
        }
        $asyncRequestHtml = <<<HEREDOC
<script>
  function responseListener() {
     console.log(this.responseText);
 }

 var oReq = new XMLHttpRequest();
 
 oReq.addEventListener("load", responseListener);
 oReq.open("$method", "$uri", true);
 $formDataScript
 oReq.send(formData);
</script>\r\n\r\n
HEREDOC;

        echo $asyncRequestHtml;
        //var_dump($_POST);
        //var_dump($_GET);
    }
}

function аякс($uri, $data)
{     
    $req = (new Async())->request($uri, $data);
    echo $req;
}
?>
Обработчик process.php :
Код:
<?php
if(session_id() == '') {
    session_start();
}

//- Конфигурационный файл

include_once("../connect.php");
include_once("../functions.php");
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) === 'xmlhttprequest')
{

if(isset($_POST['firstname'])) {
echo($_POST['firstname']);
}
if(isset($_POST['firstname'])) {
echo($_POST['lastname']);
}
}


Вызываю всё это дело из другого файла (functions.php подключен по умолчанию):


PHP:
$uri = "ajax/process.php";
$data = ['firstname' => 'joHn', 'lastname' => 'bLaCk'];

аякс($uri,$data);

Переменные $_POST пустые...

Пожалуйста помогите.
 

Фанат

oncle terrible
Команда форума
@c0dex слушай, а ты понял хоть, что это за пепяка такая?
автореспондер что ли какой-то?
 

weregod

unserializer
ТС, с похапэ структуру формы отдавайте клиенту, на клиенте самим JS-ом форму рисуйте, php://json_encode(), js://JSON.parse(), тогда хотя бы всего одну ногу отстрелите себе, а не обе
 

Илья777

Новичок
ТС, с похапэ структуру формы отдавайте клиенту, на клиенте самим JS-ом форму рисуйте, php://json_encode(), js://JSON.parse(), тогда хотя бы всего одну ногу отстрелите себе, а не обе
Не отстрелил, к счастью. Делюсь ныне работающим в продакшне скриптом. :)
Это закидываем в файл с общими функциями:

PHP:
<?php
class Async {
    public function __construct ($uri = '', $data = []) {
        $formDataScript = '';
        $asyncRequestHtml = '';
        if (!empty($data)) {
        $method = 'POST';
        $formDataScript = '
        var formData = new FormData();
        ';
        foreach ($data as $key => $value) {
        $formDataScript .= '
        formData.append("'.$key.'", "'.$value.'");';
        }
        } else {
        $method = 'GET';
        $formDataScript = '
        var formData = null;';
        }
        $asyncRequestHtml .= '
        <script>
        function responseListener() {
        console.log(this.responseText);
        }
        var oReq = new XMLHttpRequest();
        oReq.addEventListener("load", responseListener);
        oReq.open("'.$method.'", "'.$uri.'");
        oReq.setRequestHeader("X-Requested-With", "XMLHttpRequest");
        '.$formDataScript.'
        oReq.send(formData);
        </script>';
        echo $asyncRequestHtml;
    }
}

function аякс($uri, $data){
    $req = new Async($uri, $data);
    return $req;
}
?>

Вызов всего этого беспредела:

PHP:
<?php
include('functions.php');

$uri = "ajax/process.php";
$data = ['firstname' => 'John', 'lastname' => 'Blane'];
аякс($uri, $data);
?>
Обработчик:

PHP:
<?php
if(session_id() == '') {
    session_start();
}

//- Конфигурационный файл
include("../connect.php");

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')
{
//Данные в базе изначально в WINDOWS-1251 - конвертируем
$firstname = iconv("UTF-8","windows-1251", $_POST['firstname']);
$lastname = iconv("UTF-8","windows-1251", $_POST['lastname']);

if(!empty($firstname)) {
//ДОБАВЛЯЕМ В БАЗУ
}
if(!empty($lastname)) {
//ДОБАВЛЯЕМ В БАЗУ
}
}
?>
В итоге, что мы имеем?

Простое, быстрое и удобное обращение с AJAX, без расписывания кучи строк, параметров и т д., без создания подключаемых .js и без встраивания JS в код формы. Всё "дёшево и сердито" - PHP.
И. да, чуть не забыл. Рабочая версия пыха = 5.6 (5.4-5.6 \ на 7.Х не тестировал, но, по идее, должно работать \ )

По поводу JSON - я не особый его поклонник. Лично моё мнение - он очень капризен и проблем и затрат времени от него больше, чем пользы - единственный его плюс - кроссплатформенность.
При желании, можно этот скрипт адаптировать и под работу с JSON... Но лично я заморачиваться на этом не собираюсь.
Этот скрипт ориентирован на упрощение разработки и сокращение временных затрат.
 
Последнее редактирование:

Фанат

oncle terrible
Команда форума
Чтобы было понятно, это заявление звучит примерно так: По поводу ложек - я не особый их поклонник. Лично моё мнение - их потом мыть надо, и затрат времени от них больше чем пользы. Единственный плюс - если пища горячая, то пальцы не так обжигает.
 
Сверху