Форум программистов, компьютерный форум, киберфорум
PHP для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
34 / 34 / 6
Регистрация: 11.12.2016
Сообщений: 329
Записей в блоге: 6
1

Исполнение PHP-скрипта без перезагрузки страницы и без знания JavaScript(!) - Xajax

26.12.2016, 21:04. Просмотров 3505. Ответов 9
Метки ajax (Все метки)

Приветствую! Решил запостить отдельной темой, а в прилепленной (про Ajax) просто разместить на нее ссылку. Так будет структурно правильнее, ибо Xajax (см. Википедию), с которым вы сейчас познакомитесь - это тема, во-первых, большая, во-вторых, Xajax - это не совсем Ajax, с точки зрения кодера, ибо не предполагает написания кода на JavaScript вовсе, но исключительно на PHP.

План таков: мы с вами, для начала, без всяких лирических отступлений рассмотрим конкретный пример работающего на Xajax простенького приложения. А уже потом, на основе ваших вопросов и, я надеюсь, дополнений, сформируем дополнительное описание, может мини-FAQ, может еще чего, по ходу обсуждения станет ясно.

Итак, приложение наше намеренно упрощено до предела, с целью лучшего восприятия кода. С другой стороны - вполне типично и актуально для любого веб-разработчика. Пример его работы можно посмотреть здесь http://procode.pw/xajax/ex/xv.php - делает оно вот что:

- Берет данные из формы.
- Пишет эти данные в файл.
- Затем читает данные из этого же файла.
- И выводит их в браузер посетителя.

То есть вполне типовые задачи: отправка формы и операции ввода/вывода в/из БД (файл в нашем примере может быть легко заменен на MySQL или что-то подобное). И все это - без перезагрузки страницы браузера

Ниже приведен код приложения с комментариями. Если что непонятно - спрашивайте. Приложение находится в единственном файле. Второй файл рядышком (text.txt) служит в качестве базы данных. Файловую структуру и пр. можете посмотреть в архиве: http://procode.pw/xajax/ex/xv.tgz туда же упакован и Xajax версии 0.5. То есть архив содержит полностью рабочую версию данного примера - распакуйте куда-нибудь себе на сервер с PHP (тестировалось на 5.6) и все, по идее, сразу должно заработать.

PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<?php
 
require ('../xajax_core/xajax.inc.php'); // подключаем Xajax
$objXajax = new xajax(); // создаем объект класса Xajax
 
$objXajax->register(XAJAX_FUNCTION,"zaborWrite"); // регистрируем в Xajax функцию zaborWrite 
$objXajax->processRequest(); // инициализируем обработку запросов через Xajax (метод processRequest() следует вызывать ДО отправки заголовков браузеру)
 
function onLoad() { //функция вывода текста, записанного до нас
    $filename = "text.txt"; //файл, в котором текст
    $text = file_get_contents($filename); //читаем текст из файла
    $text = 'На заборе уже написано:<p style="color:blue;"><b>'.$text.'</b></p>'; //форматируем строку
    echo $text; //выводим строку в браузер
}
 
function zaborWrite($data = "") { // главная функция скрипта
    
    $filename = "text.txt"; //файл, в котором текст
    
    if($data) { //если через форму пришел новый текст
        $text = $data['text']; // забираем текст из массива $data переданного из формы
        $text = substr($text, 0, 1000); //обрезаем текст до длины не более 1.000 сиволов
        $text = filter_var($text, FILTER_SANITIZE_STRING); //вырезаем теги и пр.
        file_put_contents($filename, $text, LOCK_EX); //пишем в файл
    }   
    
    $text = file_get_contents($filename); //читаем текст из файла
    $text = 'Вы написали на заборе:<p style="color:red;"><b>'.$text.'</b></p>'; //форматируем строку 
        
    $objResponse = new xajaxResponse(); // создаем xajax-объект с ответом сервера
    $objResponse->assign("messageVasia", "innerHTML", $text); // здесь в объект с ответом включаем инструкцию, чтобы в элемент с id "messageVasia" поместили наш текст из файла ($text)  
    return $objResponse; // отправляем объект с ответом в браузер 
}
 
?>
 
<!DOCTYPE html>
<html lang="ru">
    <head>
        <title>Xajax - здесь был Вася!</title>
        <?php $objXajax->printJavascript("../"); /* выводим заголовки Xajax (можете потом глянуть в исходниках HTML страницы на что это похоже)*/ ?>
    </head>
 
    <body>
     <span id="messageVasia"><?php onLoad(); /*выводим старый текст из файла при загрузке страницы*/ ?></span>
    
     <form method="post" id="zabor" onSubmit="return false"> <!-- через onSubmit предотвращаем отправку формы по клику на кнопке -->
      <p>Хотите написать на заборе что-то от себя?</p>
      <p><textarea rows="7" cols="45" name="text"></textarea></p>
      <p><input type="submit" value="Написать на заборе" onClick="xajax_zaborWrite(xajax.getFormValues('zabor'));"></p> <!-- по клику вызываем zaborWrite и в качестве параметра $data передаем ему ассоциативный массив с полями нашей формы 'zabor' :) -->
    </form>
 
   </body>
