<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AJAX Planet &#187; AJAX</title>
	<atom:link href="http://www.ajaxplanet.ru/category/technology/ajax/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxplanet.ru</link>
	<description></description>
	<lastBuildDate>Wed, 21 Jul 2010 10:42:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>It&#8217;s time to make things Ajax или Ajax используя symfony</title>
		<link>http://www.ajaxplanet.ru/its-time-to-make-things-ajax-ili-ajax-ispolzuya-symfony/</link>
		<comments>http://www.ajaxplanet.ru/its-time-to-make-things-ajax-ili-ajax-ispolzuya-symfony/#comments</comments>
		<pubDate>Mon, 23 Apr 2007 06:00:22 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[script.aculo.us]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/its-time-to-make-things-ajax-ili-ajax-ispolzuya-symfony/</guid>
		<description><![CDATA[Symfony Symfony – это мощный опен-сорсный PHP фреймворк. На сайте проекта можно найти множество статей (перевод одной, вы сейчас читаете), видео-примеры, обширную документацию и достаточно объемную книгу, доступную on-line. Одна особенность статьи, что пример разработки, ведется на unix-like системе, думаю, это никого не испугает, а наоборот привлечет внимание. Обзор В symfony есть Ajax хелпер, который [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Symfony</strong><br />
<noindex><a href="http://www.symfony-project.com/">Symfony</a></noindex> – это мощный опен-сорсный PHP фреймворк. На сайте проекта можно найти множество статей (перевод одной, вы сейчас читаете), видео-примеры, обширную документацию и достаточно объемную книгу, доступную on-line. Одна особенность статьи, что пример разработки, ведется на unix-like системе, думаю, это никого не испугает, а наоборот привлечет внимание.</p>
<p><strong>Обзор</strong><br />
В symfony есть Ajax хелпер, который позволяет очень быстро и просто создавать продуманные пользовательские интерфейсы. Это руководство покажет, как шаг за шагом создать Ajax-powered приложение, используя symfony, всего за 10 минут. </p>
<p><strong>Вступление</strong><br />
Для лентяев, которых утомляет чтение, есть <noindex><a href="http://downloads.symfony-project.com/demo/cart/cart.mov">видео-пример</a></noindex>, который показывает ниже изложенные действия. </p>
<p>Добавление позиции в корзину покупок в электронной торговли не очень близка к фактическому добавлению в корзину, поскольку требуется нажать на ссылку &#8220;добавить в корзину&#8221;, просмотреть открывшуюся страницу (“корзина”), а после вернуться на страницу с товаром.</p>
<p>Ajax позволяет приблизить метафорическое добавление товара в корзину в Интернет магазине к фактическому (как например вы это делаете в супермаркете). Подобный эффект достигается добавлением drag&amp;drop возможности и моментальной перерисовки вышей корзины.</p>
<p>Описываемы в статье пример является портом <noindex><a href="http://script.aculo.us/demos/shop">примера корзины</a></noindex> на сайте <noindex><a href="http://script.aculo.us/">script.aculo.us</a></noindex>. В примере используется JavaScript фреймворк <noindex><a href="http://prototype.conio.net/">prototype</a></noindex> (который входит в состав symfony) и несколько скриптов из библиотеки  <noindex><a href="http://script.aculo.us/">script.aculo.us</a></noindex>, которые входят в состав JavaScript хелпера.</p>
<p><strong>Настройка</strong><br />
Для начала, создайте проект <em>sfdemo</em>, приложение <em>app</em> и модуль <em>card</em>:</p>
<p><code>$ cd /home/steve<br />
$ mkdir sfdemo<br />
$ cd sfdemo<br />
$ symfony init-project sfdemo<br />
$ symfony init-app app<br />
$ symfony init-module app cart</code></p>
<p>Настройте ваш веб-сервер, чтобы был доступ к вашему новому приложению (неважно как вы этого добьётесь используя виртуальный хост или alias’ы (в unix-like системах с помощью этой команды создается псевдоним какого-либо скрипта или приложения), как описано в главе <noindex><a href="http://www.symfony-project.com/content/book/page/web_server.html">настройки веб-сервера</a></noindex> в документации). Давайте предположим, что модуль <em>card</em> доступен отсюда:</p>
<p><code><noindex><a href="http://localhost/cart/">http://localhost/cart/</a></noindex></code></p>
<p>Ваше приложение должно иметь доступ к symfony JavaScript библиотекам. Если приложение не работает, проверти доступ к библиотекам через браузер (зайдите на http://localhost/sf/js/prototype.js, например). Если страница не загрузилась, есть три способа решения этой проблемы: </p>
<li>настроить Apache используя следующий alias:
<p><code>Alias /sf /$data_dir/symfony/web/sf</code></li>
<li>сделать символическую ссылку <em>sf</em>  в вашем веб-катологе
<p><code>$ cd /home/steve/sfdemo/web<br />
$ ln -sf /$data_dir/symfony/web/sf sf</code></li>
<li>скопировать JavaScript файлы в
<p><code>$ cd /home/steve/sfdemo/web<br />
$ mkdir -p sf/js<br />
$ cp /$data_dir/symfony/web/sf/js/*.js sf/js/</code></li>
<p><strong>Главная страница</strong><br />
Сначала нужно создать список продуктов, выставленных на продажу. Доступ к этому списку будет осуществляться через метод <em>getProducts()</em> action класса <em>card</em>. Корзина будет является полем объекта <em>sfUser</em>, устанавливаемый через <noindex><a href="http://www.symfony-project.com/content/book/page/parameter_holder.html">Attribute parameter holder</a></noindex>. Измените <em>sfdemo/app/modules/cart/actions/actions.class.php на:</em></p>
<p><code lang="php"><br />
class cartActions extends sfActions<br />
  {<br />
  public function executeIndex()<br />
  {<br />
  $this->getUser()->setAttribute('cart', array());<br />
  $this->products = $this->getProducts();<br />
  }<br />
  private function getProducts()<br />
  {<br />
  return array('iPod black', 'iMac', 'iMac RC', 'iPod');<br />
  }<br />
  }<br />
</code></p>
<p>Главная страница модуля <em>card</em> будет содержать список товаров и место, куда они будут перетаскиваться (drop zone). Это место и будет корзиной. Итак, откройте шаблон <em>sfdemo/app/modules/cart/templates/indexSuccess.php</em> и впишите туда следующие:</p>
<p><code lang="php"><br />
<h1>symfony Apple store demo</h1>
<div id="shopping_cart">
<h2>Products:</h2>
<div id="product_list">
< ?php foreach($products as $id => $title): ?><br />
< ?php echo image_tag(’product’.$id, array(<br />
‘id’    => ‘product_’.$id,<br />
‘class’ => ‘products’<br />
)) ?><br />
< ?php endforeach ?>
</div>
<h2>Cart:</h2>
<div id="cart" class="cart">
</div>
</div>
<p></code></p>
<p>Теперь товары будут отображаться в виде картинок. Эти картинки можно скачать в этом архиве, их следует положить в <em>sfdemo/web/images/</em>. Часть стилей уже сделаны, так что стоит их просто забрать <noindex><a href="http://www.symfony-project.com/downloads/demo/cart/cart.css">отсюда</a></noindex>, и положить в <em>sfdemo/web/css/</em> также нужно добавить файл <em>view.yml</em> в <em>sfdemo/app/modules/cart/config/</em>  со следующим содержанием:</p>
<p><code>all:<br />
  stylesheets:  [cart]</code></p>
<p>(Обратитесь к <noindex><a href="http://www.symfony-project.com/book/trunk/07-Inside-the-View-Layer">документации</a></noindex>, если вас смущают *.yml)</p>
<p>Смотрим результат:</p>
<p><code><noindex><a href="http://localhost/cart/">http://localhost/cart/</a></noindex></code></p>
<p><strong>Фокусируемся на корзине.</strong><br />
Содержание корзины будет меняться, как только вы перенесете туда товар. Это значит что содержание корзины будет вынесено в отдельный файл шаблона. Для этого используем хелпер <em>include_partial()</em>. Товары в корзине будут «сохраняться» в div’ы со стилем <em>float:left</em>, а дальше после корзины нужно не забыть добавить стиль <em>clear:both</em>. (для тех, кто не понял зачем это смотрим <noindex><a href="http://www.w3.org/TR/REC-CSS2/visuren.html#flow-control">спецификации</a></noindex>) Измените конец шаблона <em>indexSuccess.php</em> на:</p>
<p><code lang="php"><br />
<h2>Cart:</h2>
<div id="cart" class="cart">
<div id="items">
      < ?php include_partial(’cart’) ?>
    </div>
<div style="clear:both"></div>
</p></div>
<p></code></p>
<p>Хелпер <em>include_partial()</em> заинклудит файл <em>sfdemo/app/modules/cart/templates/_cart.php</em>, который должен содержать следующее:</p>
<p><code lang="php">< ?php foreach($sf_user->getAttribute(’cart’) as $product_id => $quantity): ?></p>
<div>
  < ?php for($i = 1; $i <= $quantity; $i++): ?><br />
    < ?php echo image_tag(’product’.$product_id, array(<br />
      ‘class’ => ‘cart-items’,<br />
      ‘id’    => ‘item_’.$product_id.’_’.$i,<br />
      ’style’ => ‘position:relative’<br />
    )) ?><br />
  < ?php endfor ?><br />
  (< ?php echo $quantity ?> < ?php echo $products[$product_id] ?>)
</div>
<p>< ?php endforeach ?></p>
<p>< ?php if (!$sf_user->getAttribute(’cart’)): ?><br />
  nothing yet in your shopping cart.<br />
< ?php endif ?> </code></p>
<p>Если в корзине есть товар, то он отображается в виде картинок столько раз, сколько он туда добавлен. После группы товаров будет отображаться счетчик (переменная <em>$quantity</em>).<br />
Можно опять посмотреть на нашу корзину:</p>
<p><code><noindex><a href="http://localhost/cart/">http://localhost/cart/</a></noindex></code></p>
<p>На самом деле изменений не много, выглядит по-прежнему пусто… Настало время AJAX’a. (в оригинале <strong>«It&#8217;s time to make things AJAX»</strong>.)</p>
<p><strong>Добавляем JavaScript’овые события.</strong><br />
Добавьте в <em>indexSuccess.php</em> загрузку JavaScript хелпера:</p>
<p><code lang="php">< ?php use_helper(’Javascript’) ?></code></p>
<p>Теперь нужно сделать картинки перетаскиваемыми (draggable), для этого нужно добавить вызов <em>draggable_element</em>:</p>
<p><code lang="php">< ?php foreach($products as $id => $title): ?><br />
  < ?php echo image_tag(’product’.$id, array(<br />
    ‘id’    => ‘product_’.$id,<br />
    ‘class’ => ‘products’<br />
  )) ?><br />
  < ?php echo draggable_element(’product_’.$id, array(’revert’ => true)) ?><br />
< ?php endforeach ?></code></p>
<p>Этим мы добавим ко всем картинкам возможность перетаскивания. Опция <em>revert</em> добавляет возврат картинки на старую позицию, как только ее отпустят. </p>
<p>Теперь нужно определить, что будет происходить, как только пользователь бросит (перетащит) иконку товара в нашу корзину. Для этого укажем, какая часть шаблона должна обновится, какой action за это событие будет отвечать, и какие из перетаскиваемых элементов можно будет перетащить в корзину. Воспользуйтесь <em>drop_receiving_elements</em> хелпером для этого:</p>
<p><code lang="php">< ?php echo drop_receiving_element(’cart’, array(<br />
  ‘update’     => ‘items’,<br />
  ‘url’        => ‘cart/add’,<br />
  ‘accept’     => ‘products’,<br />
)) ?></code></p>
<p>Снова можно проверить результат, попробуйте перетащить иконку товара в корзину, должно работать. Как только иконка перетаскивается в корзину, XMLHTTPRequest отправляет запрос <em>add</em> action’у, и результат отображается в div’е <em>items</em>. Только дело в том, что action <em>add</em> модуля <em>card</em> мы еще не создали…</p>
<p><strong>Создаем action обновления.</strong><br />
Добавьте add action в <em>sfdemo/app/modules/cart/actions/actions.class.php</em>:</p>
<p><code lang="php">public function executeAdd()<br />
{<br />
  $tmp = split('_', $this->getRequestParameter(’id’, ”));<br />
  $product_id = $tmp[1];</p>
<p>  $cart = $this->getUser()->getAttribute(’cart’);<br />
  if (!isset($cart[$product_id]))<br />
  {<br />
    $cart[$product_id] = 1;<br />
  }<br />
  else<br />
  {<br />
    ++$cart[$product_id];<br />
  }<br />
  $this->getUser()->setAttribute(’cart’, $cart);<br />
  $this->products = $this->getProducts();<br />
}</code></p>
<p>Action разбирает присланные параметры (id товара) и добавляет этот товар в корзину. </p>
<p>Результатом работы action’а add будет шаблон addSuccess.php. Здесь простой инклуд (используя  include_partial) _cart.php, только в этот раз необходимо передавать список товаров в параметрах:</p>
<p><code lang="php">< ?php include_partial(’cart’, array(’products’ => $products)) ?></code></p>
<p>Шаблон не должен использовать глобальное расположение, чтобы изменить это отредактируйте <em>sfdemo/app/modules/cart/config/view.yml</em>, вписав следующие: </p>
<p><code>addSuccess:<br />
  has_layout:   off</p>
<p>all:<br />
  has_layout:   on<br />
  stylesheets:  [cart]</code></p>
<p>Посмотрите результат: теперь элементы должны добавляться в корзину без проблем.</p>
<p><strong>Фокусируемся на юзабилити.</strong><br />
Можно остановиться на этом, но есть один большой недостаток: пока корзина обновляется, интерфейс не меняется и это может смутить пользователя. Выход из этой ситуации – добавление индикатора, который показывает, что запрос в процессе обработки. И еще, пользователь может не понять, что перетаскиваемые элементы будут приняты «корзиной», поэтому стоит добавить стиль <em>hover</em> к слою <em>cart</em>.</p>
<p>Отредактируйте шаблон <em>indexSuccess.php</em>:</p>
<p><code lang="php">
<div style="height:20px">
<p id="indicator" style="display:none">
< ?php echo image_tag(’indicator.gif’) ?> updating cart…
</p>
</div>
<p></code></p>
<p> Сохраните <noindex><a href="http://www.symfony-project.com/downloads/demo/cart/indicator.gif">картинку</a></noindex> в файл <em>sfdemo/web/images/indicator.gif </em></p>
<p>Теперь, нужно изменить в этом же шаблоне вызов хелпера <em>drop_receiving_element()</em>: добавить отображение индикатора и <em>hover</em> стиль:</p>
<p><code lang="php">< ?php echo drop_receiving_element(’cart’, array(<br />
  ‘update’     => ‘items’,<br />
  ‘url’        => ‘cart/add’,<br />
  ‘accept’     => ‘products’,<br />
  ’script’     => ‘true’,<br />
  ‘hoverclass’ => ‘cart-active’,<br />
  ‘loading’    => "Element.show(’indicator’)",<br />
  ‘complete’   => "Element.hide(’indicator’)"<br />
)) ?></code></p>
<p><strong>Заключение.</strong><br />
Полный код статьи можно скачать <noindex><a href="http://www.symfony-project.com/downloads/demo/cart/project.tgz">отсюда</a></noindex>, также доступен рабочий <noindex><a href="http://www.symfony-project.com/demo/cart.html">пример он-лайн</a></noindex>. </p>
<p>Пока полная документация по JavaScript хелперу не дописана, можно воспользоваться <noindex><a href="http://wiki.script.aculo.us/scriptaculous/list?category=Controls">документацией script.aculo.us</a></noindex>.</p>
<p><noindex><a href="http://www.symfony-project.com/tutorial/symfony_ajax.html">Оригинальная статья.</a></noindex></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/its-time-to-make-things-ajax-ili-ajax-ispolzuya-symfony/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/its-time-to-make-things-ajax-ili-ajax-ispolzuya-symfony/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/its-time-to-make-things-ajax-ili-ajax-ispolzuya-symfony/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
<enclosure url="http://downloads.symfony-project.com/demo/cart/cart.mov" length="15190805" type="video/quicktime" />
		</item>
		<item>
		<title>Google Web Toolkit. Небольшое руководство</title>
		<link>http://www.ajaxplanet.ru/google-web-toolkit-manual/</link>
		<comments>http://www.ajaxplanet.ru/google-web-toolkit-manual/#comments</comments>
		<pubDate>Mon, 29 Jan 2007 05:35:17 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[gwt]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[JAXA]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/google-web-toolkit-manual/</guid>
		<description><![CDATA[0. О статье. Это перевод статьи Джоана Хуртадо (Juan Hurtado) &#8220;GWT Small Guide&#8221;. Оригинал доступен на испанском и английском. Возможно перевод получится грубым, так как я очень торопился, буду рад узнать ваше мнение насчет качества перевода. Потапов Геннадий (TermiT) 1. Введение. 1.1. Презентация Я написал это небольшое руководство для людей, которые хотят научится создавать динамические [...]]]></description>
			<content:encoded><![CDATA[<p><strong>0.  О статье.</strong></p>
<blockquote><p>Это перевод статьи <noindex><a href="http://angel.hurtado.googlepages.com/">Джоана Хуртадо (Juan Hurtado)</a></noindex> &#8220;GWT Small Guide&#8221;. Оригинал доступен на <noindex><a href="http://angel.hurtado.googlepages.com/tutorialgwt">испанском</a></noindex> и <noindex><a href="http://angel.hurtado.googlepages.com/tutorialgwt2">английском</a></noindex>. Возможно перевод получится грубым, так как я очень торопился, буду рад узнать ваше мнение насчет качества перевода.</p>
</blockquote>
<p style="text-align: right;"><noindex><a href="http://toodoo.ru/user/4530/profile">Потапов Геннадий (TermiT)</a></noindex></p>
<div>
<p><strong>1. Введение.</strong></p>
<p><strong>1.1. Презентация</strong><br />
Я написал это небольшое руководство для людей, которые хотят научится создавать динамические приложения пользуясь <noindex><a href="http://code.google.com/webtoolkit/">GWT</a></noindex> (Google Web Toolkit) в AMP (Apache MySQL PHP)  среде. Основная идея в том, чтобы написать небольшой и очень простое приложение с использованием <noindex><a href="http://www.php.net/">PHP</a></noindex> и <noindex><a href="http://www.mysql.com/">MySQL</a></noindex> на стороне сервера, GWT для реализации интерфейса, <noindex><a href="http://www.json.org/">JSON</a></noindex> для обмена данными между клиентской и северной частями.</p>
<p><strong>1.2. О JSON</strong><br />
JSON (JavaScript Object Notation) &#8211; это легкий и удобный формат обмена данными. Отличительной чертой является то, что он прост и понятен для человека. Этот формат легко обрабатывается и генерируется программами. Он основан на языке <noindex><a href="http://www.crockford.com/javascript" title="JavaScript">JavaScript</a></noindex>, <noindex><a href="http://www.ecma-international.org/publications/files/ecma-st/ECMA-262.pdf" title="ECMA-262" rel="nofollow">Standard ECMA-262 3rd Edition — December 1999</a></noindex>. JSON — это текстовый формат, не зависящий от языка программирования. JSON использует соглашения близкие к Си-подобным языкам, включая C, C++, C#, Java, JavaScript, Perl, Python, и много других. Все это делает JSON идеальным языком для обмена данными. Вы можете найти много полезной информации о JSON здесь <noindex><a href="http://www.json.org/" title="JSON">www.json.org</a></noindex> (и тут: <noindex><a href="http://ru.wikipedia.org/wiki/JSON">ru.wikipedia.org/wiki/JSON</a></noindex>)</p>
<p><strong>1.3. О GWT</strong><br />
GWT (Google Web Toolkit) &#8211; это инструмент позволяющий легко создавать AJAX (<noindex><a href="http://ru.wikipedia.org/wiki/AJAX">ru.wikipedia.org/wiki/AJAX</a></noindex>) приложения на языке JAVA, проще говоря, GWT &#8220;переводит&#8221; ваш JAVA код в HTML и JavaScript. Подробнее о GWT  можно прочесть по адресу <noindex><a href="http://code.google.com/webtoolkit/">http://code.google.com/webtoolkit/</a></noindex></p>
<p><strong>1.4. Об этом руководстве</strong><br />
Мы сделаем небольшое приложение для поиска информации по сотрудникам в базе данных MySQL, используя в качестве параметра поиска имя сотрудника.</p>
<p><strong>2. Работа над серверной частью.</strong></p>
<p><strong>2.1. База данных</strong><br />
Нам нужна всего одна таблица, которая будет называться &#8216;directory&#8217;, и которую мы заполним информацией о сотрудниках:</p>
<p><noindex><a href="http://angel.hurtado.googlepages.com/database.png/database-full.jpg"><img src="http://angel.hurtado.googlepages.com/database.png/database-full.jpg" src="http://angel.hurtado.googlepages.com/database.png/database-full.jpg" alt="" width=470 border="0" /></a></noindex><br />
<strong>2.2. PHP скрипт</strong><br />
Для доступа к данным базы напишем PHP скрипт. Он будет выбирать данные и преобразовывать в JSON формат. Для этого будем использовать JSON PHP class, который можно скачать отсюда <noindex><a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198">http://pear.php.net/pepr/pepr-proposal-show.php?id=198</a></noindex>. Этот класс позволяет преобразовывать значения из PHP в JSON формат и отправлять их браузеру. Файл &#8216;index.php&#8217; будет содержать следующий код:</p>
<p><code lang="php"><br />
< ?</p>
<p>// вызов JSON.php<br />
require_once(”JSON.php”);</p>
<p>// коннект к базе</p>
<p>$conector = mysql_connect(’localhost’, ‘root’, ‘juan’) or die(mysql_error());<br />
mysql_select_db(’JSONPHP’) or die(mysql_error());</p>
<p>//формируем запрос</p>
<p>$sqlQuery = “SELECT * FROM directory WHERE name LIKE ‘”. $_REQUEST[’tosearch’]. “%’”;<br />
$dataReturned = mysql_query($sqlQuery) or die(mysql_error());<br />
$i = 0;</p>
<p>while($row = mysql_fetch_array($dataReturned)){</p>
<p>// заполняем массив $value данными.</p>
<p>$value{”item”}{$i}{”Employe Number”}= $row[’enumber’];<br />
$value{”item”}{$i}{”Name”}= $row[’name’];<br />
$value{”item”}{$i}{”Position”}= $row[’position’];<br />
$value{”item”}{$i}{”Phone Number”}= $row[’phnumber’];<br />
$value{”item”}{$i}{”Location”}= $row[’location’];<br />
$i++;<br />
}</p>
<p>// использую JSON.php конвертируем данные в JSON формат и отправляем в браузер</p>
<p>$json = new Services_JSON();<br />
$output = $json->encode($value);<br />
print($output);<br />
?>
</p>
<p></code></p>
<p>И это весь код. Вывод этого php скрипта должен быть похож на следующие:<code>{"item":[{<br />
"Employe Number":"110009",<br />
"Name":"Juan Hurtado",<br />
"Position":"System Analist",<br />
"Phone Number":"81001121",<br />
"Location":"Monterrey City"}]<br />
} </code>Теперь пора заняться интерфейсом и GWT.</p>
<p><strong>3. Работа над клиентской частью.</strong></p>
<p><strong>3.1 Пример с JSON RPC</strong><br />
На сайте http://code.google.com/webtoolkit/ есть несколько примеров использования GWT. Один из них показывает, как использовать GWT  в связке с JSON для доступа к сервису <noindex><a href="http://www.yahoo.com/">Yahoo</a></noindex>.  Мы возьмем за основу нашего интерфейса пример JSON RPC, который можно скачать <noindex><a href="http://code.google.com/webtoolkit/documentation/examples/jsonrpc/">тут</a></noindex>.</p>
<p><strong>3.2 Создание нового приложения</strong><br />
Используя  projectCreator.cmd (этот файл находится в дистрибутиве GWT) создадим новый проект:<br />
<code>C:\&gt;projectCreator.cmd -eclipse PHPJSON -out PHPJSON<br />
Created directory PHPJSON\src<br />
Created file PHPJSON\.project<br />
Created file PHPJSON\.classpath</code><br />
Теперь создадим новый проект для eclipse с помощью <noindex><a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.doc.DeveloperGuide.Fundamentals.CommandLineTools.applicationCreator.html">applicationCreator.cmd</a></noindex>:<br />
C:\&gt;applicationCreator.cmd -eclipse PHPJSON -out PHPJSON com.juan.client.PHPJSON</p>
<p>Created directory PHPJSON\src\com\juan<br />
Created directory PHPJSON\src\com\juan\client<br />
Created directory PHPJSON\src\com\juan\public<br />
Created file PHPJSON\src\com\juan\PHPJSON.gwt.xml<br />
Created file PHPJSON\src\com\juan\public\PHPJSON.html<br />
Created file PHPJSON\src\com\juan\client\PHPJSON.java<br />
Created file PHPJSON\PHPJSON.launch<br />
Created file PHPJSON\PHPJSON-shell.cmd<br />
Created file PHPJSON\PHPJSON-compile.cmd</p>
<p>Пример JSON RPC содержит классы, которые позволяют обрабатывать иформацию в формате JSON. (Тут говорится о старой версии примера JSON RPC; в новой версии примера JSON RPC эти файлы не идут в дистрибутиве примера, так как эти классы стали стандартными в новой версии GWT. Но никто не мешает вам следовать примеру, все это будет работать и с новой версией GWT)  Скопируем из примера следующие файлы в папку PHPJSON\src\com\juan\client:</p>
<ul>
<li>JSONArray.java
</li>
<li>JSONBoolean.java
</li>
<li>JSONException.java
</li>
<li>JSONNumber.java
</li>
<li>JSONObject.java
</li>
<li>JSONParser.java
</li>
<li>JSONString.java
</li>
<li>JSONValue.java</li>
</ul>
<p>Во всех файлах нужно заменить строчку с данными о пути пакета. (в нашем случае нужно заменить package com.google.gwt.sample.json.client; на package com.juan.client;) Также исправьте пути в файле JSONParser.java. Затем импортируем наш проект в Eclipse как написано в <noindex><a href="http://code.google.com/webtoolkit/gettingstarted.html#NewEclipse">документации по GWT</a></noindex>. Запустите Eclipse и кликните в меню File -&gt; Import. В появившемся окне выберите пункт &#8216;Existing Projects into Workspace&#8217;, укажите путь к файлу .project в следующем окне. После этого вы должны увидеть ваш GWT проект:</p>
<p><noindex><a href="http://photos1.blogger.com/blogger2/2623/301412589031540/1600/eclipse.jpg"><img src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/eclipse.jpg" src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/eclipse.jpg" alt="" border="0" /></a></noindex><br />
Создадим класс JSONRequester и опишем следующие метод:</p>
<p><code lang="JavaScript"><br />
public Widget initializeMainForm() {<br />
/*<br />
* Иницилизация и установка панели, которая будет содержать<br />
* поисковую форму и вывод результата<br />
*/</code></p>
<p>FocusPanel fpn = new FocusPanel();<br />
Grid gd = new Grid(1,2);</p>
<p>b1.setText(”Search”);<br />
b1.addClickListener(new SearchButtonClickListener());</p>
<p>gd.setWidget(0, 0, txtBox);<br />
gd.setWidget(0, 1, b1);</p>
<p>gdOut.setWidget(0,0,gd);</p>
<p>gdOut.setBorderWidth(1);<br />
gdOut.setWidth(”500px”);</p>
<p>childGrid.setCellPadding(0);<br />
childGrid.setCellSpacing(0);<br />
childGrid.setWidth(”490px”);</p>
<p>fpn.add(gdOut);</p>
<p>return fpn;<br />
}</p>
<p>Как вы видете создается элемент <noindex><a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.user.client.ui.FocusPanel.html">FocusPanel</a></noindex>, затем мы прикрепляем эелемент <noindex><a href="http://code.google.com/webtoolkit/documentation/com.google.gwt.user.client.ui.Grid.html">Grid</a></noindex>(Сетка), на этой сетке располагаем все нужные элементы. В обработчике клика по кнопке создается класс SearchButtonClickListener, которые будет содержать следующие строки:</p>
<p><code lang="JavaScript"><br />
private class SearchButtonClickListener implements ClickListener {</code></p>
<p>public void onClick(Widget sender) {<br />
/*<br />
* Когда пользователь нажимает кнопку мы получаем URL.<br />
*/<br />
itemNumber = 0;<br />
doFetchURL();<br />
}</p>
<p>private void doFetchURL() {<br />
/*<br />
* Получаем URL и вызываем обработчик<br />
*/<br />
b1.setText(”Searching …”);<br />
if (!HTTPRequest.asyncGet(DEFAULT_SEARCH_URL + “?tosearch=” + txtBox.getText(),</p>
<p>new JSONResponseTextHandler())) {</p>
<p>b1.setText(”Search”);<br />
}<br />
}<br />
}</p>
<p>Этот класс содержит метод doFetchURL(), с помощью которого находится URL и вызывается класс JSONResponseTextHandler() для выполнения операций над JSON документом:</p>
<p><code lang="JavaScript"><br />
private class JSONResponseTextHandler implements ResponseTextHandler {</code></p>
<p>public void onCompletion(String responseText) {<br />
/*<br />
* После того, как полученны данные в формате JSON мы<br />
* обрабатываем их и выводим результат<br />
*/ </p>
<p>JSONObject jsonObject;<br />
try {<br />
jsonObject = JSONParser.parse(responseText);<br />
displayJSONObject(jsonObject);</p>
<p>} catch (JSONException e) {</p>
<p>}</p>
<p>b1.setText(”Search”);</p>
<p>}</p>
<p>private void displayJSONObject(JSONObject jsonObject) {<br />
/*<br />
* Очищаем Grid(сетку) и заполняем новыми результатами<br />
*/</p>
<p>childGrid.clear();<br />
requestChildrenGrid(jsonObject);<br />
gdOut.setWidget(1,0,childGrid);</p>
<p>}</p>
<p>private void requestChildrenGrid(JSONValue jsonValue){<br />
/*<br />
* Заполнение Grid(сетки)<br />
*/</p>
<p>JSONObject jsonObject;<br />
if(jsonValue.isArray() != null){<br />
for(int i = 0; i < jsonValue.isArray().size();i++){<br />
requestChildrenGrid(jsonValue.isArray().get(i));<br />
childGrid.setWidget(itemNumber,0,new HTML(”<br />
<hr />”));<br />
childGrid.setWidget(itemNumber,1,new HTML(”<br />
<hr />”)); </p>
<p>itemNumber++;<br />
int resizeNumber = itemNumber + 1;<br />
childGrid.resize(resizeNumber,2);<br />
}<br />
} else {</p>
<p>if ((jsonObject = jsonValue.isObject()) != null) {<br />
String[] keys = jsonObject.getKeys();</p>
<p>for (int i = 0; i < keys.length; ++i) {<br />
String key = keys[i];<br />
childGrid.setWidget(itemNumber,0,new HTML(”<b>”+ key +”:”));<br />
childGrid.setWidget(itemNumber,1,new HTML(jsonObject.get(key).toString()));<br />
requestChildrenGrid(jsonObject.get(key));</b></p>
<p>itemNumber++;<br />
int resizeNumber = itemNumber + 1;<br />
childGrid.resize(resizeNumber,2);<br />
}<br />
} else if (jsonValue != null) {<br />
//</p>
<p>} else {<br />
//<br />
}</p>
<p>}<br />
}</p>
<p>} </p>
</p>
<p>Все эти методы из файла JSON.java гугловкого примера <noindex><a href="http://code.google.com/webtoolkit/documentation/examples/jsonrpc/">JSON RPC</a></noindex>.  Метод requestChildrenGrid(JSONValue jsonValue) разбивает JSON документ на ключи и значения, ключи обрамляются тэгами &#8220;&lt;B&gt;&#8221;и прикрепляются к Grid(сетке), которая в свою очередь прикрепляется к FocusPanel. И наконец, в файле PHPJSON.java мы выводим результат на главную панель:</p>
<p><code lang="JavaScript">public void onModuleLoad() {<br />
/*<br />
* Для красоты используем TabPanel<br />
*/<br />
TabPanel tp = new TabPanel();<br />
JSONRequester myJson = new JSONRequester();</code></p>
<p>tp.add(myJson.initializeMainForm() ,”Corporate Directory”);</p>
<p>tp.selectTab(0);</p>
<p>RootPanel.get().add(tp);<br />
}</p>
<p>Вот как должно выглядеть приложение в результате:</p>
<p><noindex><a href="http://photos1.blogger.com/blogger2/2623/301412589031540/1600/web.jpg"><img src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/web.jpg" src="http://photos1.blogger.com/blogger2/2623/301412589031540/400/web.jpg" alt="" border="0" /></a></noindex><br />
Вы можете скачать код клиентской и серверной части <noindex><a href="http://angel.hurtado.googlepages.com/proyecto.tgz">отсюда</a></noindex>. Надеюсь, это небольшой пример вам помог.
</p>
</div>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/google-web-toolkit-manual/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/google-web-toolkit-manual/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/company/google/" title="Просмотреть все записи в рубрике &laquo;Google&raquo;" rel="category tag">Google</a>, <a href="http://www.ajaxplanet.ru/category/technology/java/" title="Просмотреть все записи в рубрике &laquo;Java&raquo;" rel="category tag">Java</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>, <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/google-web-toolkit-manual/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Выпущен ASP.NET AJAX 1.0</title>
		<link>http://www.ajaxplanet.ru/asp-net-ajax-1-released/</link>
		<comments>http://www.ajaxplanet.ru/asp-net-ajax-1-released/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 07:43:12 +0000</pubDate>
		<dc:creator>darius</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/asp-net-ajax-1-released/</guid>
		<description><![CDATA[Вчера официально зарелизился ASP.NET AJAX 1.0. В принципе, никаких неожиданностей, всё происходит в полном соответствии с давно объявленными планами. Подробно о релизе можно прочесть в блоге Скотта Гатри (Scott Guthrie) &#169; AJAX Planet, 2007. &#124; Постоянная ссылка &#124; Комментарии Интересна эта тема? Посмотрите архив сообщений по теме AJAX, Microsoft, atlas, Библиотеки и фреймворки.]]></description>
			<content:encoded><![CDATA[<p>Вчера официально зарелизился <noindex><a href="http://ajax.asp.net/">ASP.NET AJAX 1.0</a></noindex>. В принципе, никаких неожиданностей, всё происходит в полном соответствии с <noindex><a href="http://www.ajaxplanet.ru/microsoft-atlas-plans/">давно объявленными планами</a></noindex>. Подробно о релизе можно прочесть в <noindex><a href="http://weblogs.asp.net/scottgu/archive/2007/01/23/asp-net-ajax-1-0-released.aspx">блоге Скотта Гатри (Scott Guthrie)</a></noindex></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/asp-net-ajax-1-released/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/asp-net-ajax-1-released/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/company/microsoft/" title="Просмотреть все записи в рубрике &laquo;Microsoft&raquo;" rel="category tag">Microsoft</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/asp-net-ajax-1-released/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHP for Microsoft AJAX Library</title>
		<link>http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/</link>
		<comments>http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/#comments</comments>
		<pubDate>Wed, 24 Jan 2007 07:23:02 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/</guid>
		<description><![CDATA[Как известно, ASP.NET AJAX, ранее известный как Atlas, про который я достаточно много писал, исходно создавался для работы с ASP.Net. Впрочем, сама библиотека Microsoft AJAX Library &#8212; это чистый JavaScript, который можно скачать отдельно и попытаться использовать независимо от ASP.Net. Сегодня появился первый публичный релиз проекта &#8220;PHP for Microsoft AJAX Library, небольшой библиотечки, которая призвана [...]]]></description>
			<content:encoded><![CDATA[<p>Как известно, <noindex><a href="http://ajax.asp.net/">ASP.NET AJAX</a></noindex>, ранее известный как <noindex><a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/atlas/">Atlas, про который я достаточно много писал</a></noindex>, исходно создавался для работы с ASP.Net. Впрочем, сама библиотека Microsoft AJAX Library &#8212; это чистый JavaScript, который можно скачать отдельно и попытаться использовать независимо от ASP.Net. </p>
<p>Сегодня появился первый публичный релиз проекта &#8220;<noindex><a href="http://codeplex.com/phpmsajax">PHP for Microsoft AJAX Library</a></noindex>, небольшой библиотечки, которая призвана облегчить использование Microsoft AJAX Library в приложениях, написанных на PHP. Проект открытый, базируется на и выпущен под Microsoft Permissive License.</p>
<p>Пока лишь альфа-релиз, и, при наличии множества конкурирующих библиотек, судьба проекта туманна. В качестве примера приведу код с использованием PHP for Microsoft AJAX Library, работающий с веб-сервисом. По построению на ASP.Net было бы то же самое: </p>
<p><strong>HelloService.php:</strong></p>
<p><code lang="php">< ?php</p>
<p>require_once ‘../../dist/MSAjaxService.php’;</p>
<p>class HelloService extends MSAjaxService<br />
{<br />
function SayHello($name)<br />
{<br />
return "Hello, " . $name . "!";<br />
}<br />
}</p>
<p>$h = new HelloService();<br />
$h->ProcessRequest();</p>
<p>?></p>
<p></code></p>
<p><strong>index.html:</strong></p>
<p><code lang="HTML"><br />
<html><br />
<head></p>
<p><script type="text/javascript" src="../../MicrosoftAjaxLibrary/MicrosoftAjax.js"></script><br />
<script type="text/javascript" src="HelloService.php/js"></script><br />
</head><br />
<body><br />
Name:<br />
<input id="name" type="text" />
<input type="button" value="Say Hello" onclick="button_click(); return false;" />
<br />
Response from server: <span id="response"></span><br />
</body><br />
<script type="text/javascript">
function button_click() {
HelloService.SayHello($get(’name’).value, function (result) {
$get(’response’).innerHTML = result;
});
}
</script><br />
</html></p>
<p></code></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/company/microsoft/" title="Просмотреть все записи в рубрике &laquo;Microsoft&raquo;" rel="category tag">Microsoft</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/php-for-microsoft-ajax-library/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ошибки при работе с Ajax</title>
		<link>http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/</link>
		<comments>http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/#comments</comments>
		<pubDate>Mon, 22 Jan 2007 09:34:17 +0000</pubDate>
		<dc:creator>2tl</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[Alex-Bosworth]]></category>
		<category><![CDATA[ошибки]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/</guid>
		<description><![CDATA[Наш читатель Илья Колесников (2tl) перевел и прислал уже достаточно старую, но от того не менее важную и интересную серию заметок Алекса Босворта (Alex Bosworth). Сейчас мы уже несколько свыклись с такой технологией, как AJAX, но всё же зачастую видно его использование просто ради самого использования, или применения без оглядки на удобство для пользователей. Надеюсь, [...]]]></description>
			<content:encoded><![CDATA[<p>Наш читатель Илья Колесников (2tl) перевел и прислал уже достаточно старую, но от того не менее важную и интересную серию <noindex><a href="http://alexbosworth.backpackit.com/pub/67688">заметок Алекса Босворта (Alex Bosworth)</a></noindex>. Сейчас мы уже несколько свыклись с такой технологией, как AJAX, но всё же зачастую видно его использование просто ради самого использования, или применения без оглядки на удобство для пользователей. Надеюсь, что статья будет пусть не нова, но полезна для многих разработчиков. </p>
<p>Ajax &#8212; это опасная для веб-разработчиков технология, она способна создать множество проблем как с пользовательским интерфейсом, так и с серверной составляющей и нагрузкой на сервер. Я составил сводный список ошибок разработчиков, использующих Ajax.</p>
<p>Этот список скопирован из моего блога: <noindex><a href="http://sourcelabs.com/ajb/archives/2005/05/ajax_mistakes.html">Alex Bosworth’s Weblog: Ajax Mistakes</a></noindex></p>
<p>Не согласны? Готовы назвать еще одну ошибку? Что ж, эта статья имеет свою страницу на сайте <noindex><a href="http://swik.net/Ajax/Ajax+Mistakes">SWiK.net</a></noindex></p>
<p>Так же рекомендую посетить страницу wiki  <noindex><a href="http://swik.net/Ajax/Places+To+Use+Ajax">places to use Ajax</a></noindex></p>
<h2>Заметки</h2>
<h3>Использование Ajax ради Ajax.</h3>
<p>Конечно, Ajax это круто, и разработчики любят играть с крутыми технологиями, но Ajax инструмент, а не игрушка. Множество новых Ajax приложений в действительности лишь маленькие игрушки, разработанные не для реальных целей, а всего лишь эксперименты в том, что Ajax может делать, или же попытки использовать Ajax где-нибудь, где он не нужен. Игрушки могут быть интересны короткое время, но игрушки &#8212; это не полезные приложения.</p>
<h3>Поломка кнопки «Назад».</h3>
<p>Кнопка «Назад» – огромная функциональная возможность стандартного пользовательского интерфейса веб-сайта. К сожалению, она плохо работает с JavaScript. Сохранение функциональности кнопки «Назад» – главная причина для того, чтобы не делать веб-приложение только на JavaScript.</p>
<h3>Отсутствие видимого сигнала о происходящем действии.</h3>
<p>Если я кликаю по кнопке, вызывающей Ajax-функцию, вы должны дать мне визуальный сигнал, что что-то происходит. Пример этого – сообщение о загрузке на GMail, расположенное справа вверху. Всякий раз, когда я делаю что-нибудь в GMail, маленький красный прямоугольник в верхнем правом углу показывает, что страница загружается. Он замещает стандартную функцию пользовательского интерфейса браузера &#8211; отображение процесса загрузки новой страницы, т.к. Ajax этого не поддерживает.</p>
<h3>Оставляя офлайн пользователей позади.</h3>
<p>Так как границы применения веб-приложений раздвигаются все шире и шире, вскоре все приложения переместятся в веб. Инициализация, подготовка к работе &#8211; лучше, всемирная модель доступа &#8211; это здорово, эксплуатация и конфигурация &#8211; классная, изучение пользовательского интерфейса &#8211; проще и быстрее.</p>
<p>Тем не менее, люди, имеющие нестабильное соединение с Интернетом, или люди, которые не хотят переходить на веб-приложения, должны иметь те же возможности при работе с новым поколением Ajax приложений, что и все остальные. То, что технология передовая, не означает, что люди готовы и желают работать с ней. При проектировании веб-приложений, в крайнем случае, надо предполагать оффлайн доступ. У GMail это POP, Backpackit имеет интеграцию с SMS. В Enterprise это веб-сервисы.</p>
<h3>Не заставляйте меня ждать Ajax.</h3>
<p><noindex><a href="http://www.spreadfirefox.com/?q=affiliates&amp;id=198986&amp;t=218">Со вкладками FireFox&#8217;а</a></noindex> я могу управлять различным задержками на веб-сайтах и обычно я вынужден ждать только загрузки страницы. В случае AJAX-приложения и плохого соединения с Интернетом я могу получить действительно ужасное время взаимодействия с интерфейсом, потому что каждый раз, когда я что-либо делаю, я должен ждать ответа сервера. Помоги мне Боже, если я должен обратиться к диску сервера, прежде чем продолжить. Такие приложения могут даже <noindex><a href="http://www.lastcraft.com/blog/index.php?p=19">заставить меня думать, что Ajax &#8212; это не круто</a></noindex>.</p>
<h3>Отправление важной информации в открытом виде.</h3>
<p>Безопасность AJAX приложений подчиняется тем же принципам, что и безопасность любого веб-приложения, кроме того, не надо забывать о безопасности при передаче данных при асинхронном запросе. Весь трафик должен проверяться, чтобы удостовериться в его достоверности.</p>
<h3>Разработка AJAX приложений – это разработка для одной платформы.</h3>
<p>Создание Ajax приложений &#8211; это кросс-платформенная разработка. Код Ajax выполняется JavaScript-движком IE, Rhino (JavaScript-движок мозиллы), или другим, менее популярным движком, который, тем не менее, может внезапно стать популярным. То есть, соответствия только со стандартным JavaScript недостаточно, необходимо тестирование для большинства приложений. Большая трудоёмкость создания хорошего Javascript кода вызвана глючностью реализации JavaScript в IE, хотя есть <noindex><a href="http://jgwebber.blogspot.com/2005/05/drip-ie-leak-detector.html">утилиты для облегчения разработки кода JavaScript под IE</a></noindex>.</p>
<h3>Слишком много кода замедляет браузер.</h3>
<p>Ajax представляет возможность сделать JavaScript приложения более интересными. К сожалению, «интересными» часто означает больше выполняющегося кода. Больше кода – больше работы для браузера, а это значит, особенно для некоторых плохо написанных скриптов, что вам нужен более производительный центральный процессор, чтобы функциональность оставалось «живой». Производительность CPU раньше действительно была ограничением функциональности JavaScript, и то, что компьютеры стали быстрее, не означает, что проблема исчезла.</p>
<h3>Отсутствие альтернатив для тех, у кого нет или отключен JavaScript.</h3>
<p>Согласно <noindex><a href="http://www.w3schools.com/browsers/browsers_stats.asp">статистике W3C по использования браузеров</a></noindex>, которая неизбежно показывает перекос в сторону популярных браузеров, у 11 % пользователей JavaScript отключен. Так что, если ваше приложение полностью зависит от JavaScript, вы сразу же теряете десятую часть вашей аудитории.</p>
<h3>Изобретение нового в пользовательском интерфейсе.</h3>
<p>Главная ошибка, которую легко сделать, используя Ajax: &#8220;щелкни по этой непонятной штуке и получи неочевидный результат&#8221;. Конечно, пользователи, которые используют приложение некоторое время, могут выучить, что если по этой области кликнуть и удерживать кнопку нажатой, то эту область можно перетащить и оставить на новом месте. Но пока эта возможность не станет общей для большинства пользователей, вы лишь увеличите сложность и время на изучение вашего приложения, а это большой минус для любой программы.</p>
<h3>Изменение состояний с помощью ссылок (GET запросы).</h3>
<p>Как я отметил в предыдущей заметке, Ajax приложения создают множество проблем для пользователей, который полагают, что GET операции не меняют состояние приложения. Зависимость состояния приложения от ссылки &#8211; проблема не только для поисковых роботов, но и для пользователей, которые привыкли к навигации по ссылкам – они будут озадачены тем, что ссылки используются для смены состояния.</p>
<h3>Неожиданное мигание и изменение элементов страницы.</h3>
<p>Первая буква А в Ajax означает асинхронный. Проблема асинхронных сообщений в том, что вполне можно сбиться с толку, когда они вдруг выскакивают. Изменения на асинхронной странице должны происходить в строго определенном месте, и они должны быть ожидаемы. Вспыхивающие и мигающие сообщения, на которых я не хочу концентрироваться, напоминают о html-теге «blink».</p>
<h3>Отсутствие ссылок, которые я могу послать друзьям или сохранить в закладки.</h3>
<p>Другая великолепная возможность веб-сайтов: я могу переслать ссылки другим людям, и они увидят то же, что вижу я. Ещё я могу сохранить адрес в закладках и позже вернуться к нему. JavaScript и Ajax приложения, могут создать множество проблем при такой схеме использования. Как только JavaScript начинает вместо сервера динамически генерировать страницу, её адрес больше не может использоваться для навигации. Очень нежелательно терять такую возможность, и многие Ajax приложения имеют специально сконструированные ссылки, чтобы избежать этого.</p>
<h3>Не применение локальных изменений к другим частям страницы.</h3>
<p>Так как Ajax/JavaScript дает вам потрясающий контроль над содержанием страницы, то легко можно сфокусироваться на одной области страницы и совсем забыть об общей картине. Например, заголовок на Backpackit. Если вы меняете заголовок страницы в Backpackit, он немедленно заменяется в правой части страницы, но не меняется главный заголовок (тег title). При работе с Ajax вы должны думать о картине в целом, даже когда делаете локальные изменения.</p>
<h3>Асинхронное выполнение групповых операций.</h3>
<p>Конечно, с помощью Ajax вы можете менять значения одновременно во множестве полей формы, но и это может вызвать кучу проблем. Например, если я отмечу несколько чекбоксов, каждый из которых пошлет асинхронный запрос к серверу, я потеряю возможность отслеживать изменения чекбоксов, и этот неупорядоченный процесс будет раздражать и сбивать с толку.</p>
<h3>Прокрутка страницы и потеря места чтения.</h3>
<p>Другая проблема с появляющимся текстом &#8211; он может вызвать прокрутку страницы. Я могу спокойно читать страницу, как вдруг асинхронный JavaScript решит вставить параграф перед моим текстом, опуская мой текст ниже. Разумеется такое поведение раздражает и тратит мое время &#8211; я должен возвращаться туда, где остановился.</p>
<h3>Блокирование поисковых машин.</h3>
<p>Ajax приложения, которые загружают много текста без перезагрузки страницы, могут стать большой проблемой для поисковых машин. Это похожу на проблему с адресами. Если пользователи могут приходить с поисковых машин, некоторый текст приложения должен быть статичным, чтобы поисковые роботы могли его индексировать.</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2007. |
	  <a href="http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/oshibki-pri-rabote-s-ajax/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Планы Microsoft относительно Atlas</title>
		<link>http://www.ajaxplanet.ru/microsoft-atlas-plans/</link>
		<comments>http://www.ajaxplanet.ru/microsoft-atlas-plans/#comments</comments>
		<pubDate>Tue, 12 Sep 2006 07:38:50 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/microsoft-atlas-plans/</guid>
		<description><![CDATA[А между тем, наконец, появилась информация по поводу планов Microsoft относительно Atlas, микрософтовской реализации AJAX. Данные появились в блоге Скота Гатери (Scott Guthrie), General Manager в Microsoft Developer Division: &#8220;Atlas&#8221; 1.0 Naming and Roadmap. Пост содержит множество деталей, попробуем коротко сформулировать основное: Стабильная версия Atlas будет выпущена в конце этого года. &#8220;Atlas&#8221; останется лишь кодовым [...]]]></description>
			<content:encoded><![CDATA[<p>А между тем, наконец, появилась информация по поводу планов Microsoft относительно <noindex><a href="http://atlas.asp.net/">Atlas</a></noindex>, микрософтовской реализации AJAX. Данные появились в блоге Скота Гатери (Scott Guthrie), General Manager в Microsoft Developer Division: <a title="http://weblogs.asp.net/scottgu/archive/2006/09/11/_2200_Atlas_2200_-1.0-Naming-and-Roadmap.aspx" href="http://weblogs.asp.net/scottgu/archive/2006/09/11/_2200_Atlas_2200_-1.0-Naming-and-Roadmap.aspx">&#8220;Atlas&#8221;  1.0 Naming and Roadmap</a></noindex>. Пост содержит множество деталей, попробуем коротко сформулировать основное:</p>
<p>Стабильная версия Atlas будет выпущена в конце этого года. &#8220;Atlas&#8221; останется лишь кодовым названием продукта, более того, текущая версия будет разделена на составляющие: отдельно будет выпущено &#8220;ядро&#8221;, расширения будут выкладываться отдельно. Детального списка того, что войдет в &#8220;ядро&#8221; пока нет.</p>
<p>Будут выделены следующие компоненты:</p>
<ol>
<li><strong>Microsoft AJAX Library</strong> &#8212; клиентская javascript-библиотека, которая будет работать в любом браузере и сможет взаимодействовать с любым бэкэндом (в данный момент уже появились посты, описывающие взаимодействие с PHP и ColdFusion).</li>
<li><strong>ASP.NET 2.0 AJAX Extensions</strong> &#8212; серверная часть сегодняшнего &#8220;Atlas&#8221;, отвечающая за интеграцию с ASP.NET. В частности это проявится в том, что официальный тег-префикс для атласовских контролов сменится с atlas: на asp:. В дальнейшем базовый функционал и основные контролы войдут в следующую версию ASP.NET.</li>
<li><strong>ASP.NET AJAX Control Toolkit &#8212; </strong>то, что сегодня называется <noindex><a href="http://atlas.asp.net/default.aspx?tabid=47&#038;subtabid=477">“Atlas” Control Toolkit</a></noindex>, т.е. набор бесплатных контролов и компонент с открытым исходным кодом, позволяющих более полно использовать возможности  ASP.NET AJAX Extensions.</li>
</ol>
<p>Также обещано море вкусностей, связанных с готовящейся к выпуску в следующем году Visual Studio &#8220;Orcas&#8221;.</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2006. |
	  <a href="http://www.ajaxplanet.ru/microsoft-atlas-plans/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/microsoft-atlas-plans/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/company/microsoft/" title="Просмотреть все записи в рубрике &laquo;Microsoft&raquo;" rel="category tag">Microsoft</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/microsoft-atlas-plans/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Выпущен Script.aculo.us 1.6.4</title>
		<link>http://www.ajaxplanet.ru/vyipuschen-scriptaculous-164/</link>
		<comments>http://www.ajaxplanet.ru/vyipuschen-scriptaculous-164/#comments</comments>
		<pubDate>Wed, 06 Sep 2006 13:41:46 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[Prototype]]></category>
		<category><![CDATA[script.aculo.us]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/vyipuschen-scriptaculous-164/</guid>
		<description><![CDATA[В последнее время Prototype и script.aculo.us обновляются с удивительной скоростью. Но этот релиз мы отметим. Среди множества обновлений изменена базовая версия Prototype до V1.5.0_rc1. Целиком список изменений занимает 3 экрана. &#169; AJAX Planet, 2006. &#124; Постоянная ссылка &#124; Комментарии Интересна эта тема? Посмотрите архив сообщений по теме AJAX, Библиотеки и фреймворки.]]></description>
			<content:encoded><![CDATA[<p>В последнее время Prototype и <noindex><a href="http://script.aculo.us/downloads">script.aculo.us</a></noindex> обновляются с удивительной скоростью. Но этот релиз мы отметим. Среди множества обновлений изменена базовая версия Prototype до V1.5.0_rc1. Целиком список изменений занимает 3 экрана.</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2006. |
	  <a href="http://www.ajaxplanet.ru/vyipuschen-scriptaculous-164/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/vyipuschen-scriptaculous-164/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/vyipuschen-scriptaculous-164/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>И снова Writely</title>
		<link>http://www.ajaxplanet.ru/i-snova-writely/</link>
		<comments>http://www.ajaxplanet.ru/i-snova-writely/#comments</comments>
		<pubDate>Fri, 18 Aug 2006 07:27:07 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Office]]></category>
		<category><![CDATA[Текстовые редакторы]]></category>
		<category><![CDATA[Google-Docs-&-Spreadsheets]]></category>
		<category><![CDATA[writely]]></category>
		<category><![CDATA[онлайновый-офис]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/i-snova-writely/</guid>
		<description><![CDATA[Как мы помним, Writely, онлайновый текстовый редактор, о котором мы уже рассказывали, был приоретен Google. После этого регистрация новых пользователей была прекращена. Сегодня регистрация снова была открыта. Вскоре обещано объединение Writely c Google Account. Давний обзор Writely &#169; AJAX Planet, 2006. &#124; Постоянная ссылка &#124; Комментарии Интересна эта тема? Посмотрите архив сообщений по теме AJAX, [...]]]></description>
			<content:encoded><![CDATA[<p>Как мы помним, <noindex><a href="http://www.writely.com/">Writely</a></noindex>, онлайновый текстовый редактор, <noindex><a href="http://www.ajaxplanet.ru/writely-ajax-text-editor/">о котором мы уже рассказывали</a></noindex>, был приоретен Google. После этого регистрация новых пользователей была прекращена. Сегодня регистрация снова была открыта. Вскоре обещано объединение <noindex><a href="http://www.writely.com/">Writely</a></noindex> c Google Account.<br />
<noindex><a href="http://www.ajaxplanet.ru/writely-ajax-text-editor/">Давний обзор Writely</a></noindex></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2006. |
	  <a href="http://www.ajaxplanet.ru/i-snova-writely/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/i-snova-writely/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/company/google/" title="Просмотреть все записи в рубрике &laquo;Google&raquo;" rel="category tag">Google</a>, <a href="http://www.ajaxplanet.ru/category/office/" title="Просмотреть все записи в рубрике &laquo;Office&raquo;" rel="category tag">Office</a>, <a href="http://www.ajaxplanet.ru/category/office/text-processors/" title="Просмотреть все записи в рубрике &laquo;Текстовые редакторы&raquo;" rel="category tag">Текстовые редакторы</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/i-snova-writely/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Динамическое добавление ConfirmButtonExtender</title>
		<link>http://www.ajaxplanet.ru/dinamicheskoe-dobavlenie-confirmbuttonextender/</link>
		<comments>http://www.ajaxplanet.ru/dinamicheskoe-dobavlenie-confirmbuttonextender/#comments</comments>
		<pubDate>Tue, 15 Aug 2006 13:08:51 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[Статьи про MS Atlas]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[Microsoft]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/dinamicheskoe-dobavlenie-confirmbuttonextender/</guid>
		<description><![CDATA[Я уже показывал, что во многих случаях для создания веб-приложения при помощи Atlas вообще не требуется собственно программировния. Сплошной drag&#8217;n'drop, настройка папаметров и &#8220;декларативное программирование&#8221;, когда контролы напоминают шестеренки в механизме, а вы просто указываете, какая шестеренка и как зацепляет свою соседку. Однако зачастую этого недостаточно и контролы из того же Atlas Control Toolkit приходится [...]]]></description>
			<content:encoded><![CDATA[<p>Я уже  показывал, что во многих случаях <noindex><a href="http://www.ajaxplanet.ru/ms_atlas-updatepanel-basics/">для создания веб-приложения при помощи Atlas вообще не требуется собственно программировния</a></noindex>. Сплошной drag&#8217;n'drop, настройка папаметров и &#8220;декларативное программирование&#8221;, когда контролы напоминают шестеренки в механизме, а вы просто указываете, какая шестеренка и как зацепляет свою соседку. Однако зачастую этого недостаточно и контролы из того же Atlas Control Toolkit приходится добавлять динамически.</p>
<p>Простой пример &#8212; корзина заказа. На странице выводится список предзаказанных товаров, происходит окончательная проверка, а затем &#8212; непосредственно отправка заказа. Предположим, что мы хотим при отправке спросить, действительно ли клиент уверен, что все поля заполнены правильно. Естественным выбором, если вы используете Atlas, будет <noindex><a href="http://atlas.asp.net/atlastoolkit/ConfirmButton/ConfirmButton.aspx">ConfirmButtonExtender</a></noindex>. Одна беда &#8212; а что, если у нас в корзине нет товаров и, соответственно, отсутствует кнопка &#8220;заказать&#8221;, к которой привязывается <noindex><a href="http://atlas.asp.net/atlastoolkit/ConfirmButton/ConfirmButton.aspx">ConfirmButtonExtender</a></noindex>? Он, конечно же, будет выдавать ошибку. Значит, нам придется проверять, есть ли в форме эта кнопка и динамически добавлять контрол. Беда только в том, что в документации примера нет, но ничего обойдемся.</p>
<p>Итак, есть кнопка btnOrder, расположенная внутри UpdatePanel upButton. И есть наш контрол ConfirmButtonExtender, который принимает 2 параметра: TargetControlID (ID кнопки, на которую вешаем подтверждение) и ConfirmText  (вопрос, который мы задаем пользователю). Итак:</p>
<p><code lang="c#">//создаем новый ConfirmButtonExtender<br />
AtlasControlToolkit.ConfirmButtonExtender cbeOrderBtn =  new AtlasControlToolkit.ConfirmButtonExtender();</p>
<p>//создаем настройки  ConfirmButtonProperties<br />
AtlasControlToolkit.ConfirmButtonProperties cbeProp =  new AtlasControlToolkit.ConfirmButtonProperties();</p>
<p>//добавляем параметр ConfirmText<br />
cbeProp.ConfirmText = "Заказ сформирован правильно?";</p>
<p>//добавляем параметр  TargetControlId<br />
cbeProp.TargetControlID = btnOrder.ID;</p>
<p>//сопоставляем наш ConfirmButtonExtender и его свойства<br />
cbeOrderBtn.TargetProperties.Add(cbeProp);</p>
<p>//добавляем контрол в панель upButton<br />
upButton.Controls.Add(cbeOrderBtn);<br />
</code></p>
<p>Ну вот и все =)</p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2006. |
	  <a href="http://www.ajaxplanet.ru/dinamicheskoe-dobavlenie-confirmbuttonextender/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/dinamicheskoe-dobavlenie-confirmbuttonextender/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>, <a href="http://www.ajaxplanet.ru/category/ms-atlas-articles/" title="Просмотреть все записи в рубрике &laquo;Статьи про MS Atlas&raquo;" rel="category tag">Статьи про MS Atlas</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/dinamicheskoe-dobavlenie-confirmbuttonextender/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Atlas July CTP и новый Atlas Control Toolkit</title>
		<link>http://www.ajaxplanet.ru/atlas-july-ctp/</link>
		<comments>http://www.ajaxplanet.ru/atlas-july-ctp/#comments</comments>
		<pubDate>Wed, 09 Aug 2006 09:05:12 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[atlas]]></category>
		<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[ASP.Net]]></category>
		<category><![CDATA[ASP.NET-AJAX]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/atlas-july-ctp/</guid>
		<description><![CDATA[Как-то я пропустил выход новой версии Atlas &#8212; Atlas July CTP. Основные изменения &#8212; багфиксы (скажем честно, пока это достаточно актуально). Кроме того, была выпущена новая версия Atlas Control Toolkit. На текущий момент в Atlas Control Toolkit входит 21 контрол. В последний релиз вошли несколько новинок, в том числе NumericUpDown, который я вчера начал делать [...]]]></description>
			<content:encoded><![CDATA[<p>Как-то я пропустил выход новой версии Atlas &#8212; <noindex><a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=D746076A-3352-4407-B9D5-832BA4DFFC7B&#038;displaylang=en">Atlas July CTP</a></noindex>. Основные изменения &#8212; багфиксы (скажем честно, пока это достаточно актуально). Кроме того, была выпущена новая версия <noindex><a href="http://www.codeplex.com/Release/ProjectReleases.aspx?ProjectName=AtlasControlToolkit">Atlas Control Toolkit</a></noindex>.</p>
<p>На текущий момент в Atlas Control Toolkit входит 21 контрол. В последний релиз вошли несколько новинок, в том числе NumericUpDown, который я вчера начал делать сам =). Что интересно, Atlas Toolkit разрабатывается в духе open source на сайте <noindex><a href="http://www.codeplex.com/Wiki/View.aspx?ProjectName=AtlasControlToolkit"> CodePlex</a></noindex> и в этот релиз включены первые контролы от сторонних разработчиков &#8212; PasswordStrengthExtender (автор Paul Glavich) и FilteredTextBox (Christian Wenz). Похоже, Microsoft чему-то учится. Приятно. К концу года обещано 50 контролов.<br />
<font size="2" face="arial" /></p>
<p><font size="2" face="arial"><font size="2" face="arial" /></font><font size="2" face="arial"> </font></p>
<p style="margin: 0in 0in 10pt" class="MsoNormal"><span style="font-size: 10pt; line-height: 115%; font-family: 'Arial','sans-serif'"><font size="2" face="arial"></font><font size="2" face="arial"><font size="2" face="arial" /></font></span></p>
<p><font size="2" face="arial"></font><font size="2" face="arial"><font size="2" face="arial" /></font><font size="2" face="arial"> </font></p>
<p style="margin: 0in 0in 10pt" class="MsoNormal"><span style="font-size: 10pt; line-height: 115%; font-family: 'Arial','sans-serif'"><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"><img alt="Atlas Toolkit July" id="image263" src="http://www.ajaxplanet.ru/wp-content/uploads/2006/08/atlas-toolkit-july.png" /><br />
</font></span></p>
<p><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"><font size="2" face="arial" /></font><font size="2" face="arial"> </font>
</p>
<p style="margin: 0in 0in 10pt" class="MsoNormal"><span style="font-size: 10pt; line-height: 115%; font-family: 'Arial','sans-serif'"><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"><font size="2" face="arial" /></font></span></p>
<p><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"><font size="2" face="arial" /></font><font size="2" face="arial"> </font></p>
<p style="margin: 0in 0in 10pt" class="MsoNormal"><span style="font-size: 10pt; line-height: 115%; font-family: 'Arial','sans-serif'"><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"></font><font size="2" face="arial"><font size="2" face="arial" /></font></span></p>
	<p></p>
	<hr noshade style="margin:0;height:1px" />
	<p>&copy; <a href="http://www.ajaxplanet.ru">AJAX Planet</a>, 2006. |
	  <a href="http://www.ajaxplanet.ru/atlas-july-ctp/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/atlas-july-ctp/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/company/microsoft/" title="Просмотреть все записи в рубрике &laquo;Microsoft&raquo;" rel="category tag">Microsoft</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/atlas/" title="Просмотреть все записи в рубрике &laquo;atlas&raquo;" rel="category tag">atlas</a>, <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>, <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/atlas-july-ctp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->