Примеры
AJAX SimplyПримеры использования плагина Ajax Simply (ajaxs). Документацию смотрите по этой ссылке.
#1 Возврат из PHP (echo)
Этот пример показывает, как в PHP функции обработчике мы можем просто вывести HTML на экран и JS его в результате получит...
<!-- HTML --> <div class="contact"></div>
// JS
ajaxs( 'ajaxs_get_email', { email: 'foo@gmail.com' }, function( html ){
$('.contact').html( html );
} );
<?php
function ajaxs_get_email( $jx ){
?>
<p class="myclass"><?php echo esc_html( $jx->email ) ?></p>
<?php
// одновременно выведем данные в консоль
$jx->console( $jx->email );
}
#1.2 Возврат из PHP (return)
Допустим нам нужно обработать принятые данные в PHP и вернуть объект данных в JS:
<!-- HTML --> <div class="my_form"> <label><input type="checkbox" name="my_check" /> мой чекбокс </label> <select name="my_select"> <option>Опция 1</option> <option>Опция 2</option> </select> </div>
// JS
ajaxs( 'ajaxs_parse_form', $('.my_form'), function( data ){
data.done; //> true
data.check; //> 'on' если чекбокс выделен
data.sel; //> 'Опция 1' или 'Опция 2'
} );
<?php
function ajaxs_parse_form( $jx ){
return array(
'check' => $jx->my_check,
'sel' => $jx->my_select,
'done' => true,
);
}
Вернуть можно что угодно: объект/массив/число/строку/true/false. В этом примере возвращается массив.
#1.3 Возврат из PHP ($jx->done|error)
Методы $jx->done(), $jx->error() - отправляют объект и обрывают работу PHP. Это аналоги функций wp_send_json_success() и wp_send_json_error().
<!-- HTML --> <div class="ajax-respond"></div>
// JS
ajaxs( 'my_function', function( res ){
var $respond = jQuery('.ajax-respond');
// успех
if( res.ok ){
// сработал метод $jx->done()
$respond.html( 'УСПЕХ:' + res.data );
}
// ошибка
if( res.error ) {
// сработал метод $jx->error()
$respond.html( 'ОШИБКА:' + res.data );
}
} );
// PHP
// префикс 'ajaxs_priv_' означает, что функция сработает только для авторизованного в WP пользователя
function ajaxs_priv_my_function( $jx ){
// какие-либо проверки
if( условие не выполняется ){
$jx->error( 'описание ошибки' );
}
if( другое условие не выполняется ){
$jx->error( 'описание ошибки' );
}
$jx->done( 'Все проверки пройдены!' );
// этот код выполнен не будет, потому что $jx->error() или $jx->done() обрывают работу PHP.
echo 'строка которая не будет выведена';
}
#2 PHP функция-обработчик (function)
Этот пример показывает как указать какая функция PHP будет обрабатывать запрос.
// JS ajaxs( 'my_function' );
// PHP
// вариант: префикс 'ajaxs_' - для всех юзеров
function ajaxs_my_function( $jx ){
$jx->log( 'Сработал запрос с action = my_function' );
}
// вариант: префикс 'ajaxs_priv_' - только для авторизованных
function ajaxs_priv_my_function( $jx ){
$jx->log( 'Сработал запрос с action = my_function' );
}
#2.2 PHP функция-обработчик (static method)
Этот пример показывает как указать статический метод класса, который будет обрабатывать запрос.
// JS ajaxs( 'MY_Class::my_method' );
// PHP
class MY_Class {
static function ajaxs_my_method( $jx ){
$jx->console( 'Сработал метод: '. __METHOD__ );
}
}
Или так
// PHP
class AJAXS_MY_Class {
static function my_method( $jx ){
$jx->console( 'Сработал метод: '. __METHOD__ );
}
}
Обратите внимание на обязательные префиксы AJAXS_ у класса или ajaxs_ у метода.
Эти префиксы для понятности можно указать в вызываемой функции:
// JS ajaxs( 'AJAXS_MY_Class::my_method' );
#2.3 PHP функция-обработчик (namespace)
Этот пример показывает как указать статический метод класса, который находится в пространстве имен myspace.
// JS ajaxs( '\\myspace\\AJAXS_Class::method' )
// PHP
namespace myspace;
class AJAXS_Class {
static function method( $jx ){
$jx->console( 'Сработал метод: '. __METHOD__ );
}
}
#2.4 PHP функция-обработчик (hook)
Этот пример показывает как указать обработчик используя стандартный хук WordPress.
// JS ajaxs( 'my_action_name' );
// PHP
// вариант с хуком - как обычно в wordpress
add_action( 'wp_ajax_'.'my_action_name', 'ajax_my_action_name_handler' );
add_action( 'wp_ajax_nopriv_'.'my_action_name', 'ajax_my_action_name_handler' );
function ajax_my_action_name_handler( $jx ){
$jx->log( 'Сработал запрос с action = my_function' );
}
Обратная совместимость c хуками WordPress дает возможность установить плагин и не переделывать уже написанный PHP код и при этом использовать функцию ajaxs() в JS. «Старый» PHP код будет работать как и до этого...
#3 AJAX Загрузка файлов (single)
<!-- HTML --> <div class="form"> <input type="file" name="file_single" /> </div>
// JS
// вариант: передача всей формы
ajaxs( 'upload_image', jQuery('.form') );
// вариант: передача file поля
ajaxs( 'upload_image', jQuery('[input name="file_single"]') );
// вариант: передача значения поля
var file = jQuery('[input name="file_single"]')[0].files[0];
ajaxs( 'upload_image', { file_single: file } );
// PHP
function ajaxs_upload_image( $jx ){
$file = $jx->file_single;
/* $file будет содержать:
Array (
[name] => Alex-Lynn.jpg
[type] => image/jpeg
[tmp_name] => /home/server/userdata/temp/phpEB56.tmp
[error] => 0
[size] => 34986
)
*/
// обрабатываем полученный файл
}
#3.2 AJAX Загрузка файлов (multiple)
Передать несколько файлов можно в одном поле file или в нескольких. Рассмотрим оба варианта в примере:
<!-- HTML --> <div class="files-upload-form"> <p><input type="file" multiple="multiple" name="file_multiple[]" /> - множественный выбор файлов</p> <p><input type="file" name="file_split_multiple[]" /> - выбор одного файла</p> <p><input type="file" name="file_split_multiple[]" /> - выбор одного файла</p> </div>
// JS
ajaxs( 'upload_image', jQuery('.files-upload-form') );
// PHP
function ajaxs_upload_image( $jx ){
// обе переменные будут содержать одинаковый формат - стандарт PHP
$jx->file_multiple;
$jx->file_split_multiple;
/*
Array (
[name] => Array (
[0] => Alex-Lynn.jpg
[1] => caliyan.jpg
)
[type] => Array (
[0] => image/jpeg
[1] => image/jpeg
)
[tmp_name] => Array (
[0] => /home/server/userdata/temp/phpBA7C.tmp
[1] => /home/server/userdata/temp/phpBA8D.tmp
)
[error] => Array (
[0] => 0
[1] => 0
)
[size] => Array (
[0] => 34986
[1] => 178154
)
[compact] => Array (
[0] => Array (
[name] => Alex-Lynn.jpg
[type] => image/jpeg
[tmp_name] => /home/server/userdata/temp/phpBA7C.tmp
[error] => 0
[size] => 34986
)
[1] => Array (
[name] => caliyan.jpg
[type] => image/jpeg
[tmp_name] => /home/server/userdata/temp/phpBA8D.tmp
[error] => 0
[size] => 178154
)
)
)
*/
// обрабатываем полученные файлы
}
ЗАМЕТКА: Обратите внимание на индекс compact он добавляется плагином для удобства обработки данных. С версии 1.1.9.
#3.3 AJAX Загрузка файлов (прогресс загрузки)
Этот пример показывает, как уведомлять пользователя о загрузке файла (сколько процентов файла уже загружено). Для этого используется параметр uploadProgress, в который нужно передать функцию, которая должна выводить куда-то полученный прогресс загрузки.
Для упрощения, PHP обработка запроса в примере не показана.
<!-- HTML --> <form id="my_form"> <input type="file" name="attached_file"> <button type="submit">Send mail</button> <span class="file_upload_progress" ></span> </form>
// JS
var data = {
foo : jQuery('#my_form'),
uploadProgress : function( percentComplete ){
// выведем прогресс в HTML элемент .file_upload_progress
jQuery('.file_upload_progress').text( percentComplete + '%' );
}
};
ajaxs( 'upload_image', data );
#4 Использование $jx->html()
Допустим у нас есть контейнер, в который нужно вывести форму авторизации, такую форму легко получить с помощью функции wp_login_form().
<!-- HTML --> <a class="auth_form_btn" href="#">Показать форму входа</a> <div class="auth_form" style="display:none;"></div>
jQuery(function($){
$('.auth_form_btn').click(function(ev){
ev.preventDefault();
ajaxs( 'show_auth_form' );
});
});
function ajaxs_show_auth_form( $jx ){
// добавим HTML в блок .auth_form
$jx->html( '.auth_form', wp_login_form([ 'echo'=>false ]) );
// покажем блок
$jx->jseval( "jQuery('.auth_form').show();" );
}
Создавать JS код в PHP не очень правильно, но иногда это очень удобно!
#5 Показ PHP ошибок
В WordPress показ ошибок для AJAX запросов полностью отключен и увидеть их можно только через лог файл. Это очень неудобно! Кто сталкивался, знает о чем я...
AJAX Simply выводит ошибки любого уровня в консоль, даже если это фатальная ошибка. Вывод ошибок работает только при включенном WP_DEBUG, поэтому не стоит беспокоится, что обычные пользователи могут увидеть ошибки или заметки, ведь на рабочем проекте WP_DEBUG отключен.
Для примера представим, что мы обрабатываем AJAX запрос и допустили фатальную ошибку, например, неправильно написали название какой-нибудь функции.
// JS ajaxs( 'phpfunction' );
// PHP
function ajaxs_phpfunction( $jx ){
// переменная, которой нет (ошибка уровня notice)
$var['key'];
// функция, которой нет в PHP (ошибка уровня fatal error)
error_function_name();
}
В результате при AJAX запросе увидим ошибки в консоли браузера, а не будем гадать что же произошло и тратить свое время на поиск причины:
Тут важно отметить, что плагин ловит ошибки с ранней стадии - с момента как подключился его главный файл. Так например, если есть ошибка в файле functions.php он её поймает и выведет в консоль.
В идеале, плагин лучше устанавливать в MU плагины, правда там не будут работать автообновление.
#6 Пример обработчика для отправки письма с файлами
<?php
function ajaxs_mailer( $jx ){
$attached_files = [];
if( $jx->files ){
$files = $jx->files[ 'compact' ];
if( count( $files ) > 5 ){
$jx->error( [
'type' => 'failCount',
'message' => sprintf(
__( 'Максимальное количество файлов - 5, вы пытаетесь отправить %d', 'amcor' ),
count( $files )
),
] );
}
foreach( $files as $file ){
$allowedTypes = [
'image/jpeg',
'image/png',
'application/pdf',
'application/msword',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
'application/vnd.ms-excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
];
$maxSize = 10 * 1024 * 1024;
if( $file[ 'size' ] > $maxSize ){
$jx->error( [
'type' => 'failSize',
'message' => sprintf(
__( 'Максимально допустимый размер одного файла для загрузки - %d Мб. Размер файла %s - %d Мб', 'amcor' ),
$maxSize / ( 1024 * 1024 ),
$file[ 'name' ],
$file[ 'size' ] / ( 1024 * 1024 )
),
] );
}
if( ! in_array( $file[ 'type' ], $allowedTypes ) ){
$jx->error( [
'type' => 'failType',
'message' => sprintf(
__( 'Ошибка загрузки файла %s Допускаются только файлы формата .jpg, .png, .pdf, .doc, .docx, .xls, .xslx', 'amcor' ),
$file[ 'name' ]
),
] );
}
if( $file && ! $file[ 'error' ] ){
$attached_file_path = dirname( $file[ 'tmp_name' ] ) . '/' . sanitize_file_name( $file[ 'name' ] );
@rename( $file[ 'tmp_name' ], $attached_file_path );
$attached_files[] = $attached_file_path;
}
}
}
$to = 'palov@gmail.com';
$subject = 'Новая заявка с сайта';
$message = "
<strong>Имя:</strong> $jx->name<br>
<strong>E-mail:</strong> $jx->email<br>
<strong>Телефон:</strong> $jx->phone<br><br>
";
$headers = [ 'content-type: text/html' ];
//$jx->log( $attached_files );
$sent = wp_mail( $to, $subject, $message, $headers, $attached_files );
if( $attached_files ){
foreach( $attached_files as $_file ){
@unlink( $_file );
}
}
if( $sent )
$jx->done( __( 'Ваш запрос успешно отправлен!', 'amcor' ) );
else
$jx->error( __( 'Ошибка при отправке запроса.', 'amcor' ) );
}