AJAX-плагины для Smarty

Feb 19
2006 01:49 (AJAX, Программирование, JavaScript, PHP) · English (87,134 views)

Сегодня я написал простые плагины для Smarty, поддерживающие AJAX. Я не пытался разработать мощный фреймворк для веб-приложений,- просто хотелось дать идею, как можно интегрировать AJAX-технологию в Smarty. Но если у Вас есть любые предложения по улучшению системы, или Вы просто хотите отправить отзыв, оставьте комментарий на сайте.

На практике мне нужно несколько вещей от AJAX: обновить некоторые узлы DOM, отправить форму на сервер без перегрузки страницы, получить некоторые значения или выполнить вычисления на стороне сервера (возможно с использованием базы данных или других серверных ресурсов). Необходимо написать кучу кода JavaScript для реализации этих требований, даже несмотря на использование замечательной библиотеки JavaScript Prototype.

Я решил подружить Smarty и AJAX. Вот три плагина Smarty, которые были созданы: ajax_update, ajax_call, ajax_form. Ниже я опишу все эти плагины.

ajax_update

Эта функция Smarty может быть использована для обновления некоторых частей веб-страницы.

Пример использования:

<a href="#" onclick="{ajax_update update_id='intro_content'
  function='update_intro' params='page=about'}">О нас</a>

Возможные параметры:

  • url - URL для AJAX-запроса (если не указан URL, будет использован текущий)
  • method - метод запроса (по умолчанию get, может быть get или post)
  • update_id - ID элемента HTML для обновления
  • function - имя функции PHP, которая будет вызвана
  • params - URL-закодированные параметры

ajax_call

Эта функция Smarty может быть использована для вызова PHP-функции на стороне сервера и получения результатов ее вывода.

Пример использования:

<a href="#" onclick="{ajax_call function='calculate'
  params_func='calc_params' callback='calc_cb'}">Посчитать</a>

Возможные параметры:

  • url - URL для AJAX-запроса (если не указан URL, будет использован текущий)
  • method - метод запроса (по умолчанию get, может быть get или post)
  • function - имя функции PHP, которая будет вызвана
  • params - URL-закодированные параметры
  • callback - функция JavaScript, которая будет выполнена по завершении запроса
  • params_func - функция JavaScript, которая используется для вычисления параметров запроса на стороне клиента

ajax_form

Этот блок Smarty может быть использован для отправки веб-форм на сервер без перезагрузки страницы.

Пример использования:

{ajax_form method="post" id="form_register"}
Любой элемент формы может быть размещен здесь
{/ajax_form}

Возможные параметры:

  • url - URL для AJAX-запроса (если не указан URL, будет использован текущий)
  • method - метод запроса (по умолчанию get, может быть get или post)
  • params - URL-закодированные параметры
  • id - ID элемента формы
  • callback - функция JavaScript, которая будет выполнена по завершении запроса

Примеры

Эти плагины достаточно просты, и я думаю, что любой может создать получше моих. Я всего-лишь хотел показать идею, как можно произвести интеграцию. Рабочие примеры можно найти здесь. Кроме того, Вы можете скачать все исходники.

68 отзывов на 'AJAX-плагины для Smarty'

Подписаться на комментарии по RSS или TrackBack на 'AJAX-плагины для Smarty'.

1
сказал 21.02.2006 в 9.48

[...] In my previous post I’ve described several simple AJAX plugins. Now I’ll show how to use one of them — ajax_form — in real applications. I think this is the most powerful plugin therefor I’ll dwell on it more elaborately. [...]

2
сказал 22.02.2006 в 12.42

Я еще не успел полностью ознакомиться с данной технологией, но она уже мне нравится по просмотренным примерам. Будем изучать.

3
Michel
сказал 22.02.2006 в 16.53

Hey very cool! keep up the good work!

4
сказал 22.02.2006 в 17.04

really a great idea!

5
Leksi
сказал 28.02.2006 в 18.10

