<?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; Технологии</title>
	<atom:link href="http://www.ajaxplanet.ru/category/technology/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>Выпущена мобильная версия Google Docs</title>
		<link>http://www.ajaxplanet.ru/google-docs-mobile/</link>
		<comments>http://www.ajaxplanet.ru/google-docs-mobile/#comments</comments>
		<pubDate>Wed, 17 Oct 2007 21:08:46 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Office]]></category>
		<category><![CDATA[Текстовые редакторы]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[Электронные таблицы]]></category>
		<category><![CDATA[Google-Docs]]></category>
		<category><![CDATA[Google-Docs-&-Spreadsheets]]></category>
		<category><![CDATA[коммуникатор]]></category>
		<category><![CDATA[онлайновый-офис]]></category>
		<category><![CDATA[телефон]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/google-docs-mobile/</guid>
		<description><![CDATA[Так сложилось, что последние полтора месяца у меня жестокая ломка &#8212; я вынужден существовать без коммуникатора. Ломка самая настоящая, чем-то напоминающая наркозависимость. Впрочем, вполне готов признать, что это действительно сродни болезненной зависимости &#8212; возможность в любой момент получить любые данные, создать и передать перерастает в насущную необходимость. Так сложилось, что именно в это время я [...]]]></description>
			<content:encoded><![CDATA[<p>Так сложилось, что последние полтора месяца у меня жестокая ломка &#8212; я вынужден существовать без коммуникатора. Ломка самая настоящая, чем-то напоминающая наркозависимость. Впрочем, вполне готов признать, что это действительно сродни болезненной зависимости &#8212; возможность в любой момент получить любые данные, создать и передать перерастает в насущную необходимость. </p>
<p>Так сложилось, что именно в это время я особенно частно сталкиваюсь с различными интереснейшими мобильными сервисами и устройствами (впрочем, всевозможные гаджеты, которые я видел в Китае &#8212; тема отдельного о-о-очень долгого разговора). </p>
<p>Вчера, как назло, <noindex><a href="http://googledocs.blogspot.com/">вышел сервис</a></noindex>, который я давно хотел посмотреть &#8212; <noindex><a href="http://docs.google.com/m">мобильная версия Google Docs</a></noindex>. В данный момент нет возможности ни создавать, ни редактировать документы, но, как обнадеживающе пишут разработчики <em>пока</em>. На данный момент этот функционал доступен лишь для англоязычных пользователей, плюс, отсутствует возможность просмотра презентаций (точнее так &#8212; она отсутствует для всех, <noindex><a href="http://www.google.com/m/help?hl=en&#038;q=77421">кроме пользователей iPhone</a></noindex>). Впрочем, функционал презентаций в принципе достаточно нов и, уверен, вскоре появится и в мобильной версии. </p>
<p>На самом деле, для таких инфоманьяков, как я, способов применения можно придумать бесконечное число, в том числе и самые экзотичные. Скажем, списки покупок, которые заботливая жена составляет для своего бестолкового мужа-программиста. </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/google-docs-mobile/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/google-docs-mobile/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <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>, <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>, <a href="http://www.ajaxplanet.ru/category/office/spreadsheets/" title="Просмотреть все записи в рубрике &laquo;Электронные таблицы&raquo;" rel="category tag">Электронные таблицы</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/google-docs-mobile/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>По следам СПИКа</title>
		<link>http://www.ajaxplanet.ru/po-sledam-spika/</link>
		<comments>http://www.ajaxplanet.ru/po-sledam-spika/#comments</comments>
		<pubDate>Sun, 20 May 2007 20:01:11 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[Графика]]></category>
		<category><![CDATA[Конференции]]></category>
		<category><![CDATA[Технологии]]></category>
		<category><![CDATA[EnterNetica]]></category>
		<category><![CDATA[конференция]]></category>
		<category><![CDATA[Новиков]]></category>
		<category><![CDATA[Назаретян]]></category>
		<category><![CDATA[ТРИНЕТ]]></category>
		<category><![CDATA[Саминский]]></category>
		<category><![CDATA[блог]]></category>
		<category><![CDATA[спик]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/po-sledam-spika/</guid>
		<description><![CDATA[Прошедшая неделя была совершенно безумной &#8212; сертификация по Битриксу, подготовка к Санкт-Петербургской Интернет Конференции, да и ведение проектов никто с меня не снимал&#8230; Неделя получилась очень утомительной, напряженной, но и интересной. В качестве завершающего аккорда в пятницу прошел СПИК. Скажу честно, на самих выступлениях я практически не был &#8212; не до того, но зато по [...]]]></description>
			<content:encoded><![CDATA[<p>Прошедшая неделя была совершенно безумной &#8212; сертификация по Битриксу, подготовка к <noindex><a href="http://sp-ik.ru/">Санкт-Петербургской Интернет Конференции</a></noindex>, да и ведение проектов никто с меня не снимал&#8230; Неделя получилась очень утомительной, напряженной, но и интересной. В качестве завершающего аккорда в пятницу прошел <noindex><a href="http://sp-ik.ru/">СПИК</a></noindex>. Скажу честно, на самих выступлениях я практически не был &#8212; не до того, но зато по завершению очень хорошо посидел с Андроником Назаретяном из компании <noindex><a href="http://www.enternetica.com/">EnterNetica</a></noindex>. Час бесед про семантику и прагматику интерфейсов &#8212; это что-то.</p>
<p>На СПИКе <noindex><a href="http://www.enternetica.com/">EnterNetica</a></noindex> показывала свои технологии &#8212; то, что они называют трехмерным интернетом. Ребята умудрились создать достаточно качественную и быструю трехмерную графику, которая работает непосредственно в браузере. Понятно, что требуется установить ActiveX-компонент, и работает пока только в Internet Explorer, но результат действительно того стоит. Работает вся эта красота <noindex><a href="http://www.enternetica.com/3d-web-ex02-drx.html">с DirectX 7</a></noindex>, либо <noindex><a href="http://www.enternetica.com/3d-web-ex02-gl.html">OpenGL 2.0</a></noindex>. На самом деле, судя по нашей беседе и имеющимся демкам, сейчас эта компания вполне может создать, скажем, что-то подобное SecondLife, но не требующее установки десктопного ПО.
</p>
<p>
По ощущению, имеющаяся на данный момент ситуация, очень напоминает то, что было с Flash буквально несколько лет назад &#8212; технология с огромным потенциалом, который еще мало кто увидел, и применения которому пока не придумано, так что развитие идет практически на ощупь&#8230;
</p>
<p>
<strong>Update:</strong><br />
Единственной сессией, на которой я на СПИКе был лично, была секция по нестандартному продвижению. Если верить тем, кто был и на других выступлениях, это было едва ли не самое яркое зрелище на всей прошедшей конференции. Выступления трех Алексеев &#8212; <noindex><a href="http://blog.micromarketing.ru/presentations/spik-2007/">Новикова</a></noindex>, <noindex><a href="http://saminsky.ru/archives/237">Саминского</a></noindex> и <noindex><a href="http://www.trinet.ru/people.phtml?id=6">Довжикова</a></noindex> были действительно впечатляющими. Алексей Саминский, простите уж меня за такой сленг, &#8220;зажег&#8221; со страшной силой. Действительно, очень ярко и выразительно.
</p>
<p>
<strong>Update 2:</strong><br />
На сайте конференции появились <noindex><a href="http://www.sp-ik.ru/doklad/">презентации докладов</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/po-sledam-spika/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/po-sledam-spika/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/grafika/" title="Просмотреть все записи в рубрике &laquo;Графика&raquo;" rel="category tag">Графика</a>, <a href="http://www.ajaxplanet.ru/category/konferencii/" 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/po-sledam-spika/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<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>Онлайновое видео&#8230;</title>
		<link>http://www.ajaxplanet.ru/onlaynovoe-video/</link>
		<comments>http://www.ajaxplanet.ru/onlaynovoe-video/#comments</comments>
		<pubDate>Fri, 16 Mar 2007 08:32:08 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[Технологии]]></category>
		<category><![CDATA[Adobe-Remix]]></category>
		<category><![CDATA[YouTube]]></category>
		<category><![CDATA[онлайновое-видео]]></category>
		<category><![CDATA[онлайновый-редактор]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/onlaynovoe-video/</guid>
		<description><![CDATA[Традиционно считается, что Рунет отстает от западного (преимущественно американского) интернета на 3-5 лет. В Штатах в последние пару лет мы наблюдаем просто взрывной рост сервисов, связанных с видео. Онлайновое видео становится привычным для пользователей интернета, более того, приходит и на обычные телевизоры. Онлайновое видео используется для самых неожиданных занятий – от липовых видео-дневников провинциальной нимфетки [...]]]></description>
			<content:encoded><![CDATA[<p>Традиционно считается, что Рунет отстает от западного (преимущественно американского) интернета на 3-5 лет. </p>
<p>В Штатах в последние пару лет мы наблюдаем просто взрывной рост сервисов, связанных с видео. Онлайновое видео становится привычным для пользователей интернета, более того, <noindex><a href="http://www.telnews.ru/news/detail.php?ID=10651">приходит и на обычные телевизоры</a></noindex>. Онлайновое видео используется для самых неожиданных занятий – от <noindex><a href="http://www.nytimes.com/2006/09/12/technology/12cnd-lonely.html?hp&#038;ex=1158120000&#038;en=a56f0e777a707f56&#038;ei=5094&#038;partner=homepage">липовых видео-дневников провинциальной нимфетки</a></noindex> до <noindex><a href="http://net.compulenta.ru//308185/">трансляции новостей</a></noindex>, <noindex><a href="http://www.youtube.com/watch?v=j8Uht3DnbOQ">проведения благотворительных компаний</a></noindex> и предвыборной агитации (посмотрите, скажем, <noindex><a href="http://www.youtube.com/watch?v=6h3G-lMZxjo&#038;eurl=">перепевку знаменитого ролика Apple</a></noindex>). Видео может служить и просто важным инструментом увеличения продаж. Интересны <noindex><a href="http://www.mediarevolution.ru/advertiser/markets/436.html">результаты последних исследований в данной области</a></noindex>: «онлайновое видео оказывается едва ли не самым эффективным способом продаж при работе с IT-специалистами. < ...> Онлайновое видео обеспечивает маркетологов мощным инструментом для повышения качества технологического контента». </p>
<p>Популярность видео дошла до того, что появляются сервисы, по онлайновому редактированию видео (скажем, JumpCut, eyespot и новоявленный Adobe Remix). Еще не утихли войны вокруг необходимости онлайновых текстовых редакторов, а появляются редакторы для видео. Создание видео-контента становится всё проще. Понятно, что это приведёт к появлению моря любительского контента отвратительного качества, но, по закону больших чисел, появится и множество талантливых и интересных работ. </p>
<p>Таким образом, видео уже перешагнул уровень игр энтузиастов и техно-гиков и стремительно превращается в привычный инструмент, который признан пользователями и создателями контента от блоггеров до крупных корпораций и политиков. Вспомните презентацию iPhone: её видели все, подавляющее большинство – в онлайне. На каждом онлайновом видео-сервисе вы встретите несколько вариантов этой записи, и каждый – с солидным числом просмотров. Активно использует видео и заклятый противник Apple, Microsoft, проводя видео-трансляции встреч и семинаров (вебинаров).</p>
<p>Покупка за баснословную сумму в <noindex><a href="http://www.telnews.ru/news/detail.php?ID=9312">1,65 миллиардов долларов YouTube</a></noindex> -– яркое подтверждение признания популярности и перспективности видеосервисов. Что ж, Уильям Гибсон, живой классик киберпанка еще раз доказал свою прозорливость… </p>
<p>Если судить по российским видео-сервисам, например, <noindex><a href="http://rutube.ru">rutube.ru</a></noindex>, у нас онлайновое видео пока используется максимум как еще один из способов распространения приколов. Такой вариант «Сам себе режиссер», только лишенный цензуры и хоть какого-нибудь отбора, что неизбежно сказывается на качестве. </p>
<p>В данный момент в России примеры удачного использования онлайнового видео для бизнеса очень и очень редки. Одним из немногих является <noindex><a href="http://finam.tv/">блог Финама</a></noindex>. Впрочем, данный случай вообще стоит выделить особо: это не столько просто видео и мультипликация, сколько интересный и креативный метод популяризации концепции ПИФов. Пожалуй, еще одним интересным примером может быть использование <noindex><a href="http://www.bank24.ru/firsthand/">видео на сайте Банк24</a></noindex>. Практика появления видео с отчетами по результатам встреч/конференций/семинаров пока очень редка, а немногие примеры, пусть и <noindex><a href="http://www.directorclub.ru/category/video">достаточно интересны</a></noindex>, но больше напоминают пробу пера, а не отработанный канал для работы с целевой аудиторией. </p>
<p>В ближайшем будущем мы можем стать свидетелями взрывного роста популярности видеосервисов. Один из главных факторов – <noindex><a href="http://www.telnews.ru/news/detail.php?ID=10249">стремительное увеличение доли широкополосного доступа</a></noindex>. Высокая скорость подключения и доступность инструментария для создания видео сыграют свою роль в росте популярности видео, а популярность неизбежно вызывает бизнес-использование. Другой вопрос, что в данный момент, даже просто блоги являются для бизнеса явлением непривычным, силу которого чувствуют, но использовать толком не могут: недостаточно опыта, да и просто понимания особенностей данной среды. Впрочем, к тому моменту, когда нас может накрыть волна активного распространения видео, перед глазами будет масса примеров эффективного использования видео на западе, при чем использования, приносящего конкретные дивиденды, будь то просто прибыль, увеличение продаж или снижение расходов на рекламу. </¦gt;</¦gt;</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/onlaynovoe-video/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/onlaynovoe-video/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/onlaynovoe-video/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Новые формы HTML5</title>
		<link>http://www.ajaxplanet.ru/novyie-formyi-html5/</link>
		<comments>http://www.ajaxplanet.ru/novyie-formyi-html5/#comments</comments>
		<pubDate>Fri, 16 Mar 2007 05:39:41 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Технологии]]></category>
		<category><![CDATA[html]]></category>
		<category><![CDATA[W3C]]></category>
		<category><![CDATA[Web-Forms-2]]></category>
		<category><![CDATA[WHATWG-community]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/novyie-formyi-html5/</guid>
		<description><![CDATA[Небольшое вступление В свете новых событий вокруг отказа W3C от продолжения работы над XHTML (ознакомится с этим событием можно в статье Ивана Сагалаева &#8211; W3C возвращается к HTML) я решил выяснить, чем же HTML5 будет полезен для разработчика, использующего AJAX… Итак представляю вам с вольный перевод коротенькой заметки «Improve your forms using HTML5!», которая, кстати, [...]]]></description>
			<content:encoded><![CDATA[<p><strong>Небольшое вступление</strong><br />
В свете новых событий вокруг отказа <noindex><a href="http://www.w3.org/">W3C</a></noindex> от продолжения работы над XHTML (ознакомится с этим событием можно в статье <noindex><a href="http://www.softwaremaniacs.org/">Ивана Сагалаева</a></noindex> &#8211; <noindex><a href="http://softwaremaniacs.org/blog/2007/03/09/w3c-returns-to-html/">W3C возвращается к HTML</a></noindex>) я решил выяснить, чем же HTML5 будет полезен для разработчика, использующего AJAX…</p>
<p>Итак представляю вам с вольный перевод коротенькой заметки <noindex><a href="http://dev.opera.com/articles/view/improve-your-forms-using-html5/">«Improve your forms using HTML5!»</a></noindex>, которая, кстати, была написана еще до всех этих событий вокруг консорциума и HTML5…</p>
<p><noindex><a href="http://toodoo.ru/user/4530/profile">Потапов Геннадий (TermiT)</a></noindex>
</p>
<p><strong>Советы от dev.opera.com.</strong><br />
С момента релиза HTML4 в 1998 году язык совсем не обновлялся. Несмотря на это? начиная с 2004 года, участники <noindex><a href="http://www.whatwg.org/">WHATWG community</a></noindex> (объединение разработчиков браузеров Safari, Opera, FireFox) продолжали работу над HTML, в итоге были добавлены новые возможности (некоторые из них, в принципе, давно уже напрашивались). </p>
<p>В данной статье будет рассмотрена функциональность форм HTML5, так называемые <noindex><a href="http://www.whatwg.org/specs/web-forms/current-work/">Web Forms 2</a></noindex>. (Приведенные примеры отлично работаю в Opera, FireFox и Safari)</p>
<p><strong>autofocus и пропуск атрибутов</strong><br />
Новые вебформы позволяют производить валидацию данных и много других интересных вещей, которые упрощают работу программистам/верстальщикам. Например, рассмотрим следующий код:</p>
<p><code lang="html"><br />
<form action="" method="get">
<p><label>Search:</p>
<input name=search type="text" id="search"/></label></p>
<p><script> document.getElementById('search').focus() </script><br />
< !–остальная часть формы–><br />
</form>
<p></code></p>
<p>Его можно заменить, используя новые формы следующим кодом: </p>
<p><code lang="html"><br />
<form>
<p><label>Search:<br />
<input name="search" autofocus/></label></p>
<p>  < !–остальная часть формы –><br />
</form>
<p></code></p>
<p>Часть кода из первого примера исчезла, и добавился новый атрибут autofocus. Благодаря атрибуту <noindex><a href="http://www.whatwg.org/specs/web-forms/current-work/#the-autofocus">autofocus</a></noindex> мы избавились от javascript’a и атрибута id, по которому обращался к input тот самый javascript. Атрибут method тэга form можно опустить, т.к. метод GET для формы будет установлен по умолчанию. Аналогично, input по умолчанию получит тип text. Также работая с Web Forms 2 мы можем опустить action в тэге form, эффект будет такой же, как если бы мы указали action пустую строку. </p>
<p><strong>Валидация форм</strong><br />
Сейчас разработчики используют навороченные скрипты для проверки форм на стороне клиента, вскоре можно будет просто написать:</p>
<p><code lang="html"></p>
<form>
<p><label>Name:<br />
<input name="name" required/></label></p>
<p><label>E-mail:<br />
<input name="email" type="email" required/></label></p>
<p><label>URL:<br />
<input name="url" type="url" /></label></p>
<p><label>Comment: <textarea name="comment" required></textarea></label></p>
<input type="submit" value="React!" />
</form>
<p></code></p>
<p>Код прост и понятен, словно читаешь текст на английском . Когда пользователь пытается отправить данные формы браузер проверяет все условия, если все в порядке, то данные отправляются, иначе пользователю выдаётся сообщение с ошибкой. Конечно, это не освобождает вас от проверки данных на серверной части, но это освобождает пользователя от лишних перезагрузок страницы и вас от лишнего кода.</p>
<p>В коде использовались новые компоненты <noindex><a href="http://www.whatwg.org/specs/web-forms/current-work/#email">url</a></noindex> и <noindex><a href="http://www.whatwg.org/specs/web-forms/current-work/#url">email</a></noindex>, а также новый атрибут <noindex><a href="http://www.whatwg.org/specs/web-forms/current-work/#the-required">required</a></noindex>. Кроме того, в Web Forms 2 добавлены следующие элементы dates, time,  numbers, add, remove.  Примеры их работы можно посмотреть <noindex><a href="http://www.whatwg.org/demos/">тут</a></noindex>.</p>
<p><strong>Стили</strong><br />
Задать стиль элементу  очень просто, достаточно воспользоваться новыми псевдо-классами :</p>
<p><code lang="css">input:required { background:yellow }</code></p>
<p>Аналогично и с отключенными элементами (disabled control), отмеченными чекбоксами (checked checkboxe), кнопками отправки формы (default submit button),read-only элементами и т.д.:</p>
<p><code lang="css">input:disabled { … }<br />
input:checked + label { … }<br />
input[type=button]:default { … }<br />
input:read-only { … }</code></p>
<p><noindex><a href="http://dev.opera.com/articles/view/improve-your-forms-using-html5/example.html">Пример формы в действии.</a></noindex></p>
<p><strong>Заключение</strong><br />
Web Forms 2 это только малая часть того, что реализовано и еще будет реализовано в HTML 5. Например, появляется замечательный тэг , который позволяет веб-разработчикам создавать двумерные рисунки при помощи JavaScript. (есть интересная статейка о использовании canvas: <noindex><a href="http://xmlhack.ru/texts/06/ajax-html-canvas-ruby/ajax-html-canvas-ruby.html">AJAX, HTML-холст, и Суперпоезд</a></noindex>). Советую всем ознакомится с <noindex><a href="http://www.whatwg.org/specs/web-apps/current-work/">черновиком спецификации HTML 5</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/novyie-formyi-html5/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/novyie-formyi-html5/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/novyie-formyi-html5/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Доля рынка Google Reader</title>
		<link>http://www.ajaxplanet.ru/dolya-ryinka-google-reader/</link>
		<comments>http://www.ajaxplanet.ru/dolya-ryinka-google-reader/#comments</comments>
		<pubDate>Sun, 18 Feb 2007 09:33:30 +0000</pubDate>
		<dc:creator>Boris Bogdanov</dc:creator>
				<category><![CDATA[Google]]></category>
		<category><![CDATA[Office]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[FeedBurner]]></category>
		<category><![CDATA[Google-Reader]]></category>
		<category><![CDATA[rss]]></category>
		<category><![CDATA[статистика]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/dolya-ryinka-google-reader/</guid>
		<description><![CDATA[В середине мая 2006 года появилась статистика по популярности различных сервисов Google. Google Reader, выпущенный 7 октября 2005, тогда даже не вошел в двадцатку. Впрочем, новая версия аггрегатора, запущенная в сентябре 2006, была настолько успешной (см. обзор в Интернетных Штучках), что достаточно быстро набрала популярность. Я и сам вскоре после выхода нового ридера пересел на [...]]]></description>
			<content:encoded><![CDATA[<p>В середине мая 2006 года <noindex><a href="http://weblogs.hitwise.com/bill-tancer/2006/05/google_properties_understandin.html">появилась статистика</a></noindex> по популярности различных сервисов Google. <noindex><a href="http://www.google.com/reader/">Google Reader</a></noindex>, выпущенный 7 октября 2005, тогда даже не вошел в двадцатку. Впрочем, новая версия аггрегатора, запущенная в сентябре 2006, была настолько успешной (<noindex><a href="http://internetno.net/2006/11/08/google-reader-review/">см. обзор в Интернетных Штучках</a></noindex>), что достаточно быстро набрала популярность. Я и сам вскоре после выхода нового ридера пересел на него с <noindex><a href="http://www.newsgator.com/NGOLProduct.aspx?ProdID=NewsGator+Inbox">NewsGator Inbox</a></noindex>. </p>
<p><noindex><a href="http://blaugh.com/2007/01/19/where-do-you-think-youre-going-mister/"><img src='http://www.ajaxplanet.ru/wp-content/uploads/2007/02/070119_finish_your_rss.gif' alt='bLaugh: RSS' /></a></noindex></p>
<p>Вот только оценить в цифрах популярность нового аггрегатора было сложно: Google Reader не отдавал статистику по количеству читателей. Т.е. по реферерам было видно, что популярность Google Reader растет, но дать хотя бы более-менее достоверные цифры было нельзя. Более того, <noindex><a href="http://weblogs.hitwise.com/leeann-prescott/2007/01/web_based_feed_readers.html">появлялись данные, что доля Google Reader достаточно мала</a></noindex>, и он проигрывает не только <noindex><a href="http://www.bloglines.com/">Bloglines</a></noindex>, но и <noindex><a href="http://www.rojo.com/">Rojo</a></noindex>.</p>
<p>В пятницу <noindex><a href="http://googlereader.blogspot.com/2007/02/one-subscriber-two-subscribers-three.html">эта ситуация изменилась</a></noindex>. Google Reader наконец-то стал показывать статистику по количеству подписчиков на тот или иной фид. Статистика оказалась действительно впечатляющей. </p>
<p><img src='http://www.ajaxplanet.ru/wp-content/uploads/2007/02/feedburner-stats.png' alt='Статистика FeedBurner с 18 января по 16 февраля' /></p>
<p>По данным FeedBurner на <noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex> RSS через Google Reader читают 42% подписчиков. Правда, должен отметить, что это не только доля Google Reader, но и <noindex><a href="http://www.google.com/ig">Google Personalized Homepage</a></noindex>.</p>
<p>Что интересно, и <noindex><a href="http://dikiy.com/blog/archive/2007/02/18/google-feedfetcher-feedburner.html">на других сайтах</a></noindex> картина ровно такая же. Для англоязычных блогов доля Google Reader <noindex><a href="http://andybeard.eu/2007/02/google-reader-feedburner-stats-show-significant-market-share-google-reader-now-1.html">колеблется в пределах от 30 до 60% (!)</a></noindex>.</p>
<p><img src='http://www.ajaxplanet.ru/wp-content/uploads/2007/02/feedburner-greader-stats.gif' alt='FeedBurner, доля Google Reader' /></p>
<p>Интересно было бы получить статистику в целом по числу пользователей Google Reader. Уже практически нет сомнений, что Google Reader &#8212; самый популярный аггрегатор в мире. При этом я вполне готов поверить, что и до сих пор идет постоянный рост числа пользователей, пусть и не такой стремительный, как осенью 2006, так что вскоре Google Reader вполне может занять больше 50% рынка. </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/dolya-ryinka-google-reader/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/dolya-ryinka-google-reader/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <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/technology/rss-n-atom/" title="Просмотреть все записи в рубрике &laquo;RSS&raquo;" rel="category tag">RSS</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/dolya-ryinka-google-reader/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</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>
	</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! -->