<?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>jQuery и другое... &#187; php</title>
	<atom:link href="http://www.linkexchanger.su/tag/php/feed" rel="self" type="application/rss+xml" />
	<link>http://www.linkexchanger.su</link>
	<description>css, html, php, javascript, jQuery, ajax ... - решения, примеры, рецепты</description>
	<lastBuildDate>Sun, 08 Jan 2012 13:25:49 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Yii framework. Часть 1 : Введение</title>
		<link>http://www.linkexchanger.su/2010/418.html</link>
		<comments>http://www.linkexchanger.su/2010/418.html#comments</comments>
		<pubDate>Sat, 06 Mar 2010 04:44:29 +0000</pubDate>
		<dc:creator>M4V23</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[mvc]]></category>
		<category><![CDATA[yii]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/?p=418</guid>
		<description><![CDATA[Предисловие
В этом цикле статей я хочу рассказать о таком замечательном фреймворке, как yii. Предполагается, что у читателя есть некоторый навык работы с php5, особенно с его объектно-ориентированной частью. Я буду стараться охватить как можно больше разных аспектов создания веб-приложений на базе yii, добавляя от себя разные тонкости и хитрости; но не ждите от меня копипаста [...]]]></description>
			<content:encoded><![CDATA[<h2><strong>Предисловие</strong></h2>
<p>В этом цикле статей я хочу рассказать о таком замечательном фреймворке, как yii. Предполагается, что у читателя есть некоторый навык работы с <a href="http://php.net">php5</a>, особенно с его объектно-ориентированной частью. Я буду стараться охватить как можно больше разных аспектов создания веб-приложений на базе yii, добавляя от себя разные тонкости и хитрости; но не ждите от меня копипаста документации или api. И то и другое Вы можете найти на официальном сайте.</p>
<h2><strong>Введение</strong></h2>
<p>Что такое Yii?</p>
<p>Yii это свободный(распространяется под <a href="http://yiiframework.com/license/">new BSD licence</a>) высокопроизводительный объектно-ориентированный расширяемый php-фрэймворк для разработки веб-приложений.<br />
<span id="more-418"></span><br />
Зачем он нужен?</p>
<p>Для удобной разработки веб-приложений и чтобы не изобретать сто раз изобретенный велосипед.</p>
<h3>Основные особенности :</h3>
<ul>
<li>MVC-архитектура</li>
<li>Работа с базами данных</li>
<li>Поддержка кэширования на разных уровнях</li>
<li>Большое количество встроенных компонентов</li>
<li>Возможность простого подключения сторонних библиотек</li>
<li>Интеграция с jQuery</li>
</ul>
<h2><strong>Подготовка:</strong></h2>
<p>Системные требования:</p>
<ul>
<li>Веб-сервер(рекомендуется Apache)</li>
<li>PHP версии не ниже 5.1.0</li>
<li>PDO-совместимая СУБД (MySql, PostgreSQL, SqLite, Microsoft SQL, Oracle8) и соответствующее php-расширение для её поддержки.</li>
</ul>
<p>Рекомендуемые расширения для php:</p>
<ul>
<li>gd – для работы с графикой.</li>
<li>mcrypt – для функций кодирования.</li>
<li>MemCache  или APC – для кэширования, ускорения работы.</li>
</ul>
<p>Такой нехитрый набор в наше время можно найти почти на любом хостинге.</p>
<p>Для домашнего тестирования на linux можно установить пакеты из стандартных репозитариев.Если же Вы предпочитаете на windows, могу порекомендовать в качестве готового решения <a href="http://denwer.ru">denwer</a>.</p>
<p>Для пользователей денвера:</p>
<p>(В данном случае, Z: это диск, монтируемый денвером)<br />
1. Для начала прописываем в переменные окружения путь  Z:\usr\local\php5\<br />
2. Открываем /usr/local/php5/php.ini, ищем строчку extension_dir = &laquo;/usr/local/php5/ext&raquo;, заменяем на extension_dir = &laquo;Z:\usr\local\php5\ext&raquo;<br />
3. session.save_path = &laquo;/tmp&raquo; на session.save_path = &laquo;Z:\tmp&raquo;</p>
<h2><strong>Установка:</strong></h2>
<p>На момент написания статьи, последняя стабильная версия была 1.1.0. Скачать её можно в виде архива по адресу  <a title="http://yiiframework.com/download" href="http://yiiframework.com/download" target="_blank">http://yiiframework.com/download</a><br />
Вся установка сводится к распаковке содержимого архива.Для начала рекомендую распаковать всё в директорию доступную из веб и открыть папку requirments в браузере, чтобы убедиться в наличии всех необходимых компонентов.</p>
<p>Для создания приложения необходимо использовать коммандную строку(ssh при удалённом доступе). Нужно запустить файл yiic.bat(для windows) или yiic(для linux и других unix-based систем) с параметрами webapp /full/path/to/new/wbebapp/.<br />
Например :</p>
<blockquote><p><em>$ /var/www/framework/yiic webapp /var/www/testing</em></p></blockquote>
<p>Убедитесь, что у вас есть права записи в  директорию, где Вы хотите создать веб-приложение и она доступна из web. Можно зайти в нее через браузер и увидеть возможности, предоставлямые yii «из коробки».</p>
<p>Практикой мы займемся в следующей статье, а теперь немного теории.</p>
<p><strong>Модель – Представление – Контроллер(MVC)</strong> – это модульная архитектура, применяющийся в веб-программировании(в частности и в yii). Она направлена на разделение логики(контроллер), управления данными(модель) и пользовательского интерфейса(представление) с целью возможности изменять одни части не внося изменения в другие.</p>
<h3>Основные части, из которых состоит yii:</h3>
<blockquote><p><span style="color: #000000;">В yii имена всех системных классов начинается с перфикса C , с целью недопущения коллизии имён. По этому, пожалуйста, воздержитесь от использования этого префикса в своих классах.</span></p></blockquote>
<p><strong>Входной файл</strong><br />
Входной файл(обычно index.php) это единственный скрипт, с которым контактирует пользователю. Вобщем-то, всё что он делает, это читает конфигурацию и создаёт экземпляр класса CWebApplication.<br />
<strong>Приложение(application)</strong><br />
Приложение(экземпляр класса CWebApplication) обрабатывает запрос пользователя, выполняет роутинг и передаёт его на исполнение соответствующему контроллеру.<br />
<strong>Контроллер(controller)</strong><br />
Контроллер(экзэмпляр класса CController или производного от него) определяет основную логику приложения, взаимодействует с моделями и отображениями. Контроллеры обычно находятся в папке /protected/controllers. По соглашению, класс контроллера и имя файла с ним : NameController.php<br />
<strong>Действие(action)</strong><br />
Действие это тип действия, выполняемого пользователем, например просмотр статьи в блоге или отправка комментария. Обычно является методом контроллера(вида actionName), но может быть вынесенно в отдельный класс.<br />
<strong>Модель (model)</strong><br />
Модель представляет собой сущность данных. Например таблица в базе данных(CActiveRecord) или форма на веб-странице(CForm). Она занимается непосредственной обработкой данных: созданием, получением, изменением. Также представляет интерфейс доступа к валидаторам(validator), проверяющим корректность введённых пользователем данных. Модели находятся в папке /protected/models. Модель обычно имеет имя, соответствующее таблице в бд, которую она представляет.<br />
<strong>Представление(view)</strong><br />
Представление генерирует готовые части страницы, отдаваемой пользователю.Оно не использует логики, кроме как условий и циклов. Представления для каждого контроллера обычно раздельны и хранятся в /protected/views/controllername/.<br />
<strong>Макет (layout)</strong><br />
Макет это специальное представление для вставки других представлений. Обычно он содержит части пользовательского интерфейса, используемого другими представлениями. Например, основной макет может содержать в себе шапку и подвал страницы, места для подключения других представлений и виджетов. Макеты храняться в /protected/views/layouts. По умолчанию используется макет main.php.<br />
<strong>Виджет(widget)</strong><br />
Виджет это компонент для генерации самодостаточного элемента пользовательского интерфейса(например, верхнее меню в тестовом приложении). В zii (библиотеке расширений, поставляемых вместе с yii) имеется большое количество готовых виджетов.<br />
<strong>Компонент(component)</strong><br />
Представляет сущность какого-либо аспекта веб-приложения. Например, авторизация пользователей. В yii много готовых компонентов, которые могут использоваться как в готовом виде, так и расширяться веб-разработчиками.<br />
<strong>Модуль(module)</strong><br />
Модуль, это самодостаточная единица, состоящая из контроллеров, моделей, отображений, и.т.д. Модули используются для разделения сайта на логические части, например форум и блог.</p>
<h2><strong>Заключение</strong></h2>
<p>В первой статье мы узнали, что такое yii, познакомились с базовыми понятиями и подготовили полигон для дальнейшего изучения.</p>
<p>И на последок хочу дать несколько полезных ссылок:</p>
<p><a href="http://yiiframework.com" target="_blank">Оффициальный сайт (en)</a></p>
<p><a href="http://yiiframework.ru" target="_blank">Русскоязычное сообщество (ru)</a></p>
<p><a href="http://dbhelp.ru/" target="_blank">Блог, посвящённый yii (ru) </a></p>
<h2><strong>В следующей статье:</strong></h2>
<p>В следующей статье мы познокомимся со внутренним устройством фреймворка, научимся делать собственные контроллеры, модели и отображения, изучим основы ActiveRecord.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2010/418.html/feed</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>LiveStreet &#8211; бесплатный движок социальной сети.</title>
		<link>http://www.linkexchanger.su/2008/72.html</link>
		<comments>http://www.linkexchanger.su/2008/72.html#comments</comments>
		<pubDate>Tue, 11 Nov 2008 09:40:29 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[LiveStreet]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/72.html</guid>
		<description><![CDATA[Сейчас все большую популярность в интернете приобретают сайты, где содержимым (контентом) сайта управляют сами пользователи. Они могу наполнять сайт информацией, оценивать эту информацию, оценивать других пользователей, составлять различные рейтинги. Одним словом, они имеют возможность &#171;сформировать&#187; такой сайт, который им нужен. В таких сайтах не последнюю роль играет социальная составляющая.
Так как сайт объединяет людей по какому [...]]]></description>
			<content:encoded><![CDATA[<p>Сейчас все большую популярность в интернете приобретают сайты, где содержимым (контентом) сайта управляют сами пользователи. Они могу наполнять сайт информацией, оценивать эту информацию, оценивать других пользователей, составлять различные рейтинги. Одним словом, они имеют возможность &laquo;сформировать&raquo; такой сайт, который им нужен. В таких сайтах не последнюю роль играет социальная составляющая.<span id="more-72"></span></p>
<p>Так как сайт объединяет людей по какому либо признаку: интересы, место жительства, путешествия и т.п., люди не просто обмениваются информацией &#8211; они общаются. Все это можно объединить под одним определением &#8211; социальная сеть. Подача информации зачастую происходит в виде блогов &#8211; то есть в виде сообщений, опубликованных в каком либо блоге, которые можно обсудить в комментариях. Часто еще блог называют сообществом.</p>
<p>Желающие создать собственный сайт такого рода сталкиваются с одной проблемой &#8211; какой движок (скрипт) выбрать для построения сайта, т.к. программировать самому такую систему сложно и дорого. Еще один критерий &#8211; это бесплатность движка, обычно за хорошие движки их создатели просят денег.</p>
<p>В связи с этим хочу представить вам бесплатный движок социальной сети (или даже блоговой сети) от российский разработчиков &#8211; <strong>LiveStreet</strong>. Этот движок написан на PHP5 и использует в качестве хранения данных реляционную базу данных MySql. Внутренняя архитектура построена на принципе MVC (модель-вид-контроллер) с применением объектно-ориентированного программирования.</p>
<p>Вообще движок построен на ядре собственного фреймворка, используя который можно достаточно просто разработать любой сайт. Но это больше касается программистов PHP. Для них, кстати, на сайте проекта есть документация по ядру.</p>
<p>Но нас больше интересует, какие возможности предоставляет <strong>LiveStreet</strong> с точки зрения пользователей. Итак, возможности:</p>
<ul>
<li>Полная поддержка кодировки UTF-8</li>
<li>Ведение персональных блогов</li>
<li>Возможность создания коллективных блогов</li>
<li>Система рейтингов блогов, топиков, комментариев, пользователей</li>
<li>Система голосования за блоги, топики, комментарии, пользователей</li>
<li>Возможность добавлять топики в избранное</li>
<li>Автоподстановка тегов</li>
<li>Коллективная внутренняя почта</li>
<li>Система контроля доступа (ACL) к разным возможностям сети (создание блога, возможность голосования и т.п.)</li>
<li>Возможность создать закрытый сайт</li>
<li>Система инвайтов</li>
<li>Топики-ссылки</li>
<li>Топики-опросы</li>
<li>Администрирование своих блогов</li>
<li>Назначение модераторов блогов</li>
<li>Настройки оповещений на e-mail</li>
</ul>
<p>Как видно из возможностей, движок предоставляет основные возможности для создания своей собственной социальной сети на основе блогов. Хорошим примером такой сети служит довольно популярные сайт <a href="http://habrahabr.ru" rel="nofollow">Хабрахабр</a>.</p>
<p>Что необходимо на хостинге для установки LiveStreet:</p>
<ul>
<li>PHP5 и расширение mbstring для корректной работы с кодировкой UTF-8</li>
<li>Базы данных MySQL5 с типом таблиц InnoDB (хотя будет работать и на MyISAM)</li>
<li>Веб-сервер Apache с модулем mod_rewrite</li>
</ul>
<blockquote><p>Большинство хостингов удовлетворяют этим требованиям.</p></blockquote>
<p>Процесс установки:</p>
<ul>
<li>Скачать архив со страницы http://livestreet.ru/page/download/</li>
<li>Разархивировать в нужный каталог вашего сайта</li>
<li>Выполнить SQL дамп (sql.sql), предварительно создав базу данных</li>
<li>Настроить коннект к БД (config/config.db.php)</li>
<li>Настроить параметры движка (config/config.php)</li>
<li>Дать права 777 каталогам: logs, uploads, templates\compiled, templates\cache и каталогу для хранения временных файлов (/tmp/)</li>
</ul>
<p>Готово! По умолчанию в системе создается администратор admin с паролем admin.</p>
<p>Ответы на большинство вопросов по использованию движка <strong>LiveStreet</strong> можно найт ина сайте проекта <strong><a href="http://livestreet.ru">http://livestreet.ru</a></strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/72.html/feed</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
		<item>
		<title>Как работать с JSON?</title>
		<link>http://www.linkexchanger.su/2008/41.html</link>
		<comments>http://www.linkexchanger.su/2008/41.html#comments</comments>
		<pubDate>Mon, 03 Mar 2008 05:50:06 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[json]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/41.html</guid>
		<description><![CDATA[Вероятно Вы уже прочитали статью &#171;Что такое JSON?&#171;. Если нет, то я рекомендую сначала ознакомиться именно с ней, чтобы понять все с самого начала. А здесь мы поговорим о преобразованиях объектов JavaScript в формат JSON и обратных преобразованиях строки ответа от сервера в формате JSON в объект JavaScript, а также рассмотрим средства для работы с [...]]]></description>
			<content:encoded><![CDATA[<p>Вероятно Вы уже прочитали статью &laquo;<a href="http://www.linkexchanger.su/2008/40.html">Что такое JSON?</a>&laquo;. Если нет, то я рекомендую сначала ознакомиться именно с ней, чтобы понять все с самого начала. А здесь мы поговорим о преобразованиях объектов JavaScript в формат <strong>JSON</strong> и обратных преобразованиях строки ответа от сервера в формате <strong>JSON</strong> в объект JavaScript, а также рассмотрим средства для работы с <strong>JSON</strong> на стороне сервера.<span id="more-41"></span></p>
<p>Дуглас Крокфорд (Douglas Crockford), который собственно и предложил <strong>формат JSON</strong> в качестве альтернативы XML при передаче данных от сервера клиенту, в рамках этого проекта разработал специальную утилиту, предназначенную для упомянутых выше преобразований. Исходник можно найти по адресу <a href="http://www.json.org/js.html" target="_blank">http://www.json.org/js.html.</a></p>
<p>В предыдущей статье о <strong>JSON</strong> мы уже немного коснулись преобразования строки данных в объект JavaScript с помощью функции <strong>eval()</strong>, но все-таки нельзя забывать о том, что функция эта не только поможет интерпретировать данные в формат JSON, но и выполнит любой JavaScript-код, который будет ей передан. Так как это обстоятельство может представлять собой потенциальную угрозу, логичнее воспользоваться утилитой Дугласа Крокфорда.</p>
<p>Но давайте обо всем по порядку. Для начала подключим утилиту к нужному файлу:</p>
<pre class="brush: jscript;">&lt;script src=&quot;json.js&quot; type=&quot;text/javascript&quot;&gt;&lt;/script&gt;</pre>
<p>Создадим объект <strong>oAuto</strong> обычным способом, забыв о литеральной нотации.</p>
<pre class="brush: jscript;">var oAuto = new Object();
oAuto.firm = &quot;Audi&quot;;
oAuto.model = &quot;A6&quot;;
oAuto.year = 2008;
oAuto.price = 78000;
oAuto.sellers = new Array(
  &quot;Фирма А&quot;,
  &quot;Фирма Б&quot;,
  &quot;Фирма В&quot;
);</pre>
<p>Передадим объект методу <strong>JSON.stringify()</strong></p>
<pre class="brush: jscript;">document.write(JSON.stringify(oAuto));</pre>
<p>и в результате работы этого небольшого кусочка кода будет выведена <strong>строка в формате JSON</strong>, которую можно передавать по любому адресу.</p>
<pre class="brush: jscript;">{&quot;firm&quot;:&quot;Audi&quot;,&quot;model&quot;:&quot;A6&quot;,&quot;year&quot;:2008,
&quot;price&quot;:78000,&quot;sellers&quot;:[&quot;Фирма А&quot;,&quot;Фирма Б&quot;,&quot;Фирма В&quot;]}</pre>
<p>Предположим теперь, что эту самую строку мы получили в качестве ответа от сервера и ее надо преобразовать в объект JavaScript. Так нет ничего проще. Передаем строку методу <strong>JSON.parse()</strong></p>
<pre class="brush: jscript;">var oAuto = JSON.parse(sAuto);</pre>
<p>и получаем объект JavaScript.</p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_json/json.zip">исходный код</a> примера, и испытать его на своем сайте.</p></blockquote>
<p>Необходимо упомянуть также, что метод <strong>JSON.parse()</strong> может принимать опционально еще один параметр.</p>
<pre class="brush: jscript;">var myObject = JSON.parse(myJSONtext, filter);</pre>
<p>Более полную информацию Вы всегда можете найти на сайте <a href="http://www.json.org/json-ru.html">http://www.json.org/</a>.</p>
<p>Мы вкратце познакомились с тем, как можно работать с данными в формате <strong>JSON</strong> на стороне клиента, а как обстоит дело при работе на стороне сервера? Оказывается существует довольно много программного обеспечения для работы с <strong>JSON</strong> в языках на которых пишутся серверные сценарии. <strong>JSON</strong> может применяться в <strong>Pyton</strong>, <strong>C#/.NET</strong>, <strong>PHP</strong>, <strong>ColdFusion</strong>, <strong>Perl</strong>, <strong>Java</strong> и т.д. Полный список можно найти на <a href="http://www.json.org/json-ru.html">http://www.json.org/</a>, а я для примера выбрал <strong>PHP</strong>, как наиболее близкий мне.</p>
<p>Утилита <strong>JSON-PHP</strong> написана Михалем Мигурски (Michal Migurski). Сама утилита &#8211; это один файл JSON.PHP, но для работы с утилитой требуется библиотека <strong>PEAR</strong> (PHP Extension and Application Repository). Скачать утилиту можно отсюда <a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198" target="_blank">http://pear.php.net/pepr/pepr-proposal-show.php?id=198</a>.</p>
<blockquote><p>Если Ваш хостер не удосужился включить библиотеку PEAR &#8211; не расстраивайтесь. Вы вполне можете сделать все самостоятельно. Не обязательно даже иметь права администратора сервера. Я приведу ссылки. Кому очень понадобится &#8211; тот обязательно разберется.<br />
<a href="http://pear.php.net/manual/en/installation.getting.php" target="_blank">http://pear.php.net/manual/en/installation.getting.php</a> &#8211; см. раздел &laquo;PEAR in hosting environments&raquo;.<br />
В принципе нужно только получить инсталляционный файл, загрузить его на свой сервер, вызвать в адресной строке браузера и далее только следовать инструкциям.<br />
А <a href="http://subscribe.ru/archive/inet.webbuild.php5whatsnew/200512/30010819.html" target="_blank">здесь</a> посмотрите раздел &laquo;Динамическая коррекция пути к включаемым файлам&raquo;.</p></blockquote>
<p>Разберем все на примере. Пусть имеем такое определение класса (для PHP5)</p>
<pre class="brush: php;">
class Auto {
  public $firm;
  public $model;
  public $year;
  public $price;
  public $sellers;

  function Auto($firm,$model,$year,$price) {
    $this-&gt;firm = $firm;
    $this-&gt;model = $model;
    $this-&gt;year = $year;
    $this-&gt;price = $price;
    $this-&gt;sellers = array();
  }
}</pre>
<p>Используем этот класс так:</p>
<pre class="brush: php;">
$oAuto = new Auto(&quot;Audi&quot;, &quot;A6&quot;, 2008, 78000);
$oAuto-&gt;sellers[0] = &quot;Фирма А&quot;;
$oAuto-&gt;sellers[1] = &quot;Фирма Б&quot;;
$oAuto-&gt;sellers[2] = &quot;Фирма В&quot;;
</pre>
<p>Теперь то, что нас интересует больше всего. Подключаем утилиту <strong>JSON-PHP</strong>, создаем новый экземпляр объекта <strong>Services_JSON</strong> и передаем объект <strong>$oAuto</strong> методу <strong>encode()</strong>:</p>
<pre class="brush: php;">require_once(&quot;JSON.php&quot;);
$json = new Services_JSON();
$sJSONText = $json-&gt;encode($oAuto);</pre>
<p>В результате переменная <strong>$sJSONText</strong> будет содержать строку в формате <strong>JSON</strong>:</p>
<pre class="brush: jscript;">{&quot;firm&quot;:&quot;Audi&quot;,&quot;model&quot;:&quot;A6&quot;,&quot;year&quot;:2008,&quot;price&quot;:78000,
&quot;sellers&quot;:[&quot;\u0424\u0438\u0440\u043c\u0430 \u0410&quot;,&quot;\u0424\u0438\u0440\u043c\u0430 \u0411&quot;,&quot;\u0424\u0438\u0440\u043c\u0430 \u0412&quot;]}</pre>
<blockquote><p>Здесь хочу обратить Ваше внимание на то, что утилита <strong>JSON-PHP</strong> понимает строки или в <strong>ASCII</strong>, или в <strong>UTF-8</strong>. Поэтому существенный выигрыш можно получить при использовании латинских символов, тогда как использование кириллицы в кодировке windows-1251 может привести к увеличению объема данных. Обратите внимание на то место в строке, где должны передаваться Фирма А, Фирма Б, Фирма В.</p></blockquote>
<p>Но цели мы достигли &#8211; объект <strong>$oAuto</strong> готов к передаче в сценарий на языке JavaScript.</p>
<p>Разберем обратную операцию &#8211; преобразование строки текста в формате <strong>JSON</strong> в объект <strong>PHP</strong>. Все, что для этого нужно сделать, это передать строку методу <strong>decode()</strong>:</p>
<pre class="brush: php;">$value = $json-&gt;decode($sJSONText);</pre>
<p>Если теперь использовать например <strong>print_r()</strong>, то мы сможем убедиться, что объект был создан:</p>
<pre class="brush: php;">
( [firm] =&gt; Audi [model] =&gt; A6
[year] =&gt; 2008 [price] =&gt; 78000
[sellers] =&gt; Array ( [0] =&gt; Фирма А [1] =&gt; Фирма Б [2] =&gt; Фирма В ) )</pre>
<p>Все это есть в примере, который Вы сможете скачать. Пример включает и утилиту <strong>JSON-PHP</strong>. Естественно, Вам придется немного поправить пример в той части, где корректируются пути к библиотеке <strong>PEAR</strong>, либо удалить этот фрагмент кода, если библиотека у Вас уже подключена.</p>
<blockquote><p>Архив с примером можно <a href="http://www.linkexchanger.su/example_json/json2.zip">скачать</a> здесь.</p></blockquote>
<p>Что можно еще сказать? Разве что упомянуть о том, что утилита <strong>JSON-PHP</strong> не единственная для работы с <strong>JSON</strong> на стороне сервера. Существует расширение PHP &#8211; <strong>php-json</strong> (написано на C Омаром Килани (Omar Kilani)), однако для его установки потребуется умение устанавливать модули расширения PHP. Вот и все, пожалуй.</p>
<p>Буду рад, если найдете время для того, чтобы оставить свои отзывы&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/41.html/feed</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
		<item>
		<title>jQuery Autocomplete: автозаполнение</title>
		<link>http://www.linkexchanger.su/2008/39.html</link>
		<comments>http://www.linkexchanger.su/2008/39.html#comments</comments>
		<pubDate>Mon, 25 Feb 2008 21:02:05 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[suggest]]></category>
		<category><![CDATA[автозаполнение]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/39.html</guid>
		<description><![CDATA[Если Вы пробовали что-то найти в Google, то наверняка знаете, что после ввода символа в текстовое поле появляется выпадающий список, который содержит десяток строк со словами, начальные символы которых совпадают с теми символами, что Вы уже успели ввести. Так работает Google Suggest. Почему бы не сделать так же на своем сайте? Ведь это удобно. К [...]]]></description>
			<content:encoded><![CDATA[<p>Если Вы пробовали что-то найти в <a href="http://www.google.ru/">Google</a>, то наверняка знаете, что после ввода символа в текстовое поле появляется выпадающий список, который содержит десяток строк со словами, начальные символы которых совпадают с теми символами, что Вы уже успели ввести. Так работает Google Suggest. Почему бы не сделать так же на своем сайте? Ведь это удобно. К тому же с библиотекой jQuery это не так уж и сложно&#8230;<span id="more-39"></span></p>
<p>Как обычно, для начала я приведу пример, а потом мы будем разбирать, как он работает.</p>
<blockquote><p>Поскольку это всего лишь пример, поясню, что в левом текстовом поле доступен выбор российских городов, которые начинаются на букву &laquo;М&raquo;, а в правом &#8211; список поселков городского типа (пгт) с численностью населения более 10 тыс. жителей (по данным Всероссийской переписи населения на 9 октября 2002 года).</p></blockquote>
<p>Кроме того, используются разные настройки. В общем, попробуйте пример, а потом продолжим&#8230;.<br />
<iframe src="http://www.linkexchanger.su/example_jquery/autocomplete.html" style="border: medium none " height="230" width="420"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery/autocomplete.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>Сначала потребуется только подключить библиотеку <a href="http://jquery.com/">jQuery</a> и файл <a href="http://www.linkexchanger.su/example_jquery/js/jquery.autocomplete.js">query.autocomplete.js</a> в разделе <strong>HEAD</strong> нужной страницы.</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.1.js&quot;&gt;&lt;/script&gt;
&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery.autocomplete.js&quot;&gt;&lt;/script&gt;</pre>
<p>Если скачаете пример, то легко сможете разобраться и в стилевом оформлении. Учтите, что файл <strong>jquery.autocomplete.js</strong> использует имена классов (начинаются с ac_), но если Вы захотите по каким-то причинам изменить эти имена &#8211; это тоже можно будет довольно легко сделать.</p>
<p>Что касается HTML-кода, то естественно нужно описать поле для ввода текста:</p>
<pre class="brush: xml;">&lt;input id=&quot;example&quot; type=&quot;text&quot; /&gt;</pre>
<p>А вот использовать <strong>jquery.autocomplete.js</strong> можно двумя разными способами.</p>
<p><strong>Способ первый:</strong><br />
Если объем данных не очень большой, и данные не будут изменяться, то их можно поместить непосредственно на странице, как и сделано в примере в текстовом поле слева.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#example&quot;).autocompleteArray([
    &quot;Магадан&quot;,
    &quot;Магас&quot;,
    &quot;Магнитогорск&quot;,
    &quot;Майкоп&quot;,
    ........
    &quot;Муром&quot;,
    &quot;Мценск&quot;,
    &quot;Мыски&quot;,
    &quot;Мытищи&quot;,
    &quot;Мышкин&quot;
    ],
    {
    delay:10,
    minChars:1,
    matchSubset:1,
    autoFill:true,
    maxItemsToShow:10
    }
  );
});
&lt;/script&gt;</pre>
<p><strong>Способ второй:</strong><br />
Если данные большого объема, и/или часто изменяются, то необходимо предусмотреть обработку этих данных на сервере (для примера выбран PHP). <strong>jquery.autocomplete.js</strong> предусматривает отправку GET-запроса с параметром <strong>q</strong>, значением которого являются введенные символы. Именно так в примере работает текстовое поле справа.</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#example2&quot;).autocomplete(&quot;autocomplete.php&quot;, {
    delay:10,
    minChars:2,
    matchSubset:1,
    autoFill:true,
    matchContains:1,
    cacheLength:10,
    selectFirst:true,
    formatItem:liFormat,
    maxItemsToShow:10,
    onItemSelect:selectItem
  });
});
&lt;/script&gt;</pre>
<p>В этих примерах, помимо данных (в первом случае) и URL обработчика (во втором случае) мы передаем некоторые опции. Список опций приведен ниже:</p>
<p><strong>autoFill</strong> &#8211; когда Вы начинаете вводить текст, в поле ввода будет подставлено (и выделено) первое подходящее значение из списка. Если Вы продолжаете вводить текст, в поле ввода и далее будет подставляться подходящее значение, но уже с учетом введенного Вами текста. (По умолчанию: false).</p>
<p><strong>inputClass</strong> &#8211; этот класс будет добавлен к элементу ввода. (По умолчанию: &laquo;ac_input&raquo;).</p>
<p><strong>resultsClass</strong> &#8211; класс для UL, который будет содержать элементы результата (элементы LI). (По умолчанию: &laquo;ac_results&raquo;).</p>
<p><strong>loadingClass</strong> &#8211; класс для элемента ввода, в то время, когда происходит обработка данных на сервере. (По умолчанию: &laquo;ac_loading&raquo;).</p>
<p><strong>lineSeparator</strong> &#8211; символ, который разделяет строки в данных, возвращаемых сервером. (По умолчанию: &laquo;\n&raquo;).</p>
<p><strong>cellSeparator</strong> &#8211; символ, который разделяет &laquo;ячейки&raquo; в строках данных, возвращаемых сервером. (По умолчанию: &laquo;|&raquo;).</p>
<p><strong>minChars</strong> &#8211; минимальное число символов, которое пользователь должен напечатать перед тем, как будет активизирван запрос. (По умолчанию: 1).</p>
<p><strong>delay</strong> &#8211; задержка в миллисекундах. Если в течение этого времени пользователь не нажимал клавиши, активизируется запрос. Если используется локальный запрос (к данным, находящимся непосредственно в файле), задержку можно сильно уменьшить. Например до 40ms. (По умолчанию: 400).</p>
<p><strong>cacheLength</strong> &#8211; число ответов от сервера, сохраняемых в кэше. Если установлено в 1 &#8211; кэширование данных отключено. Никогда не устанавливайте меньше единицы. (По умолчанию: 1).</p>
<p><strong>matchSubset</strong> &#8211; использовать ли кэш для уточнения запросов. Использование этой опции может сильно снизить нагрузку на сервер и увеличить производительность. Не забудьте при этом еще и установить для <strong>cacheLength</strong> значение побольше. Например 10. (По умолчанию: 1).</p>
<p><strong>matchCase</strong> &#8211; использовать ли сравнение чувствительное к регистру символов (только если Вы используете кэширование). (По умолчанию: 0).</p>
<p><strong>maxItemsToShow</strong> &#8211; ограничивает число результатов, которые будут показаны в выпадающем списке. Если набор данных содержит сотни элементов, может быть неудобно показывать весь список пользователю. Рекомендованное значение 10. (По умолчанию: -1).</p>
<p><strong>extraParams</strong> &#8211; дополнительные параметры, которые могут быть переданы на сервер. Если Вы напишете {page:4}, то строка запроса к обработчику на сервере будет сформирована следующим образом: my_handler.php?q=foo&amp;page=4 (По умолчанию: {}).</p>
<p><strong>width</strong> &#8211; устанавливает ширину выпадающего списка. По умолчанию ширина выпадающего списка определена шириной элемента ввода. Однако, если ширина элемента ввода небольшая, а строки выпадающего списка содержат большое количество символов &#8211; эта опция вполне может пригодиться. (По умолчанию: 0).</p>
<p><strong>selectFirst</strong> &#8211; если установить в <strong>true</strong>, то по нажатию клавиши Tab или Enter будет выбрано то значение, которое в данный момент установлено в элементе ввода. Если же имеется выбранный вручную (&laquo;подсвеченный&raquo;) результат из выпадающего списка, то будет выбран именно он. (По умолчанию: false).</p>
<p><strong>selectOnly</strong> &#8211; если установить в <strong>true</strong> и в выпадающем списке только одно значение, оно будет выбрано по нажатию клавиши Tab или Enter, даже если этот пункт не был выбран пользователем с помощью клавиатуры или указателя мыши. Заметьте, что эта опция отменяет действие опции <strong>selectFirst</strong>. (По умолчанию: false).</p>
<p><strong>formatItem</strong> &#8211; JavaScript функция, которая поможет обеспечить дополнительную разметку элементов выпадающего списка. Функция будет вызываться для каждого элемента<strong> LI</strong>. Возвращаемые от сервера данные могут быть отображены в элементах <strong>LI</strong> выпадающего списка (см. второй пример). Принимает три параметра: строка результата, позиция строки в списке результатов, общее число элементов в списке результатов. (По умолчанию: none).</p>
<p><strong>onItemSelect</strong> &#8211; JavaScript функция, которая будет вызвана, когда элемент списка выбран. Принимает единственный параметр &#8211; выбранный элемент <strong>LI</strong>. Выбранный элемент будет иметь дополнительный атрибут &laquo;extra&raquo;, значением которого будет являться массив всех ячеек строки, которая была получена в качестве ответа от сервера. (По умолчанию: none).</p>
<p>Последние две опции весьма важны, если Вы хотите сделать действительно удобный и полезный элемент интерфейса, поэтому приведу примеры.</p>
<pre class="brush: jscript;">function liFormat (row, i, num) {
  var result = row[0] + &quot;&lt;em class=&quot;qnt&quot;&gt;&quot; +
  row[1] + &quot; тыс.чел.&lt;/em&gt;&quot;;
  return result;
}</pre>
<p>В опции <strong>formatItem</strong> мы определили имя вызываемой функции &#8211; <strong>liFormat</strong>, а сама функция просто формирует строку, которая будет вставлена в соответствующий элемент <strong>LI</strong>. Строка содержит название поселка и элемент <strong>em</strong>, в который выводится количество проживающих там, в тысячах человек. Элемент <strong>em</strong> имеет класс <strong>qnt</strong>, с помощью которого, используя <strong>CSS</strong>, мы сдвигаем этот элемент вправо, немного уменьшаем размер шрифта и делаем сам шрифт зеленого цвета.</p>
<p>Следующий пример для опции <strong>onItemSelect</strong>:</p>
<pre class="brush: jscript;">function selectItem(li) {
  if( li == null ) var sValue = &quot;Ничего не выбрано!&quot;;
  if( !!li.extra ) var sValue = li.extra[2];
  else var sValue = li.selectValue;
  alert(&quot;Выбрана запись с ID: &quot; + sValue);
}</pre>
<p>Здесь видно как можно работать со значениями атрибута <strong>&laquo;extra&raquo;</strong> выбранного элемента <strong>LI</strong>. В примере мы выводим в <strong>alert</strong> значение идентификатора для записи из нашей тестовой базы.</p>
<p>Нам осталось только разобрать те действия, которые будут выполняться на стороне сервера. Как Вы наверное помните, мы выбрали для этого <strong>PHP</strong>. Вспомним также, что на сервер передается <strong>GET-запрос</strong> с параметром <strong>q</strong>, содержащим уже введенные пользователем символы. Сам код Вы сможете посмотреть, скачав файл примера.</p>
<p>Весь код мы будем выполнять только в случае существования <strong>XMLHttpRequest</strong>,  только если передан GET-запрос с параметром <strong>q</strong>. Для примера используется текстовый файл, в котором содержится база данных. Вот фрагмент этого файла:</p>
<pre class="brush: xml;">1:Пашковский:Краснодарский край:43,0
2:Горячеводский:Ставропольский край:34,4
3:Калинино:Краснодарский край:34,1
4:Приволжский:Саратовская область:32,0
. . . . . . . . . . . . . . . . . . .
268:Залари:Иркутская область:10,0
269:Октябрьский:Пермский край:10,0
270:Ишеевка:Ульяновская область:10,0
271:Жешарт:Республика Коми:10,0
272:Прохоровка:Белгородская область:10,0</pre>
<p>Мы читаем этот файл в массив, а затем в цикле перебираем все строки, в свою очередь разбивая каждую из них в массив, к элементу под номером один (название поселка) которого обращаемся для поиска соответствия с переданным GET-запросом. Если соответствие будет найдена выводим информацию, правда в несколько ином порядке, чем она хранилась в файле.</p>
<blockquote><p>Такой подход выбран во-первых, потому что это пример, который должен быть очень просто воспроизведен на любом другом сайте, и во-вторых, чтобы при очень небольшом объеме данных дать почувствовать тот момент, когда запрос выполняется.</p></blockquote>
<p>Вот собственно и все, обращу разве Ваше внимание на то, что для работы со строками использую <a href="http://ru2.php.net/manual/ru/ref.mb-string.php">мультибайтовые строковые функции</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/39.html/feed</wfw:commentRss>
		<slash:comments>99</slash:comments>
		</item>
		<item>
		<title>jQuery и Ajax: события</title>
		<link>http://www.linkexchanger.su/2008/35.html</link>
		<comments>http://www.linkexchanger.su/2008/35.html#comments</comments>
		<pubDate>Thu, 14 Feb 2008 05:51:07 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[ajax]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[jQuery документация]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/2008/35.html</guid>
		<description><![CDATA[В предыдущей статье мы немного познакомились с запросами Ajax, которые позволяет выполнять библиотека jQuery. Теперь рассмотрим события Ajax и примеры обработки этих событий&#8230;
ajaxComplete( callback ) &#8211; прикрепляет функцию, которая выполняется всякий раз, когда выполненajax-запрос. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.
Пример: показываем сообщение, когда AJAX запрос выполнен.
$(&#34;#msg&#34;).ajaxComplete(function(request, settings){
  [...]]]></description>
			<content:encoded><![CDATA[<p>В предыдущей статье мы немного познакомились с запросами Ajax, которые позволяет выполнять библиотека jQuery. Теперь рассмотрим события Ajax и примеры обработки этих событий&#8230;<span id="more-35"></span></p>
<p><strong>ajaxComplete( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда выполненajax-запрос. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.<br />
<strong>Пример:</strong> показываем сообщение, когда AJAX запрос выполнен.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxComplete(function(request, settings){
   $(this).append(&quot;&lt;span&gt;Request Complete.&lt;/span&gt;&quot;);
});</pre>
<p><strong>ajaxError( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда какой-либо ajax-запрос неудачен. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе. Третий параметр передается, если при обработке запроса произошла ошибка и эта ошибка определена.<br />
<strong>Пример:</strong> показываем сообщение, когда AJAX запрос неудачен.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxError(function(event, request, settings){
   $(this).append(&quot;&lt;span&gt;Error requesting page &quot;
   + settings.url
   + &quot;&lt;/span&gt;&quot;);
});</pre>
<p><strong>ajaxSend( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда какой-либо ajax-запрос отправлен. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.<br />
<strong>Пример:</strong> показываем сообщение, когда AJAX запрос отправлен.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxSend(function(evt, request, settings){
   $(this).append(&quot;&lt;span&gt;Starting request at &quot;
   + settings.url
   + &quot;&lt;/span&gt;&quot;);
});</pre>
<p><strong>ajaxStart( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда ajax-запрос начат (и нет выполняющихся запросов).<br />
<strong>Пример:</strong> показываем сообщение о загрузке.</p>
<pre class="brush: jscript;">$(&quot;#loading&quot;).ajaxStart(function(){
   $(this).show();
});</pre>
<p><strong>ajaxStop( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда ajax-запросы закончены.<br />
<strong>Пример:</strong> скрываем сообщение о загрузке после того, как все AJAX-запросы окончены.</p>
<pre class="brush: jscript;">$(&quot;#loading&quot;).ajaxStop(function(){
   $(this).hide();
});</pre>
<p><strong>ajaxSuccess( callback )</strong> &#8211; прикрепляет функцию, которая выполняется всякий раз, когда ajax-запрос выполнен успешно. Функция принимает в качестве аргументов объект XMLHttpRequest и установки, используемые в этом запросе.<br />
<strong>Пример:</strong> показываем сообщени, когда AJAX-запрос выполнен успешно.</p>
<pre class="brush: jscript;">$(&quot;#msg&quot;).ajaxSuccess(function(evt, request, settings){
   $(this).append(&quot;&lt;span&gt;Successful Request!&lt;/span&gt;&quot;);
});</pre>
<p>Чтобы все это было немного понятнее, придумаем, напишем и испытаем какой-нибудь вполне реальный пример, в котором используем некоторые из перечисленных выше событий. Вот сам пример:<br />
<iframe src="http://www.linkexchanger.su/example_jquery_ajax/events.html" style="border: medium none " height="20" width="420"></iframe></p>
<blockquote><p>Вы можете скачать <a href="http://www.linkexchanger.su/example_jquery_ajax/events.zip">исходный код</a> примера, и при наличии библиотеки jQuery воспроизвести это пример на своем сайте.</p></blockquote>
<p>Итак создадим два файла: <strong>events.html</strong> &#8211; где будут размещен элемент (например обычная ссылка), щелчок мышью на которой будет инициировать <strong>ajax запрос</strong>, и файл <strong>events.php</strong> &#8211; обработчик ajax-запросов.<br />
Понятно, что в раздел <strong>HEAD</strong> файла events.html необходимо подключить библиотеку jQuery.</p>
<pre class="brush: xml;">&lt;script type=&quot;text/javascript&quot; src=&quot;js/jquery-1.2.1.js&quot;&gt;&lt;/script&gt;</pre>
<p>Затем простенький HTML-код:</p>
<pre class="brush: xml;">
&lt;ul&gt;
  &lt;li&gt;
    &lt;a href=&quot;http://www.linkexchanger.su/wp-admin/#&quot; id=&quot;a1&quot;&gt;Выполнить Ajax-запрос&lt;/a&gt;
    &lt;span id=&quot;loading&quot;&gt;Выполняется Ajax-запрос...&lt;/span&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;span id=&quot;message&quot;&gt;Ajax-запрос выполнен.&lt;/span&gt;
  &lt;/li&gt;
&lt;/ul&gt;
</pre>
<p>кусочек из таблицы стилей:</p>
<pre class="brush: css;">
#loading {
  display:none;
  padding-left:10px;
}
#message {
  display:none;
  padding-left:10px;
}</pre>
<p>и полностью javascript-код:</p>
<pre class="brush: jscript;">&lt;script type=&quot;text/javascript&quot;&gt;
$(document).ready(function(){
  $(&quot;#a1&quot;).click(
    function () {
      $.ajax({
        type: &quot;POST&quot;,
        data: &quot;n=3&quot;,
        url: &quot;events.php&quot;
      });
    });  

  $(&quot;#loading&quot;).ajaxStart(function(){
   $(this).show();
   $(&quot;#message&quot;).hide();
  });
  $(&quot;#loading&quot;).ajaxStop(function(){
   $(this).hide();
  });
  $(&quot;#message&quot;).ajaxComplete(function(){
   $(this).show();
 });  

});
&lt;/script&gt;</pre>
<p>Теперь давайте все это попробуем разобрать по шагам и отталкиваться будем от javascript-кода.<br />
По клику на элементе а с идентификатором <strong>а1</strong> будет выполнен <strong>ajax-запрос</strong> к файлу <strong>events.php</strong> (его код чуть позже). Тип запроса мы определим как <strong>POST</strong> и в качестве данных передадим некий параметр <strong>n=3</strong>.<br />
Затем займемся &laquo;развешиванием&raquo; событий на HTML-элементы. По событию <strong>ajaxStart</strong> будет показан элемент с идентификатором <strong>#loading</strong>, изначально скрытый с помощью CSS. Элемент <strong>#message</strong> по этому же событию будет скрыт (он скрыт и изначально, но мы делаем это для того, чтобы скрыть его, если раньше выполнялись запросы и этот элемент был показан). Далее, по событию <strong>ajaxStop</strong> надо будет скрыть элемент <strong>#loading</strong>, а по событию <strong>ajaxComplete</strong> показать элемент <strong>#message</strong>.</p>
<p>А теперь приведу код <strong>обработчика ajax-запроса</strong> &#8211; файл <strong>events.php</strong></p>
<pre class="brush: php;">
&lt;?php
if($_SERVER['HTTP_X_REQUESTED_WITH']=='XMLHttpRequest') {
  if ($_POST) {
  	for($i=0;$i&lt;count($_POST['n']);$i++) sleep(1);
  } else {
  	echo &quot;Не передан параметр!&quot;;
  }
}
?&gt;</pre>
<p>Для начала мы проверяем существование объекта <strong>XMLHttpRequest</strong> и выполняем код только в том случае, если он существует. Сам по себе этот код только прогоняет цикл из 3 итераций, каждый раз &laquo;засыпая&raquo; на секунду (эта задержка сделана для того, чтобы сам процесс запроса можно было &laquo;почувствовать&raquo;).</p>
<p>Пример получился, естественно простейший, без дальнейшей обработки возвращаемых сервером данных, но его целью было только продемонстрировать работу с <strong>событиями Ajax</strong>, а для более реальных примеров еще будет время&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/35.html/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>PHP: запись информации в текстовый файл</title>
		<link>http://www.linkexchanger.su/2008/10.html</link>
		<comments>http://www.linkexchanger.su/2008/10.html#comments</comments>
		<pubDate>Sun, 13 Jan 2008 20:00:10 +0000</pubDate>
		<dc:creator>Gennady</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[запись]]></category>
		<category><![CDATA[скрипт]]></category>
		<category><![CDATA[файл]]></category>

		<guid isPermaLink="false">http://www.linkexchanger.su/10</guid>
		<description><![CDATA[Чтение и запись в текстовый файл казалось бы простейшая операция. Блокировал, открыл, записал, закрыл, снял блокировку с файла. Однако просто это только на первый взгляд&#8230;.
Давайте подумаем, что произойдет, если к одному и тому же файлу одновременно обратятся несколько процессов, с целью записать туда какую-либо информацию? Могу сразу ответить: часть, либо вся информация, хранящаяся в файле [...]]]></description>
			<content:encoded><![CDATA[<p>Чтение и запись в текстовый файл казалось бы простейшая операция. Блокировал, открыл, записал, закрыл, снял блокировку с файла. Однако просто это только на первый взгляд&#8230;.</p>
<p>Давайте подумаем, что произойдет, если к одному и тому же файлу одновременно обратятся несколько процессов, с целью записать туда какую-либо информацию? Могу сразу ответить: часть, либо вся информация, хранящаяся в файле будет безвозвратно потеряна. И просто блокировкой файла здесь не обойтись.<span id="more-10"></span></p>
<p>Такая задача встала передо мной при написании скрипта каталога для обмена ссылками <a href="http://www.linkexchanger.ru" target="_blank">LinkExchanger</a>. Информация там должна была храниться именно в файлах. В итоге получилась вот такая функция, код которой приведен ниже&#8230;</p>
<pre class="brush: php;">
function WriteToFile ($path_to_file,$data) {
	$lock = fopen(PATH_BLOCKFILE,&quot;a&quot;);
	if(flock($lock, LOCK_EX)) {
		$tmp=fopen(PATH_TEMPFILE,&quot;w&quot;);
		for($i=0;$i&lt;count($data);$i++) {
			fputs($tmp, &quot;$data[$i]\n&quot;);
		}
		fclose($tmp);
		unlink(&quot;$path_to_file&quot;);
		rename(PATH_TEMPFILE, &quot;$path_to_file&quot;);
		flock($lock, LOCK_UN);
		fclose($lock);
	}
}
</pre>
<p>Давайте разберем очень подробно, как это работает.<br />
Функция WriteToFile принимает два аргумента: путь к файлу, в который будет записана информация и собственно информация, представленная в виде массива. Нам понадобятся еще два файла, пути к которым определяются константами PATH_BLOCKFILE и PATH_TEMPFILE. Собственно из названий понятно, что первый &#8211; это некий блокирующий файл, а второй &#8211; файл для временного хранения информации.</p>
<p>Первое, что мы делаем &#8211; открываем на запись блокирующий файл. Далее ставим на него блокировку, и если эта операция прошла успешно, открываем на запись временный файл, в который и пишем нашу информацию.<br />
Закрываем временный файл, удаляем исходный файл и переименовываем временный файл, давая ему имя исходного. Далее снимаем блокировку с блокирующего файла и закрываем его.<br />
Это все. Проверено годами работы в условиях массового использования и на самых различных хостингах.<br />
Единственное, за чем надо следить, чтобы при добавлении информации не было превышено допустимое дисковое пространство.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.linkexchanger.su/2008/10.html/feed</wfw:commentRss>
		<slash:comments>36</slash:comments>
		</item>
	</channel>
</rss>