Попробовала использовать вышепредложенные плагины. У меня довольно быстро все получилось, хоть до этого с Ajax я была знакома только в теории.
Пара замечаний:

  • в ajax_form было бы неплохо добавить возможность вешать обработчик на onsubmit, а так же устанавливать дополнительные аттрибуты тега <form>.
  • во всех плагинах, если приходит метод, отличный от POST или GET, по умолчанию устанавливать один из них, а не ту лабуду, которую туда можно подсовывать.

С нетерпением жду ajax_table :) Двигаешься в правильном направлении, так держать :)

6
jack
сказал 07.03.2006 в 0.30

hey great job… just one thing… when used in IE, the page gets cached and does not refresh with new content. anyway to solve that?

7
сказал 07.03.2006 в 6.31

To prevent IE from caching pages you can add to all url any random string (for example http://somehost.com/index.php?4397593847)
You can do this using JavaScript-function Math.rand() or PHP function mt_rand() or rand().

Another way is to set page headers to disable cache:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
8
Szenna
сказал 15.03.2006 в 17.24

hi,
I have one question:
can i use/call class functions in the ajax_update and ajax_call?

thx

9
сказал 15.03.2006 в 17.41

Unfortunately, this is not possible in current version.

10
chris
сказал 08.04.2006 в 14.11

I don’t speak inglish, but let me say. Your plugin es really fantastic

11
сказал 11.04.2006 в 0.18

[...] AJAX-enabled Smarty plugins (tags: ajax smarty webdev) [...]

12
baz
сказал 12.05.2006 в 15.34

клевый ход , так держать

13
vipin
сказал 16.05.2006 в 12.59

how can smarty section implemented using ajax.
i tryed but got some error.
please help

14
сказал 16.05.2006 в 13.06

Hmm. I haven’t understood your problem. Can you provide code that you use?

15
сказал 16.05.2006 в 21.41

[...] Bellow is the simple resources of Ajax Enabled Smarty plugins. I got from this site [http://kpumuk.info/ajax/ajax-enabled-smarty-plugins/]. this part of articles In my practice I need several things from AJAX: to update some nodes in DOM, to send forms without post-back, to retrieve some values or to perform server-side calculation (maybe using database or other server-side resources). It’s necessary to write tons of JavaScript to implement my requirements in spite of using cool JavaScript library Prototype. [...]

16
сказал 20.05.2006 в 13.55

[...] AJAX-enabled Smarty plugins [...]

17
Milary
сказал 27.08.2006 в 11.16

This website is Great! I will recommend you to all my friends. I found so much useful things here. Thank you.

18
skonealone
сказал 31.08.2006 в 9.13

hi

its greate job … well i am new to smarty and facing some problem, please help me as i am already using the smarty, now i dont want to change existing smarty setup, without changing the existing smarty configuration and i want to intigrate your AJAX-enabled Smarty plugins in my existing smarty configuration. so can u help me how do i intigrate ur plugin in it??? and as i tryed to intigrate i get syntax error called “unrecognized tag ‘ajax_form’” so pls help me in it.

let me know the steps..

thanx in advance n awaiting for ur reply

regards
-skonealone

19
skonealone
сказал 31.08.2006 в 11.45

hi once again .. as i intigrated the smarty_ajax plugin but still me not able to post the variables to the action page..
when i click on submit button .. nothing is happening..
pls let me know where i am doing wrong..

regards
-skonealone

20
mr. ajax
сказал 17.09.2006 в 16.26

hi kpumuk,

how can i realize this: (look at the params, need this in smarty foreach)

onclick="{ajax_update url='test2.php' update_id='intro_content' function='update_intro3' params='page={$param}&test=yeah'}

thx

21
сказал 25.09.2006 в 13.50

Hello, mr. ajax
This is standard Smarty future: you can use $variable inside {} in following way:

onclick="{ajax_update url='test2.php' update_id='intro_content' function='update_intro3' params='page=`$param`&test=yeah'}"
22
gotmyredhaton
сказал 26.09.2006 в 20.08

hello kpumuk,
great work, thank you very much.

i found the callback isn’t working when using ajax_call.
can’t figure out why.

wouldn’t it be better to merge call and update?
at least, ajax_call with a callback to “update a div” would do it.

regards,
gotmyredhaton

23
Rafael Affonso
сказал 26.09.2006 в 23.28

Ajax without XML????? I can’t understand, I need XML…

24
Thiago
сказал 03.10.2006 в 16.49

Hi, congratulations for this plugun, its fantastic. But, how i can auto-load update intro in a div element?? onLoad event cannot load update_intro, only onclick is possible!!! Thanks

25
Franco
сказал 09.10.2006 в 15.52

Hi, I want to use update to do that on some part, process a code and show the same smarty templated thing every 1 second.
Should pasting a line like {ajax_update update_id="intro_content"
function="update_intro" params="page=about"}
inside the javascript function that trigger timers work? Will that make it to recalculate the smarty templated code i wan to show or it’s already locked?

26
сказал 10.10.2006 в 5.04

Hi Franco!
Just look at the examples. In chat.php and corresponding Smarty template you can find periodically updated part of page. Think it can help you.

27
Franco
сказал 10.10.2006 в 5.07

thank you very much, you were very helpfull

28
сказал 16.10.2006 в 19.01

Szenna’s comment inspired me to modify smarty_ajax to support calling object methods from ajax_call and ajax_update. I added an optional parameter “object” to both so you can call the function as a method of an object.

If you need this functionality, you can get it from http://logankoester.com/smarty_ajax/

@Kpumuk: Are you interested in incorporating my patch in the next release of smarty_ajax?

29
Mellisa
сказал 19.10.2006 в 18.25

Hi, nice very nice page..!

Good luck !

30
German
сказал 26.10.2006 в 17.27

Отличные плагины!
Спасибо тебе! Был бы очень рад увидеть еще плагины для смарти…

Это то, чего давно не хватало смарти.

31
Паклоннегг
сказал 27.10.2006 в 10.30

идейа плагина очинь харошайа . пешы йищо

32
Wildhorse
сказал 07.11.2006 в 10.43

Your chat is really nice! Is it possible to use mysql instead of chat.txt. I tried to include a Database update … but it wont work.

33
сказал 07.11.2006 в 10.45

Sure it’s possible. Can you show me your code? Will try to help you connect db.

34
Wildhorse
сказал 07.11.2006 в 19.06

I tried to modify the function add message … but i think i am on the wrong way … if i press send … nothing happens and no entry in db.

function add_message() {
  include_once( 'init.php' );
  $sql11 = 'INSERT INTO ! ( from_user, username, act_time, message) values( ?, ?, ?, ? )';
  $db->query( $sql11, array( CHAT_TABLE, '21', 'test', '456465', $_POST['message'] ) );
}
35
Igor
сказал 28.11.2006 в 1.54

Dear Kpumuk!

Your plugin is very useful.

A question about ajax_form:

I have a registration form. I have successfully made the ajax validation. I’d like to hide the form input fields upon successful registration and display a close button ( I am developing a prototype window enabled ajax application, the registration form is in inside a prototype window).

Thank you in advance.

36
German
сказал 29.11.2006 в 18.46

Пытаюсь прикрутить плагины к движку, который работает на смарти (koobi).
Строка
About

Вызывает ошибку

Fatal error: Smarty error: [in page/main_template.tpl line 120]: syntax error: unrecognized tag 'ajax_update' (Smarty_Compiler.class.php, line 580) in w:\home\forex.ru\www\class\tpl\Smarty.class.php on line 1095

Не в курсе, почему такая ошибка возникает?

37
сказал 02.12.2006 в 9.57

Скорее всего, плагины не скопированы в каталог plugins, или ошибка с настройками путей. Посмотрите в моих примерах, там есть пример, как настроить поддержку нестандартного пути.

38
Eduardo Miranda
сказал 08.12.2006 в 23.02

I use this AJAX Smarty plugins, but i has problem with this characters: ó,ú,í,ú,á,ñ
when use this technology

40
сказал 11.12.2006 в 3.33

[...] Under normal circumstances, once you’ve passed your footer template to Smarty->display(), you’re done. There’s no going back without a refresh. Well, that was before Dmytro Shteflyuk wrote a sexy PHP library, aptly named smarty_ajax. [...]

41
Tiago
сказал 23.01.2007 в 20.39

hi, congratulations the plugin is fantastic!!! about the back button on browser?
ps: I don’t speak english very well.

42
Tiago
сказал 23.01.2007 в 22.50

problems with ã, ç, é, ô, í see here

43
сказал 14.02.2007 в 16.16

Hi ,
I have a problem with ajax_call.Below is the code–

/Click for first details/

Now I want to pass certain parameters such as id=20,location_id=30, which is to be used by the testfunction for database query. How do I do it?

44
сказал 03.03.2007 в 0.33

Hi,

I’d like to use autosuggest on a smarty-ajax enabled page.

But I get the following error:

Error: Ajax.Updater is not a constructor Source File: http://ctsz.osiris/admin/js/smarty_ajax/smarty_ajax.js Line: 8

autosuggest can be found here.

Do you have any idea?

Thank you very much.
Igor

45
Philipp
сказал 13.03.2007 в 11.59

Hi Dmytro,

very interesting smarty plugin you have made, but please, what do I have to do, if I want the form I submit to be displayed again onsubmit?

My form already includes highlighting of the fields with wrong data input, set by the php script. So all I want is to extend the form with your Smarty AJAX script for submitting (post) and getting the same form page.

Best regards
Philipp

46
сказал 10.05.2007 в 12.58

AJAX pluginy pro Smarty…

AJAXové rozšíření pro šablonový systém Smarty nabízí Dmitrij Štefljuk

47
dvs
сказал 11.05.2007 в 14.52

использую ajax_form
по моему работает не совсем корректно, а именно:
при наличии на форме нескольких элементов с типом submit значение всех их отправляется на сервер

48
dnk
сказал 22.05.2007 в 9.53

Добрый день Дмитрий!
У меня проблема такая.
Использую ajax_update , но контент для обновления берется из яваскрипта такого рода:

Это новостная лента.
Так вот ajax_update его содержимое не выводит в

Любую статику или локальные данные выводит нормально!
Как быть?
Спасибо.

49
сказал 22.05.2007 в 10.18

Здравствуйте
Чтобы выполнять JavaScript, который пришел в AJAX ответе, придется немного поправить smarty_ajax.js. Метод update, который сейчас выглядит так:

update: function(update_id, url, method, params, callback) {
    var myAjax = new Ajax.Updater(
      update_id,
      url,
      {
        method: method,
        parameters: params,
        onComplete: callback
      });
  },

Нужно добавить опцию evalScripts:

update: function(update_id, url, method, params, callback) {
    var myAjax = new Ajax.Updater(
      update_id,
      url,
      {
        method: method,
        parameters: params,
        onComplete: callback,
        evalScripts: true
      });
  },

Да, в последнем комментарии вы ошиблись при вставке кода, закрывающий тег — </code>. Извиняюсь, это у меня ошибка в подсказке, и я ее сейчас исправлю.

50
Jesse
сказал 28.05.2007 в 1.10

Is it possible to use this for uploading images and other files. Right now, it wont let me, everything else works great. Any help on this? Thanks

51
dnk
сказал 01.06.2007 в 14.44

Добрый день!
Не помогло!

<h2>Глобальная новостная лента</h2>
<p>
  <script language="JavaScript1.2" src="http://img.lenta.ru/r/js/t111.js" type="text/javascript"> </script>
</p>

Этот скрипт всё равно не выводится функцией update_intro
Выводятся только слова - Глобальная новостная лента…

52
сказал 01.06.2007 в 15.07

Добрый день, Вера
Да, действительно, так оно не будет работать в связи с тем, что подключение внешних скриптов не работает автоматически. Скорее всего придется разобрать response вручную с помощью регулярных выражений, и затем подключить файл со скриптом.

Вот по-быстрому набросал пример (s — это текст, который Вы получаете в результате AJAX-запроса (проверил в IE и Firefox).

var s = "<script src=\"http://img.lenta.ru/r/js/t111.js\" type=\"text/javascript\"><\/script>";

var fragment = '<script[^>]*src="([^"]*?)"[^>]*>([\u0001-\uFFFF]*?)<\/script>';
var matchAll = new RegExp(fragment, 'img');
var matchOne = new RegExp(fragment, 'im');

var scripts = s.match(matchAll) || [];
for (var i = 0, length = scripts.length; i < length; i++) {
    var matches;
    if (matches = scripts[i].match(matchOne)) {
        var script = document.createElement('SCRIPT');
        script.src = matches[1];
        script.type = 'text/javascript';
        document.body.appendChild(script);
    }
}
53
dnk
сказал 01.06.2007 в 16.09

Не совсем понятно куда этот JSкрипт вставлять!
Я его вызываю и newsline.tpl

<h2>Глобальная новостная лента</h2>
<p>
<script language="JavaScript" type="text/javascript" src="newsline.js"></script>
</p>

который запускается Smatry из функции intro_update

Не выводит ничего
Я кстати не Вера! Меня Дмитрий зовут… :)

54
сказал 01.06.2007 в 16.43

Ой, простите, попутал. email показался похожим :-) А Вы часом не из Котовска?

Тэкс, относительно скрипта. Придется чуток поправить smarty_ajax.js

update: function(update_id, url, method, params, callback) {
    var myAjax = new Ajax.Updater(
      update_id,
      url,
      {
        method: method,
        parameters: params,
        onComplete: callback || this.onUpdate
      });
  },

  onUpdate: function(originalRequest) {
    var result = originalRequest.responseText;

    var fragment = '<script[^>]*src="([^"]*?)"[^>]*>([\u0001-\uFFFF]*?)<\/script>';
    var matchAll = new RegExp(fragment, 'img');
    var matchOne = new RegExp(fragment, 'im');

    var scripts = result.match(matchAll) || [];
    for (var i = 0, length = scripts.length; i < length; i++) {
      var matches;
      if (matches = scripts[i].match(matchOne)) {
        var script = document.createElement('SCRIPT');
        script.src = matches[1];
        script.type = 'text/javascript';
        document.body.appendChild(script);
      }
    }
  },

Вроде бы должно помочь…

55
сказал 01.06.2007 в 16.44

Кстати, тезка, может ICQ (107989380) — тогда решим Вашу проблему быстрее вместе :-)

