Shared rss feeds:

Servare Mentem - blog

Мой предыдущий блог

пятница, 2 мая 2008 г.

SM PHP Toolkit : part1

Однажды, после того как я попробовал ASP.NET Ajax и UpdatePanel в частности, мне понравилась идея того как работает этот контрол - удобно и просто для понимания и использования.
Потом мне как-то пришлось снова писать на PHP и захотелось создать нечто подобное в нём - просто так, интереса ради. Ну и я достаточно легко и быстро воссоздал подобную функциональность, используя Ajax от prototypejs. Вообще же, загоревшись этой идеей я даже написал целый набор классов, который потом получил название SMPHPToolkit. В него помимо этого самого AjaxBuffer'а, вошёл контрол grid с пейджингом и сортировкой, класс быстрого и удобного управления файловым хранилищем (хранение любых кастомных объектов в файлах, оптимизированная скорость выборки, поддержка сортировок, условных выборок и т.д.)... Но об этом потом.
Пользоваться же AjaxBuffer достаточно удобно и уж точно не сложнее чем UpdatePanel в asp.net.
Сначала нужно создать объект класса ajax_buffer. Сделать это нужно до любого вывода данных (то есть примерно там же, где запускается сессия), т.к. в конструкторе запускается буферизованный вывод (это нужно при постбэке).
$ajaxbuf = new ajax_buffer("update_buffer");
Так же нужно обязательно подключить prototype и клиентский API для буфера (автоматическое подключение библиотек было решено не использовать во избежание различных конфликтов).
  
  
Затем можно в любом месте html/php кода написать приблизительно следующее:
<? $ajaxbuf->start(); ?>
  Today is <?=date("Y/m/d H:i:s")?> (updated by ajax)
<? $ajaxbuf->end(); ?>
Остаётся только вызвать update с клиента, чтобы область, заключённая между "$ajaxbuf->start()" и "$ajaxbuf->end()" обновилась через AJAX. Добавляем в конец html кода:
<script type="text/javascript">
  setInterval('<?=$ajaxbuf->client_id() ?>.update()', 1000);
</script>
Вот и всё! Посмотрим что получилось:
<?php
require_once("SMPHPToolkit/SMAjax.php");
$ajaxbuf = new ajax_buffer("update_buffer");
?>
<html>
<head>
  <script type="text/javascript" src="js/common/prototype.js"></script>
  <script type="text/javascript" src="js/ajax/engine.js"></script>
</head>
<body>
<? $ajaxbuf->start(); ?>
  Today is <?=date("Y/m/d H:i:s")?> (updated by ajax)
<? $ajaxbuf->end(); ?>

<script type="text/javascript"> 
  setInterval('<?=$ajaxbuf->client_id() ?>.update()', 1000);
</script>
</body>
</html>
В данном примере каждую секунду по ajax-запросу просто обновляется строка "Today is...", это можно легко заменить на обновление любых объектов, которые генерятся php-кодом.
На одной странице можно создать неограниченное количество буферов, каждый из которых будет перегружаться по своему событию. Нужно всего-лишь вызвать
<?=$ajaxbuf->client_id() ?>.update()
например, по клику на кнопке, и область, заключённая в start-end будет обновлена. Этот механизм очень похож по принципу на UpdatePanel.
Кроме этого простого примера, можно так же создавать переменные для обмена данными между серверной и клиентской частями приложения:
$ind_count = new ajax_var('ind_count',0);
$ajaxbuf->register_var($ind_count);
Все переменные, которые были таким образом зарегистрированы в буфере, будут доступны в javascript-коде через:
var ind_count = <?=$ajaxbuf->client_id() ?>.get_var('<?=$ind_count->client_id() ?>');
и в серверном коде:
 $ind_count->get_value();
Для буфера так же существует метод проверки того запрошена ли страница через Ajax или же она запрошена впервые пользователем: $ajaxbuf->is_post_back().
Дополнительно можно настроить метод обновления данных в области, окружённой start-end, то есть, например, можно указать метод обновления ajax_buffer_method::APPEND_AFTER и данные будут просто дописываться к уже имеющимся. По-умолчанию же область полностью переписывается обновлёнными данными.
На основе AjaxBuffer можно реализовать простые и понятные ajax-приложения, лёгкие в использовании и кастомизации.
Забрать последнюю версию SMPHPToolkit можно в моём svn-репозитории.

[To be continued...]

Ярлыки: , , , ,

Комментарии: 0:

Отправить комментарий

Подпишитесь на каналы Комментарии к сообщению [Atom]

<< Главная страница

-->