<?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; TermiT</title>
	<atom:link href="http://www.ajaxplanet.ru/author/termitt/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ajaxplanet.ru</link>
	<description></description>
	<lastBuildDate>Thu, 13 Oct 2011 13:00:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.4</generator>
		<item>
		<title>Интервью с создателем проекта Blogowar.ru</title>
		<link>http://www.ajaxplanet.ru/intervyu-s-sozdalem-proekta-blogowarru/</link>
		<comments>http://www.ajaxplanet.ru/intervyu-s-sozdalem-proekta-blogowarru/#comments</comments>
		<pubDate>Thu, 20 Dec 2007 19:46:08 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Развлечения]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/intervyu-s-sozdalem-proekta-blogowarru/</guid>
		<description><![CDATA[Каждый месяц рождаются новые рейтинги сайтов и новые браузерные игры. Но недавно появился сервис наделавший много шуму в русской блогосфере, сервис умело объединивший в себе и рейтинг и игру &#8211; Blogowar. Уже зарегистрировано более тысячи бойцов и сегодня мы пообщаемся, так сказать, с военачальником и одним из создателей проекта с человеком под ником Warchief, любезно [...]]]></description>
			<content:encoded><![CDATA[<p>Каждый месяц рождаются новые рейтинги сайтов и новые браузерные игры. Но недавно появился сервис наделавший много шуму в русской блогосфере, сервис умело объединивший в себе и рейтинг и игру &#8211; <noindex><a href="http://www.blogowar.ru/">Blogowar</a></noindex>. Уже зарегистрировано более тысячи бойцов и сегодня мы пообщаемся, так сказать, с военачальником и одним из создателей проекта с человеком под ником <noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>, любезно согласившимся ответить на несколько вопросов <noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Для начала хотелось бы, чтобы вы представили себя и вашу команду.</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Вопрос про команду – хороший, обычно все делают вид, что я один. Второй человек в команде – Макс Миронов, известный, как <noindex><a href="http://sham.ru/">sham</a></noindex>. Макс – пиксельный дизайнер, отвечает за весь «вижуал», организационные вопросы и работу с людьми.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Расскажите вкратце о Студии Электронных Развлечений, в каком направлении работает ваша студия.</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Мы стараемся заниматься развлечениями, не всегда электронными, но регулярно занимаемся сайтами, ибо у нас тяжелое веб-девелуперское прошлое, которое дает о себе знать. Наши проекты можно посмотреть на сайте студии &#8211; <noindex><a href="http://elens.ru/">http://elens.ru/</a></noindex> </p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Огромное количество людей уже знакомы с вашим проектом-игрой и все же не могли бы вы еще раз поведать идею проекта Blogowar? Чем он отличается от классических «пузомерок»?</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Блоговар – это «рейтинг для накручивания». Эксплуатирует любовь людей к пузомеркам, но в отличие от «серьезных» рейтингов, блоговар не меряет, фактически, ничего – кроме текущей активности игроков. Чем игрок активней – тем он выше в «рейтинге».</p>
<p>Ну или можно назвать Блоговар пародией на рейтинг.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Какова история создания проекта, как рождалась концепции? Был ли Blogowar навеян, каким либо сайтом/игрой.</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Сначала была простая мысль, что блоги — это MMORPG.</p>
<p>«По буквам» возражений нет. Massive? Да. Multiplayer? Да. Online? Да. Roleplaying? Да. Game? Пожалуй, да.</p>
<p>Потом была попытка облечь эту мысль в конкретную игровую форму.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Легко ли попасть в топ-20? Блоги с какой тематикой чаще всего оказываются в топе?</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Легко, с любой. Сложнее всего – удержаться в топе, а не попасть. Попасть же в топ можно за пару дней активной игры.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Блоговар приносит неплохой поток посетителей для тех, кто на вершине рейтинга, отсюда возникает вопрос: были ли попытки накрутки, мошенничества в игре?</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Мошенничества – да. Например, напишут «игровой» пост с ссылками, он засчитывается, после чего его удаляют. Такое легко отслеживается другими игроками, и в результате мошенники банятся.</p>
<p>«Накруток» же в классическом понимании нет, вся цель игры – «накрутить» рейтинг. Поэтому все «накрутки» являются вполне нормальным игровым процессом и были предусмотрены изначально. Тем не менее, осознание того, что ты что-то «накручиваешь», греет душу – тоже один из плюсов Блоговара.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Практически каждую неделю на поле боя появляются всевозможные новшества: различные зелья, заклинания, новое вооружение. Может, приоткроете завесу тайн и расскажете читателем, над какой очередной возможностью вы работаете в данный момент, если это конечно не секрет.</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: На самом деле, после того, как сайт был сделан, все остальные изменения происходят «набегами», то есть: появилась идея – час на обдумывание, если обдумывание удалось – два часа на реализацию. Максимум через три часа все работает. Изменения-то пока что все небольшие (но приятные).</p>
<p>Если бы я сейчас работал над новшеством, через несколько часов оно уже было бы реализовано.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Давайте поговорим о технической части проекта. Интересно узнать каким сервером обслуживается проект, какая СУБД применяется и использовались ли какие либо php-фреймворки при создании проекта, опять же если это не секрет : ) ?</p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Ничего нестандартного нет: mysql+php.</p>
<p>Фреймворки и чужие библиотеки не использовались, но есть небольшой набор собственных библиотек, который помогает при создании новых сайтов.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</a></noindex>: Есть ли планы по разработке подобного сайта для англоязычной интернет аудитории? У вашей студии недавно вышла настольная игра <noindex><a href="http://raiders.elens.ru/">Большой куш</a></noindex>, будет ли она интересна поклонникам Blogowar? Поделитесь планами будущих проектов… </p>
<p><noindex><a href="http://warchief.blogowar.ru/">Warchief</a></noindex>: Про англоязычную аудиторию мы даже как-то и не думали. Своя блогосфера как-то ближе и понятней.</p>
<p><noindex><a href="http://raiders.elens.ru/">Большой куш</a></noindex> – пока что самая любимая моя игра. Она простая и очень веселая, со смешными красочными иллюстрациями. Более того, у нее есть «фишка» &#8211; карты «Куша» к тому же имеют обычную карточную маркировку (масть и достоинство), поэтому «Кушем» при желании можно играть и в любую карточную игру.</p>
<p>Так что это – идеальная игра для отпусков, компаний и прочего. И как бизнес-подарок сложно придумать что-то более «прикольное», игра ведь про рейдеров и захват собственности. Купить игру можно на <noindex><a href="http://elens.ru/projects/raiders/">нашем сайте</a></noindex>.</p>
<p><noindex><a href="http://www.ajaxplanet.ru/">AJAX Planet</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/intervyu-s-sozdalem-proekta-blogowarru/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/intervyu-s-sozdalem-proekta-blogowarru/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/fun/" title="Просмотреть все записи в рубрике &laquo;Развлечения&raquo;" rel="category tag">Развлечения</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/intervyu-s-sozdalem-proekta-blogowarru/feed/</wfw:commentRss>
		<slash:comments>12</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/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>Ajax для профессионалов</title>
		<link>http://www.ajaxplanet.ru/ajax-dlya-professionalov/</link>
		<comments>http://www.ajaxplanet.ru/ajax-dlya-professionalov/#comments</comments>
		<pubDate>Thu, 05 Apr 2007 05:45:54 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Книги]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[ajax-для-профессионалов]]></category>
		<category><![CDATA[рецензия]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/ajax-dlya-professionalov/</guid>
		<description><![CDATA[Ajax обширная тема, и описать все важные аспекты данного понятия в одной книге очень тяжело, но авторам книги «Ajax для профессионалов» это, как мне кажется, удалось. Издателями в России выступили «Символ-Плюс», что означает (повторюсь за Борисом) высокое качество перевода. Также меня очень порадовала работа научного редактора, который добавил большое количество сносок поясняющих некоторые тонкие моменты, [...]]]></description>
			<content:encoded><![CDATA[<p><noindex><a href="http://www.books.ru/shop/books/477695?partner=celarent"><img src="http://www.books.ru/img/477695.jpg" alt="Ajax для профессионалов" style="float: left; margin: 3px; border: none;" /></a></noindex><br />
Ajax обширная тема, и описать все важные аспекты данного понятия в одной книге очень тяжело, но авторам книги <noindex><a href="http://www.books.ru/shop/books/477695?partner=celarent">«Ajax для профессионалов»</a></noindex> это, как мне кажется, удалось.</p>
<p>Издателями в России выступили «Символ-Плюс», что означает (повторюсь за Борисом) высокое качество перевода. Также меня очень порадовала работа научного редактора, который добавил большое количество сносок поясняющих некоторые тонкие моменты, на которых авторы не сделали акцента. Аннотацию можно почитать <noindex><a href="http://www.books.ru/shop/books/477695?partner=celarent">тут</a></noindex>, но она ничем не отличается от аннотаций <noindex><a href="http://www.ozon.ru/?context=search&#038;text=ajax&#038;partner=ferio">других книг по Ajax</a></noindex>. Я же попробую подробнее описать, какие аспекты рассмотрены в данном издании, для этого пробежимся по содержанию.</p>
<ul>
<li><strong>Глава 1. Что такое Ajax?</strong> В этой главе рассматривается история термина Ajax, примеры сайтов, использующих эту технологию. Кстати, даже я, читавший ни одну статью с таким названием, нашел для себя несколько новых фактов</li>
<li><strong>Глава 2. Основы Ajax</strong> представляет собой введение в основы Ajax, описываются методы реализации с использованием iframe’ов  и XMLhttp, их преимущества и недостатки, варианты применения. Большое внимание уделяется такому важному аспекту как юзабилити. Также показывается удобства работы с кросс-браузерной библиотекой zXMLhttp, разработанной авторами книги (нужно отметить, что действительно удобная вещь для небольших проектов)</li>
<li><strong>Глава 3. Шаблоны проектирования.</strong> Очень важная, на мой взгляд, глава. Мало того, что в ней описываются наиболее часто используемые паттерны Ajax, она дает задуматься о важности глубокого анализа своего проекта на предмет построения более правильного взаимодействия частей отвечающих за реализацию Ajax.</li>
<li><strong>Глава 4. XML, XPath и XSLT.</strong> Это небольшое введение в технологии сопутствующие Ajax, большое внимание уделено кросс-браузерности.</li>
<li><strong>Глава 5. Синдицирование с использованием RSS и Atom.</strong> Описываются история появления и развития  технологий распространения информации через Веб, включая RSS и Atom, а также процесс создания и реализации веб-агрегатора RSS/Atom</li>
<li><strong>Глава 6. Веб-службы.</strong> Для меня глава оказалась действительно полезной, так как четко определяет понятия SOAP, REST, WSDL. Также из этого раздела можно узнать о создании веб-службы с помощью ASP.NET и C#, и способ решения проблемы междоменных запросов.</li>
<li><strong>Глава 7.  JSON.</strong> Наличие этой главы очень меня порадовало, так как многие авторы, освещающие Ajax тему считают, что XML это единственный формат общения серверной и клиентской частей. Но даже в одном из документов Googl’a по Ajax API, говорится о том насколько удобнее применять JSON в среде работы с JavaScript. Итак, в этой главе будет рассмотрен пример работы Ajax приложения с использованием формата JSON для реализации поля ввода с авто-дополнением (auto-suggestion)</li>
<li><strong>Глава 8. Виджеты на веб-сайте.</strong> Рассмотрены примеры реализации виджета со сводкой новостей, виджета с информацией о погоде, виджета поиска в Сети и поиска по сайту. </li>
<li><strong>Глава 9. AjaxMail. </strong>Самая интересная и полезная глава, рассказывающая о создании законченного веб-приложения с использованием всех приведенных сведений из предыдущих глав (надо сказать, достаточно мощное приложение получается)</li>
<li><strong>Глава 10. Интегрированные системы Ajax.</strong> В этой главе описывается три интегрированных системы: JSPAN для работы c PHP, DWR для работы с Java и Ajax.NET, каждая из которых автоматизирует какую-то часть процесса разработки в Ajax.</li>
</ul>
<p>К плюсам <noindex><a href="http://www.ozon.ru/context/detail/id/3163637/&#038;partner=ferio">книжки</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/ajax-dlya-professionalov/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/ajax-dlya-professionalov/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/knigi/" title="Просмотреть все записи в рубрике &laquo;Книги&raquo;" rel="category tag">Книги</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/ajax-dlya-professionalov/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Выдача Google в формате XML</title>
		<link>http://www.ajaxplanet.ru/vyidacha-google-v-formate-xml/</link>
		<comments>http://www.ajaxplanet.ru/vyidacha-google-v-formate-xml/#comments</comments>
		<pubDate>Thu, 22 Mar 2007 08:01:04 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Без рубрики]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/vyidacha-google-v-formate-xml/</guid>
		<description><![CDATA[Многим веб-разработчикам, особенно в сфере SEO, очень хотелось бы получать результаты выдачи гугла в удобном формате, но google не предоставляет такой возможности &#8220;официально&#8221; и разработчикам приходится выкручиваться, создавая разнообразные парсеры. Недавно я писал о выдачи в формате json, теперь настало время xml. Для получения xml файла вам потребуется добавить к стандартной строке запроса два параметра: [...]]]></description>
			<content:encoded><![CDATA[<p>Многим веб-разработчикам, особенно в сфере SEO, очень хотелось бы получать результаты выдачи гугла в удобном формате, но google не предоставляет такой возможности &#8220;официально&#8221; и разработчикам приходится выкручиваться, создавая разнообразные парсеры. Недавно я писал о выдачи в формате json, теперь настало время xml. Для получения xml файла вам потребуется добавить к стандартной строке запроса два параметра:</p>
<p><code><br />
&amp;ch=[checksum]<br />
&amp;client=navclient-auto<br />
&amp;output=xml<br />
</code><br />
Этим мы как бы притворяемся Google Toolbar&#8217;ом, алгоритм получения checksum до недавнего времени был неизвестен, но кто-то похакал toolbar и достал его оттуда.<br />
Пример запроса:<br />
<noindex><a href="http://www.google.com/search?client=navclient-auto&amp;hl=en&amp;ch=6-1930753257&amp;q=seo%20is%20for%20losers&amp;output=xml&amp;num=100">http://www.google.com/search?client=navclient-auto&amp;hl=en&amp;ch=6-1930753257&amp;q=seo%20is%20for%20losers&amp;output=xml&amp;num=100</a></noindex></p>
<p>Полную реализацию своего поисковика на основе гугла можно скачать <noindex><a href="http://www.google-script.com/download/">отсюда</a></noindex>. На этом же сайте можно найти забавную заметку о том, как автор блога <noindex><a href="http://www.google-script.com/">google-script.com</a></noindex>, одурачил кучу народу сообщением о «новой» поисковой машине, которая лучше Google, Yahoo и MSN в несколько раз.</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/vyidacha-google-v-formate-xml/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/vyidacha-google-v-formate-xml/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/uncategorized/" title="Просмотреть все записи в рубрике &laquo;Без рубрики&raquo;" rel="category tag">Без рубрики</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/vyidacha-google-v-formate-xml/feed/</wfw:commentRss>
		<slash:comments>4</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>Секрет SearchMash.com</title>
		<link>http://www.ajaxplanet.ru/sekret-searchmashcom/</link>
		<comments>http://www.ajaxplanet.ru/sekret-searchmashcom/#comments</comments>
		<pubDate>Tue, 06 Mar 2007 05:27:17 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[SearchMash.com]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/sekret-searchmashcom/</guid>
		<description><![CDATA[Все знают что Google предоставляет API для получения результатов поиска. Но на сайте SearchMash.com существует неофициальное API для получения результатов в формате JSON (неофициальное потому что гугл о нем не заявлял) Итак чтобы воспользоваться API нужно перейти по урлу http://www.searchmash.com/results/[query], где [query] нужно заменить на интересующий вас запрос. Если задать урл в следующем формате http://www.searchmash.com/results/[query]?i=11&#38;n=10, [...]]]></description>
			<content:encoded><![CDATA[<p>Все знают что Google предоставляет <noindex><a href="http://code.google.com/apis/ajaxsearch/">API</a></noindex> для получения результатов поиска. Но на сайте <noindex><a href="http://www.searchmash.com/">SearchMash.com</a></noindex> существует неофициальное API для получения результатов в формате JSON (неофициальное потому что гугл о нем не заявлял)</p>
<p>Итак чтобы воспользоваться API нужно перейти по урлу <strong>http://www.searchmash.com/results/[query]</strong>, где [query] нужно заменить на интересующий вас запрос. Если задать урл в следующем формате http://<strong>www.searchmash.com/results/[query]?i=11&amp;n=10</strong>, то вы получите десять результатов запроса начиная с одиннадцатого. Также можно получить результаты по изображениям, видео и блогам:</p>
<p><strong>http://www.searchmash.com/results/images:[query]<br />
http://www.searchmash.com/results/blogs:[query]</p>
<p>http://www.searchmash.com/results/video:[query]</strong></p>
<p>Если вы захотите использовать это API через AJAX, то возможно вам потребуется <noindex><a href="http://developer.yahoo.net/javascript/howto-proxy.html">веб-прокси</a></noindex> для создания междоменых запросов.</p>
<p>В PHP можно получить результаты, воспользовавшись библиотекой <noindex><a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198">pear.php.net/pepr/pepr-proposal-show.php?id=198</a></noindex>:</p>
<p><code><br />
$request = 'статьи о AJAX'<br />
require_once("JSON.php");<br />
$json = new Services_JSON();<br />
$full_json_return = $json-&gt;decode(implode('',file('http://www.searchmash.com/results/'.urlencode(iconv('cp1251','UTF-8',$request)).'?n=10')));<br />
print_r($full_json_return-&gt;result);<br />
</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/sekret-searchmashcom/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/sekret-searchmashcom/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/uncategorized/" title="Просмотреть все записи в рубрике &laquo;Без рубрики&raquo;" rel="category tag">Без рубрики</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/sekret-searchmashcom/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Галерея AJAX библиотек и фреймворков</title>
		<link>http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/</link>
		<comments>http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/#comments</comments>
		<pubDate>Mon, 05 Mar 2007 05:15:08 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[Без рубрики]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[miniajax]]></category>
		<category><![CDATA[библиотека]]></category>
		<category><![CDATA[фреймворк]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/</guid>
		<description><![CDATA[Автор сайта miniajax попытался собрать наиболее эффектные и красивые примеры работ всевозможных AJAX скриптов и библиотек, каждая ссылка на сайте снабжена картинкой и кратким описанием, что делает серфинг по блогу очень приятным. Возможно, вы скажете, что script.aculo.us дает достаточные количество интересных эффектов, но я думаю посетив данную страничку вы убедитесь в обратном. &#169; AJAX Planet, [...]]]></description>
			<content:encoded><![CDATA[<p>Автор <noindex><a href="http://www.miniajax.com/">сайта miniajax</a></noindex> попытался собрать наиболее эффектные и красивые примеры работ всевозможных AJAX скриптов и библиотек, каждая ссылка на сайте снабжена картинкой и кратким описанием, что делает серфинг по блогу очень приятным. Возможно, вы скажете, что script.aculo.us дает достаточные количество интересных эффектов, но я думаю посетив данную страничку вы убедитесь в обратном.</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/galereya-ajax-bibliotek-i-freymvorkov/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <a href="http://www.ajaxplanet.ru/category/libraries-and-frameworks/" title="Просмотреть все записи в рубрике &laquo;Библиотеки и фреймворки&raquo;" rel="category tag">Библиотеки и фреймворки</a>, <a href="http://www.ajaxplanet.ru/category/uncategorized/" title="Просмотреть все записи в рубрике &laquo;Без рубрики&raquo;" rel="category tag">Без рубрики</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://www.ajaxplanet.ru/galereya-ajax-bibliotek-i-freymvorkov/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/ajax/" title="Просмотреть все записи в рубрике &laquo;AJAX&raquo;" rel="category tag">AJAX</a>, <a href="http://www.ajaxplanet.ru/category/google/" title="Просмотреть все записи в рубрике &laquo;Google&raquo;" rel="category tag">Google</a>, <a href="http://www.ajaxplanet.ru/category/java/" title="Просмотреть все записи в рубрике &laquo;Java&raquo;" rel="category tag">Java</a>, <a href="http://www.ajaxplanet.ru/category/technology/" title="Просмотреть все записи в рубрике &laquo;Технологии&raquo;" rel="category tag">Технологии</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/google-web-toolkit-manual/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>AJAX MVC</title>
		<link>http://www.ajaxplanet.ru/ajax-mvc/</link>
		<comments>http://www.ajaxplanet.ru/ajax-mvc/#comments</comments>
		<pubDate>Mon, 15 Jan 2007 05:30:19 +0000</pubDate>
		<dc:creator>TermiT</dc:creator>
				<category><![CDATA[Библиотеки и фреймворки]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Stoyan-Stefanov]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://www.ajaxplanet.ru/ajax-mvc/</guid>
		<description><![CDATA[Немного вводных&#8230; В последнее время я писал достаточно мало. Особенно мало было материалов по программированию. Да и то, что я писал непосредственно про AJAX в большинстве случаев касалось ASP.Net &#8212; ну что ж поделать, именно на нём я делаю самые большие проекты. Впрочем, это однобокий подход &#8212; не надо забывать и мир LAMP. Итак, сегодня [...]]]></description>
			<content:encoded><![CDATA[<p>Немного вводных&#8230; В последнее время я писал достаточно мало. Особенно мало было материалов по программированию. Да и то, что я писал непосредственно про AJAX в большинстве случаев касалось ASP.Net &#8212; ну что ж поделать, именно на нём я делаю самые большие проекты. Впрочем, это однобокий подход &#8212; не надо забывать и мир LAMP. Итак, сегодня в блоге появляется статья, переведенная Геннадием Потаповым. Надеюсь, статья будет полезна, и Генадий достойно подхватит флаг из моей ныне сломанной руки.</p>
<p><strong>О статье</strong><br />
Автор заметки <noindex><a href="http://www.phpied.com/">Stoyan Stefanov</a></noindex>, он известен своими статьями о PEAR (скорей всего вы сталкивались с его статьей <noindex><a href="http://www.phpied.com/db-2-mdb2/">DB to MDB2</a></noindex>), MySQL и AJAX. Речь пойдет о раскладке AJAX под MVC (казалось бы, вещь элементарная, но на самом деле легко допустить ошибку) и о мини-фреймворке, который предлагает вам автор. Критика по перевод приветствуется.</p>
<p><strong>AJAX MVC<br />
</strong>Это своего рода фреймворк для создания AJAX приложений, основанных на MVC паттерне. Да, я назвал много модных словечек, признаю, но это не должно восприниматься в серьез. Недавно я работал над несколькими небольшими проектами и как-то случайно (это вообще не входило в мои планы), разработал для себя маленький фреймворк. Потом, я заметил, что этот скрипт и его организация схож с MVC. Так как должен быть построен MVC когда мы имеем смесь толстого и тонкого клиента, HTML, JavaScript, XMLHttpRequest, PHP и СSS?<strong><br />
</strong><br />
<strong>Как обычно работают AJAX приложения:</strong></p>
<ol>
<li>у нас есть HTML страничка, оформленная CSS</li>
<li>вы куда ни будь кликаете</li>
<li>JavaScript отправляет запрос на сервер (PHP скрипту)</li>
<li>JavaScript обновляет содержимое HTML страницы</li>
</ol>
<p><strong>Реализуем MVC паттерн</strong><br />
Итак, так какая часть будет отвечать за Model (Модель), View (Вид) и Controller (Контроллер)? С Моделью все просто, это бизнес логика: запись в базу и т.п. Модель &#8211; PHP скрипт. Вид? Очевидно это HTML страница, оформленная CSS. Надо заметить, что JavaScript, который будет обновлять страницу, тоже часть Вида. Неважно как это реализовано: innerHTML в JavaScript’e или DOM, в любом случае это часть HTML. А что насчет Контроллера? У нас будет два контроллера. Один на серверной части, PHP скрипт который будет получать запросы, и запрашивать у Модели данные. Другой на стороне клиента, JavaScript, который решает, что случится по нажатию кнопки и отправляет соответствующий AJAX запрос PHP контролеру. Поэтому я буду рассматривать любые действия JavaScript, включающие отлавливание событий и отправку HTTP запросов как часть Контролера. Схема:<br />
<img align="middle" src="http://www.lovequotes.ru/img/mvc-ajax.png" alt="Схема" /></p>
<p>В действии (пример)<br />
Чтобы оправдать концепцию мы рассмотрим небольшое приложение в качестве примера. Простая HTML страница с кнопкой, оформленная CSS. Она содержит два JavaScript’a отвечающих за события (Контролер) и за обновления страницы (Вид). Также страница будет содержать два вспомогательных JavaScript’а, так как я использую YUI (Yahoo User Interface) библиотеку. JavaScript’овый Контролер будет связан с кнопкой, по нажатию этой кнопки он отправит запрос PHP Контролеру. PHP Контролер (просто switch) разбирает запрос и вызывает соответствующий объект бизнес модели. В нашем случае «объект модели» это простая функция, но вы легко можете ее расширить. Модель возвращает (в JSON формате) ответ, в нашем случае это список установленных расширений PHP. Теперь используя полученные данные, JavaScript Вида обновляет содержимое страницы. Затем Вид вызывает другую функцию из JavaScript’ого Контролера, которая добавляет новые обработчики событий для нового контента. (Оп, тут небольшая ошибочка, было бы лучше, если бы ответы Модели отлавливались JavaScript’овым контролером, который бы активировал обработчики обновления JavaScript’ового вида, в любом случае это легко исправить)</p>
<p><strong>Структура каталогов:</strong><br />
<img src="http://www.phpied.com/wp-content/uploads/2006/09/ajax-mvc-dir.png" alt="Структура каталогов" /></p>
<p><strong>Код для примера</strong><br />
Мы добрались до самого интересного – реализации. Начнем с простого .html страницы, главной части вида.</p>
<p>Index.html:</p>
<p><code lang="html"><br />
< ?xml version=”1.1″ encoding=”iso-8859-1″?><br />
< !DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN”<br />
“http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”></p>
<p><html xmlns=”http://www.w3.org/1999/xhtml” xml:lang=”en”><br />
<head></p>
<link rel=”stylesheet” href=”../view/styles.css” mce_href=”../view/styles.css” type=”text/css” media=”all” title=”Default styles” />
<script language=”javascript” type=”text/javascript” src=”../_extras/yui/build/yahoo/yahoo-min.js” mce_src=”../_extras/yui/build/yahoo/yahoo-min.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../_extras/yui/build/event/event-min.js” mce_src=”../_extras/yui/build/event/event-min.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../_extras/yui/build/connection/connection-min.js” mce_src=”../_extras/yui/build/connection/connection-min.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../view/updates.js” mce_src=”../view/updates.js”></script><br />
<script language=”javascript” type=”text/javascript” src=”../controller/behaviours.js” mce_src=”../controller/behaviours.js”></script><br />
</head><br />
<body></p>
<p>Welcome to my app!<br />
</p>
<form action=”" method=”post”>
<input type=”button” name=”b” id=”thebutton” value=”I’m a button, click me!” />
</form>
<div id=”content”> </div>
<p></body><br />
</html><br />
</code></p>
<p>Это фрагмент из behaviours.js:</p>
<p><code lang="javascript">// класс событий<br />
var behaviours = {<br />
phpcontroller: "../controller/switch.php?request=",<br />
// продолжаются behaviour.methods ….<br />
}</p>
<p>// загрузка страницы, добавляем onload событие<br />
YAHOO.util.Event.addListener(<br />
'thebutton', 'click', behaviours.theButtonClick);<br />
</code></p>
<p>Теперь, когда пользователь кликнет по кнопке, вызовется метод behaviours.theButtonClick(), что в свою очередь отправит запрос PHP контролеру и сообщит ему тип запроса: &#8220;loadSomething&#8221;:</p>
<p><code lang="javascript">theButtonClick: function(e) {<br />
alert('Ouch! nnOK, I'll make a request for ya, buddy!');<br />
YAHOO.util.Connect.asyncRequest (<br />
'GET',<br />
behaviours.phpcontroller + 'loadSomething',<br />
{success: updates.writeContent}<br />
);<br />
},</code></p>
<p>PHP контроллер (controller/switch.php) получит запрос, пройдет switch (проверит тип запроса) и вызовет соответствующую (в нашем случае простую) функцию из бизнес модели. Полный код switch.php:</p>
<p><code lang="php"><br />
< ?php<br />
// если это запрос<br />
if (empty($_GET[’request’])) {<br />
die();<br />
}<br />
// получить бизнес-логику<br />
include_once ‘../model/business.php’;</p>
<p>// разбор запроса<br />
// и вызов объекта логики<br />
switch ($_GET[’request’])<br />
{<br />
case ‘loadSomething’:<br />
echo loadSomething();<br />
break;<br />
case ‘loadSomeMore’: // не используется, только для примера<br />
echo loadSomeMore();<br />
break;<br />
}<br />
?><br />
</code></p>
<p>Функция loadSomething() из PHP модели получает список установленных PHP расширений, кодируем в JSON и отправляем назад. Полный листинг ../model/business.php:</p>
<p><code lang="php">< ?php<br />
function loadSomething() {<br />
$extensions = get_loaded_extensions();<br />
return ‘[”‘. implode(’”,”‘, $extensions) . ‘”]’;<br />
}<br />
?></code></p>
<p>Если вернуться назад и взглянуть на AJAX запрос, можно увидеть, что в случае успеха, я вызываю метод updates.writeContent(). В ../view/updates.js содержится код обновления исходной html страницы, который создает HTML таблицу с результатами (списком расширений PHP). Потом я хотел прикрепить листенер к новой таблице, но это уже работа JavaScript’ового Контролера. Полный листинг updates.js:</p>
<p><code lang="javascript">var updates = {<br />
writeContent: function (xmlhttp) {<br />
if (!xmlhttp.responseText) {<br />
alert("I got nothing from the server");<br />
}<br />
var data = eval(xmlhttp.responseText);<br />
var write_to = document.getElementById('content');<br />
write_to.innerHTML = '';</p>
<p>var html2dom_root = write_to;<br />
var table = document.createElement("table");<br />
var table_1_tbody = document.createElement("tbody");<br />
for (var i in data) {<br />
table_1_tbody_2_tr = document.createElement("tr");<br />
table_1_tbody_2_tr_1_td = document.createElement("td");<br />
num = 1 + parseInt(i);<br />
table_1_tbody_2_tr_1_td_1_text = document.createTextNode(num);<br />
table_1_tbody_2_tr_1_td.appendChild(table_1_tbody_2_tr_1_td_1_text);<br />
table_1_tbody_2_tr.appendChild(table_1_tbody_2_tr_1_td);<br />
table_1_tbody_2_tr_2_td = document.createElement("td");<br />
table_1_tbody_2_tr_2_td_1_text = document.createTextNode(data[i]);<br />
table_1_tbody_2_tr_2_td.appendChild(table_1_tbody_2_tr_2_td_1_text);<br />
table_1_tbody_2_tr.appendChild(table_1_tbody_2_tr_2_td);<br />
table_1_tbody.appendChild(table_1_tbody_2_tr);<br />
}<br />
table.appendChild(table_1_tbody);<br />
html2dom_root.appendChild(table);</p>
<p>behaviours.updateTableBehaviour();<br />
}<br />
}<br />
</code></p>
<p>(Кстати, чтобы облегчить себе жизнь, при работе с DOM, я использовал свою небольшую утилиту <noindex><a href="http://www.html2dom.com/">html2dom</a></noindex>)</p>
<p>И, наконец, оставшаяся часть JavaScript’ового Контролера (behaviours.js): метод behaviours.updateTableBehaviour(), который добавляет листенер к новой таблице и метод trClick(), который отлавливает клики по этой таблице. По клику просто меняется цвет выбранной строки.</p>
<p><code lang="javascript">trClick: function (e) {<br />
var target = (e.srcElement) ?<br />
e.srcElement.parentNode : e.target.parentNode;<br />
if (target.tagName == 'TR') {<br />
if (target.className == 'tr-on') {<br />
target.className = '';<br />
} else {<br />
target.className = 'tr-on';<br />
}<br />
}<br />
},<br />
updateTableBehaviour: function () {<br />
var el = document.getElementById('content').firstChild;<br />
YAHOO.util.Event.addListener(<br />
el, 'click', behaviours.trClick);<br />
}</p>
<p></code></p>
<p><strong>Демо и исходники</strong><br />
• <noindex><a href="http://www.phpied.com/files/ajax-mvc/view/">Demo</a></noindex> – on-line демонстрация<br />
• <noindex><a href="http://www.phpied.com/files/ajax-mvc/ajaxmvc.zip">Zipped demo</a></noindex> – весь исходный код этого примера<br />
• <noindex><a href="http://www.phpied.com/files/ajax-mvc/ajax-core.zip">Template</a></noindex> – исходный код примера, но часть кода закомментирована, так что вы можете использовать его в качестве шаблона для ваших будущий AJAX проектов. Единственное, что нужно сделать &#8211; кинуть <noindex><a href="http://sourceforge.net/projects/yui">YUI</a></noindex> в папку _extras/yui.</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/ajax-mvc/">Постоянная ссылка</a> |
	  <a href="http://www.ajaxplanet.ru/ajax-mvc/#comments">Комментарии</a></p>
	
	<p>Интересна эта тема? Посмотрите архив сообщений по теме <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/ajax-mvc/feed/</wfw:commentRss>
		<slash:comments>4</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! -->