56
сказал 01.06.2007 в 17.38

то что искал. Спасибо.

57
Alex
сказал 15.06.2007 в 17.13

Привет!
Возможно ли решить такую задачу? Как-то заставить работать document.forms.poll_update.submit();

{ajax_form method="post" id="poll_update" url="index.php?p=news&amp;area=$area&amp;newsid=$newsid" callback="submit_av"}
...
...
...
{/ajax_form}

<script language="javascript">
function submit_av(originalResponse)
{ldelim}
    $("user_poll").innerHTML = originalResponse.responseText;
{rdelim}
</script>

<a href=# onclick="check()">VOTE</a>

<script language="javascript">
function check()
{ldelim}
     document.forms.poll_update.vote.value=6;
     document.forms.poll_update.submit();
{rdelim}
</script>
58
Alex
сказал 19.06.2007 в 20.55

Hey this is a great library, thanks very much.

Is there a way of getting smarty to process the output. For instance, in my HTML I have

{section name=i loop=$faItems}
  //build a table of faItems
{/section}

In my php I create the faItems array. I would like to be able to update this object remotely and re-display it. Can I do this?

I have tried

$t->assign('faItems', $faItems);

But of course it does not work

59
Николай
сказал 14.08.2007 в 19.15

Люди есть проблема! В FireFox 2.0.0.6 и Опера 9.23 РАБОТАЕТ ВСЕ замечательно! ( {ajax_update} )
А вот в ИЕ6 НЕТ. В чем может быть проблема? Плз.