</html>
Чуть позже допишу сюда по отдельным участкам кода более подробно.

Добавлено через 1 час 11 минут
Что такое Xajax?

Xajax - это PHP и JavaScript библиотека, позволяющая реализовать технологию Ajax (приложения, работающие без перезагрузки веб-страницы) не используя в разработке кодирование на языке JavaScript. То есть, весь необходимый JavaScript-код УЖЕ написан разработчиками Xajax, и нам остается лишь написание кода на PHP и HTML.
Библиотека подключается как к PHP-коду

PHP
1
2
<?php
require ('../xajax_core/xajax.inc.php');
так и в HTML(JavaScript)

PHP/HTML
1
2
3
<head>
    <?php $objXajax->printJavascript("../"); ?>
</head>
А что там вообще происходит в исходном примере? Сходу ничего не понятно...

В библиотеке Xajax есть два основных PHP-класса: xajax и xajaxResponse

Объект класса xajax - служит для принятия и обработки запроса от клиента(браузера).

PHP
1
2
3
$objXajax = new xajax(); 
$objXajax->register(XAJAX_FUNCTION,"zaborWrite");
$objXajax->processRequest();
Объект класса xajaxResponse - служит для формирования и передачи ответа сервера - клиенту(браузеру).

PHP
1
2
3
$objResponse = new xajaxResponse(); 
$objResponse->assign("messageVasia", "innerHTML", $text);
return $objResponse;
JavaScript-библиотеки, подключаемые в HTML-код, участвуют в работе обоих классов, обеспечивая реализацию технологии Ajax.

PHP/HTML
1
2
3
<head>
    <?php $objXajax->printJavascript("../"); ?>
</head>
Запрос от клиента к серверу реализуется через вызов JavaScript-функции

Javascript
1
2
<p><input type="submit" value="Написать на заборе" 
onClick="xajax_zaborWrite(xajax.getFormValues('zabor'));"></p>
При этом, обратите внимание: нам не нужно писать какую-то особую функцию на JS, мы просто добавляем к названию зарегистрированной ранее функции

PHP
1
$objXajax->register(XAJAX_FUNCTION,"zaborWrite");
приставку

Javascript
1
xajax_
и добавляем к событию

Javascript
1
onClick
при этом, конструкция

Javascript
1
xajax.getFormValues('zabor')
которую мы передаем в качестве параметра ('zabor' - это id веб-формы), служит для передачи значений полей веб-формы в виде ассоциативного массива на сторону сервера

PHP
1
$text = $data['text'];
то есть, так уже понятнее, да? Уже получили массив данных в формате PHP и теперь можем изголяться с ним как угодно

Вдоволь наизголявшись, создаем объект класса xajaxResponse

PHP
1
$objResponse = new xajaxResponse();
формируем ответ-инструкцию с помощью метода assign (методов там достаточно много, если будет интерес - постепенно их рассмотрим).

PHP
1
$objResponse->assign("messageVasia", "innerHTML", $text);
(это инструкция клиенту(браузеру) вставить в элемент с id "messageVasia" текст из переменной $text)

и отправляем ее клиенту

PHP
1
return $objResponse;
Таково краткое описание механики по которой всё это и работает.

И ведь работает же!
5
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.12.2016, 21:04
Ответы с готовыми решениями:

Загрузка разных кусков php скрипта без перезагрузки страницы
Приветствую, имеется задача: на странице имеется две ссылки, по клику на которые должно...