60
Александр
сказал 05.10.2007 в 14.52

А как через ajax_update обновить список select ?

61
Александр
сказал 06.10.2007 в 15.15

В общем товарищи конечно без обид, но лучше используйте библиотеку xajax !
Под смарти затачивается на раз !

62
сказал 13.11.2007 в 10.03

Дмитрий, а Вы не могли бы уделить немного времени и написать третью часть по использованию данных плагинах, но в этой статье более подробно описать принцип создания и взаимодействия…. если честно, уже столько времени бьюсь и не понимаю многих вещей…вроде и и понятно, но в тоже время не получается… Где то в комментах, некий гражданин выложил улучшенную версию с поддержкой ООП - а это именно то, что меня интересует… просто хочется увидеть мануал, где по этапам расписано, как и что применять…))) Ну если не сложно… Заранее спасибо.

63
Vovanovski
сказал 30.11.2007 в 15.15

Привет Критик!
Такой вот вопросик по ajax_form:
у тебя в примерах форма сабмититься без перезагрузки страницы по нажатию на кнопку типа submit, а как сделать так, чтобы форма сабмитилась, если например внутри формы есть элемент select и должен происходить сабмит по onchange селекта? Если я пишу в селекте this.form.submit() то происходит перезагрузка страницы.

64
digitalapha
сказал 06.02.2008 в 6.50