Как загрузить результат php скрипта без перезагрузки страницы?
Добрый день! Есть скрипт на php: Код скрипта на php &lt;?php header('Content-Type: text/html;...

Пример простейшего калькулятора на PHP без перезагрузки страницы (чистый Ajax, без jQuery и других библиотек)
Привет. Это, в каком-то смысле, продолжение креатива...

Вызвать PHP функцию без перезагрузки страницы
Вообщем задача такая: Есть input с email нужно что бы при нажатии на кнопку без перезагрузки...

9
34 / 34 / 6
Регистрация: 11.12.2016
Сообщений: 329
Записей в блоге: 6
27.12.2016, 22:10  [ТС] 2
Парни, я в недоумении: почему нет комментариев? То есть:

- Либо я так хорошо все написал, что не возникает ни единого вопроса по ходу рассмотрения темы

- Либо это никому не нужно :/

- Либо написано настолько невнятно, что вопросы не возникают в виду того, что непонятно о чем вообще можно вопросить...

ээ?
0
1842 / 1453 / 680
Регистрация: 17.11.2012
Сообщений: 6,369
28.12.2016, 21:38 3
Цитата Сообщение от ProCode Посмотреть сообщение
Либо это никому не нужно :/
мне кажется, эта библиотека не пользуется спросом. сколько на форуме тем касающихся аjax, но я не видел ни одного совета пользоваться данной библиотекой. да и для начинающего(имхо) сложновато, проще разобраться с $.ajax(query).
1
34 / 34 / 6
Регистрация: 11.12.2016
Сообщений: 329
Записей в блоге: 6
28.12.2016, 22:12  [ТС] 4
Цитата Сообщение от fanatikus Посмотреть сообщение
мне кажется, эта библиотека не пользуется спросом. сколько на форуме тем касающихся аjax, но я не видел ни одного совета пользоваться данной библиотекой. да и для начинающего(имхо) сложновато, проще разобраться с $.ajax(query).
вообще, странно - дело в том, что эта библиотека для того и создавалась, чтобы проще было не нужно учить JavaScript - достаточно одного PHP. внутренняя логика достаточно простая, уж всяко проще какого-нибудь мозголомного MVC от Zend )
0
1712 / 1038 / 386
Регистрация: 13.06.2013
Сообщений: 3,525
28.12.2016, 22:45 5
Цитата Сообщение от ProCode Посмотреть сообщение
не нужно учить JavaScript - достаточно одного PHP
В том то и дело. Когда достаточно php, то аякс особо и не нужен.
И да, аякс на jquery действительно выглядит проще, а главное гибче и перспективней.
Но для самообразования почитать было интересно
1
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
09.01.2017, 13:24 6
Вопрос: а где взять эту библиотеку?? xajax.inc.php
require ('../xajax_core/xajax.inc.php');
0
1842 / 1453 / 680
Регистрация: 17.11.2012
Сообщений: 6,369
09.01.2017, 13:26 7
Цитата Сообщение от DJestin Посмотреть сообщение
а где взять эту библиотеку??
http://www.xajax-project.org/en/download/
0
0 / 0 / 1
Регистрация: 29.12.2016
Сообщений: 157
09.01.2017, 13:40 8
А Сорри сначала пропустила в описании..
Файл xajax.inc.php нашла.
Есть вопрос а как реализовать обработку selecta который берет данные из базы, без перезагрузки страницы??
0
34 / 34 / 6
Регистрация: 11.12.2016
Сообщений: 329
Записей в блоге: 6
12.01.2017, 19:11  [ТС] 9
Цитата Сообщение от DJestin Посмотреть сообщение
Вопрос: а где взять эту библиотеку?? xajax.inc.php
require ('../xajax_core/xajax.inc.php');
http://procode.pw/xajax/ex/xv.tgz - в архиве всё уже есть, что нужно, код полностью рабочий

Цитата Сообщение от DJestin Посмотреть сообщение
Есть вопрос а как реализовать обработку selecta который берет данные из базы, без перезагрузки страницы??
Для начала переформулируем задачу:

1. Написать на PHP код, который будет брать данные из базы.

2. Зарегистрировать этот код в виде xajax-функции.

3. Привязать вызов этой xajax-функции к коду select-а, скажем, через обработчик события onChange

HTML5
1
2
3
4
5
6
7
8
<form method="post" id="zabor">
    <select onChange="xajax_zaborWrite(xajax.getFormValues('zabor'));">
      <option value="#">Выберите раздел сайта</option>
      <option value="depart.html">Отделения</option>
      <option value="techinfo.html">Техническая информация</option>
      <option value="study.html">Обучение</option>
    </select>
  </form>
0
90 / 40 / 17
Регистрация: 24.10.2015
Сообщений: 551
24.08.2017, 22:50 10
Цитата Сообщение от ProCode Посмотреть сообщение
Либо это никому не нужно :/
Как делает новичёк, он идет в гугл и просит его что типа асинхронный запрос/ajax/отправка формы без перезагрузки, ну а гугл на первых страницах отдает только материалы по js и jquery
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2017, 22:50

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как отправить переменную с js на php без перезагрузки страницы?
есть переменная a её нужно отравить в php код как это можно реализовать? &lt;!DOCTYPE html&gt;...

Как выполнить PHP код без перезагрузки страницы?
У меня имеется код: &lt;?php if(isset($_POST)) { $text = $_POST; echo $text; } ?&gt; &lt;form...

Как сделать мультизагрузку фото с ajax и php без перезагрузки страницы?
или хотя бы как можно как можно отправить данные массива name='image' в файл обработчик ? ...

AJAX - как сделать запрос к PHP-коду без перезагрузки страницы
Эта тема имеет больше общего с JavaScript, но ввиду того, как часто у новичков возникают вопросы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.