I am having difficluty processing the ajax form
here. I m building a simple form, which display info in a table format like Name, Age, etc.

e.g. in the register.php example

{ajax_form method=”post” id=”myform”=”index.php?}



if $_POST()…
echo???

{/ajax_form}

is it possible in the $_POST {

instead of using the echo to put the value to an array, can we display a smarty template out e.g.

$smarty->display(outputgrid.tpl”

i.e. want to process the form, and then assign smart values, and then give back to a smarty template.

65
сказал 26.03.2008 в 14.54

hello kpumuk,
great work, thank you very much.

i found the params isn’t working when using ajax_update.
can’t figure out why.

this code

{foreach from=$DB_RESULTS item=row_obj key=news_id }
<li>
<a href="#" onclick="{ajax_update update_id='intro_content'  function='view_news' params='page=news&&news_id='$row_obj->news_id' '}">read news</a>
</li>
 {foreachelse}

error display

Catchable fatal error: Object of class stdClass could not be converted to string in F:\Website\www\e-job_V2\resources\templates_c\%%3C^3CF^3CFBC54C%%news.tpl.php on line 43

$row_obj->news_id isn’t working

regards,
Nattaphon

66
fauzia
сказал 01.04.2008 в 9.50

hi,

I made a function in index.php getting list of products.
I tpl i called ajax-update function to get list of products in a box.It is giving js-error “Object SmartyAjax not found”.What is my mistake?

67
fauzia
сказал 01.04.2008 в 10.50

hi,

I solved previouse problem.Now I am using ajax_update without function to send params to certain url.I want to send cat_id which is I am getting in section of template page.here is code:

{section name=cat loop="$category"}  
 <tr>
 <td id="category_trid{$category[cat].id}" class="contenttext2">{$category[cat].id}
 <a href="#" onclick="{ajax_update update_id='productlist_div'   params='catid=`$category[cat].id`&page=product_list_ajax'}">{$category[cat].title}</a>
 </td></tr>
 {sectionelse}
 <tr><td>No category..</td></tr>
{/section}

I am not getting catid value but “$category[cat].id”.why?
but it is giving code text in params not its value

68
сказал 04.04.2008 в 21.38

Добрый день.

Дмитрий, у меня вопрос. Есть форма калькулятора.

{ajax_form method="post" id="calculator" url="index.php" params="task=calculator&amp;param=$someparam"}

После submit возвращает на index.php, get параметры не передаются. Если в функции smarty_block_ajax_form убрать action=” - работает, но с перезагрузкой…
Чего не так?

Оставить отзыв

Вы можете использовать простые теги форматирования HTML (вроде <a>, <ul> and others). Чтобы вставить пример код, используйте <code lang="php">$a = "hello";</code> (поддерживаемые языки: ruby, php, yaml, html, csharp, javascript). Также Вы можете использовать <code>$a = "hello";</code>, синтаксис не будет подсвечен. Если вы не хотите использовать тег <code>, замените символ < на &lt;.

Отправить

 
Copyright © 2005 - 2008, Dmytro Shteflyuk