<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" version="2.0">

<channel>
	<title>SimpleCoding.org</title>
	
	<link>http://www.simplecoding.org</link>
	<description>Блог о программировании</description>
	<pubDate>Sun, 05 Jul 2009 18:27:56 +0000</pubDate>
	
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/simplecoding" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">simplecoding</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsimplecoding" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsimplecoding" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsimplecoding" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/simplecoding" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsimplecoding" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fsimplecoding" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fsimplecoding" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Fsimplecoding" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pusk.ru/#A:Rfeed=http://feeds.feedburner.com/simplecoding" src="http://blog.pusk.ru/wp-includes/images/rss_icon_neutral.png">Subscribe with pusk.ru</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>JavaScript: полезные события</title>
		<link>http://www.simplecoding.org/javascript-poleznye-sobytiya.html</link>
		<comments>http://www.simplecoding.org/javascript-poleznye-sobytiya.html#comments</comments>
		<pubDate>Sun, 05 Jul 2009 18:27:56 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=862</guid>
		<description><![CDATA[ 
Недавно мне нужно было написать обычный счетчик символов в текстовой области (textarea). Задача тривиальная, но меня заинтересовал один нюанс.
Вопрос в том, какое событие обрабатывать?
Пользователь может вводить текст как угодно, с помощью клавиатуры, вставлять из буфера обмена.
Если ввод происходит с помощью клавиатуры или из буфера комбинацией клавиш Ctrl+V, то можно обрабатывать событие onKeyup. Но если [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_863" class="wp-caption alignnone" style="width: 300px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/06/input_event.png" alt="input event" title="input event" width="290" height="121" class="size-full wp-image-863" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Недавно мне нужно было написать обычный <strong>счетчик символов в текстовой области</strong> (textarea). Задача тривиальная, но меня заинтересовал один нюанс.</p>
<p>Вопрос в том, <strong>какое событие обрабатывать?</strong></p>
<p>Пользователь может вводить текст как угодно, с помощью клавиатуры, вставлять из буфера обмена.<br />
Если ввод происходит с помощью клавиатуры или из буфера комбинацией клавиш <strong>Ctrl+V</strong>, то можно обрабатывать событие <strong>onKeyup</strong>. Но если текст вставлен с помощью контекстного меню, то <strong>onKeyup</strong> не работает (действительно, ведь клавиатуру мы не трогаем). Точно также не имеет смысла обрабатывать события мыши. Ведь клик выполняется по контекстному меню, а обработчик мы назначаем для <strong>textarea</strong>.</p>
<p>Событие <strong>onChange</strong> тоже не подходит, т.к. оно появляется после того как textarea теряет фокус.</p>
<p>В результате получается, что отследить вставку данных через контекстное меню с помощью этих событий не получится.</p>
<p>Но я решил поискать. И прежде всего, отправился поэкспериментировать с формой <strong>twitter</strong>’а. Первый же эксперимент дал положительный результат. Вставка через контекстное меню изменила значение счетчика.</p>
<p>Сначала я подумал, что они решают задачу с помощью таймера и проверок длины поля через заданный интервал времени. Но потом я заметил, что эта функция работает только в FireFox и не работает в IE.</p>
<p><strong>А чем отличается Firefox от IE?</strong> Конечно, поддержкой новых стандартов!</p>
<p>После этого я быстро нашел нужное событие. Оно называется <strong>input</strong> и определено в спецификации <a href="http://www.w3.org/TR/DOM-Level-3-LS/load-save.html#LS-LSLoadEvent-input">DOM Level 3 Load And Save</a>.<br />
Это событие возникает сразу после ввода любых символов в поле не зависимо от способа ввода.</p>
<p>Чтобы не оставаться голословным я привожу страницу, с которой экспериментировал.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0"> &nbsp; &nbsp; &nbsp; &nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;html</span> <span class="re0">xmlns</span>=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> <span class="re0">xml:lang</span>=<span class="st0">&quot;en&quot;</span> <span class="re0">lang</span>=<span class="st0">&quot;en&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;head<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;title<span class="re2">&gt;</span></span></span>textArea<span class="sc3"><span class="re1">&lt;/title<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;meta</span> <span class="re0">http-equiv</span>=<span class="st0">&quot;content-type&quot;</span> <span class="re0">content</span>=<span class="st0">&quot;text/html;charset=utf-8&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;meta</span> <span class="re0">http-equiv</span>=<span class="st0">&quot;Content-Style-Type&quot;</span> <span class="re0">content</span>=<span class="st0">&quot;text/css&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/head<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;body<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;div<span class="re2">&gt;</span></span></span><span class="sc3"><span class="re1">&lt;textarea</span> <span class="re0">id</span>=<span class="st0">&quot;messageText&quot;</span> <span class="re0">cols</span>=<span class="st0">&quot;45&quot;</span> <span class="re0">rows</span>=<span class="st0">&quot;15&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/textarea<span class="re2">&gt;</span></span></span><span class="sc3"><span class="re1">&lt;/div<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;div<span class="re2">&gt;</span></span></span>Количество символов: <span class="sc3"><span class="re1">&lt;span</span> <span class="re0">id</span>=<span class="st0">&quot;symbolsCounter&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/span<span class="re2">&gt;</span></span></span><span class="sc3"><span class="re1">&lt;/div<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="sc3"><span class="re1">&lt;script</span> <span class="re0">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="re0">src</span>=<span class="st0">&quot;jquery-1.3.1.min.js&quot;</span><span class="re2">&gt;</span></span><span class="sc3"><span class="re1">&lt;/script<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;script</span> <span class="re0">type</span>=<span class="st0">&quot;text/javascript&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">$(function() {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; var ta = $(&quot;#messageText&quot;);</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; var counter = $(&quot;#symbolsCounter&quot;);</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; counter.html(ta.val().length);</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; if ($.browser.mozilla <span class="sc1">&amp;&amp; $.browser.version.substr(0,3)==&quot;1.9&quot;) {</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc1"> &nbsp; &nbsp; &nbsp; &nbsp;ta.bind(&quot;input&quot;, function() {</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc1"> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;updateCounter();</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; });</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; }</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; else {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ta.bind(&quot;keyup&quot;, function() {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; updateCounter();</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; });</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; }</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; function updateCounter() {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; counter.html(ta.val().length);</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; var split = ta.val().split(&quot;\n&quot;);</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; if (split.length &gt; 15) {</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ta.attr(&quot;rows&quot;, split.length);</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; }</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; }</div>
</li>
<li class="li1">
<div class="de1">});</div>
</li>
<li class="li2">
<div class="de2"><span class="sc3"><span class="re1">&lt;/script<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/body<span class="re2">&gt;</span></span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;/html<span class="re2">&gt;</span></span></span></div>
</li>
</ol>
</div>
<p>На странице размещены текстовая область (строка 16) и блок для вывода количества символов (строка 18).</p>
<p>Наибольший интерес представляет <strong>JS код</strong>. Посмотрим, как он работает.</p>
<p>Прежде всего, проверяем какой браузер используется. Если это FireFox последних версий, назначаем для текстовой области обработчик события input (строки 26-29), если нет – будем обрабатывать <strong>keyup</strong> (строки 31-34).</p>
<p>При возникновении этих событий вызывается функция <code>updateCounter</code>, в которой мы определяем и показываем количество символов в текстовой области (строка 38).</p>
<p>Остальной код в функции <code>updateCounter</code> испольлзуется для изменения высоты текстовой области, если введенный текст превышает её размер. Алгоритм тут простой.</p>
<p>Разбиваем текст с помощью функции <code>split</code> на лексемы (строка 39), а в качестве разделителя используем символ конца строки. В результате получаем массив с количеством элементов равным количеству строк. Если это количество превысит дефолтное значение (15) – изменяем размер текстовой области (строки 40-42).</p>
<p>Как видите, в новых стандартах есть интересные и, самое главное, полезные нововведения.</p>
<p>Жаль, что разработчики браузеров от них сильно отстают.</p>
<p><strong>Интересно почитать</strong></p>
<p><a href="http://www.smopro.ru">Реклама в блогах</a> от студии SMOpro -<br />
наиболее эффективный способ продвижения вашего ресурса.</p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/HOjuPLbVUvM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/javascript-poleznye-sobytiya.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Phing: backup и сохранение в Subversion базы данных</title>
		<link>http://www.simplecoding.org/phing-backup-i-soxranenie-v-subversion-bazy-dannyx.html</link>
		<comments>http://www.simplecoding.org/phing-backup-i-soxranenie-v-subversion-bazy-dannyx.html#comments</comments>
		<pubDate>Mon, 29 Jun 2009 13:47:29 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Phing]]></category>

		<category><![CDATA[Subversion]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=859</guid>
		<description><![CDATA[ 
В этой заметке я хочу показать несложный пример использования Phing для создания резервных копий базы данных (MySQL) и их отправки в репозиторий Subversion.
Ни для одной из этих операций готовых задач для Phing я не нашел. Но, если подумать, они и не очень нужны. Ведь с помощью Phing можно выполнить любую команду. Т.е. если вы [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_861" class="wp-caption alignnone" style="width: 258px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/06/phing_mysql_subversion.png" alt="phing mysql subversion" title="phing mysql subversion" width="248" height="141" class="size-full wp-image-861" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>В этой заметке я хочу показать несложный пример использования <a href="http://phing.info/trac/">Phing</a> для создания резервных копий базы данных (<strong>MySQL</strong>) и их отправки в репозиторий <strong>Subversion</strong>.</p>
<p>Ни для одной из этих операций готовых задач для <strong>Phing</strong> я не нашел. Но, если подумать, они и не очень нужны. Ведь с помощью Phing можно выполнить любую команду. Т.е. если вы знаете как решить задачу с помощью консоли, значит вы можете автоматизировать решение с помощью Phing.</p>
<p><em>Примечание</em>. Если вы слышите слово Phing впервые, то, думаю, вам будет интересно почитать статью <a href="http://www.simplecoding.org/izbavlyaemsya-ot-rutinnyx-operacij-s-pomoshhyu-phing.html">Программирование на PHP. Избавляемся от рутинных операций с помощью Phing</a>, а может быть и весь раздел <a href="http://www.simplecoding.org/category/phing">Phing</a> этого блога <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Возвращаемся к нашей задаче.</strong></p>
<p>Для создания резервной копии базы можно использовать утилиту <strong>mysqldump</strong>. В её параметрах нужно указать имя пользователя базы, его пароль и название базы. Дополнительно нужно задать имя файла в который мы сохраняем дамп.</p>
<p>Например, так</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">mysqldump -uпользователь -pпароль название_базы &gt; dump.sql</div>
</li>
</ol>
</div>
<p>Для сохранения файла в <strong>Subversion</strong> используется команда <strong>commit</strong>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">svn.exe commit -m “db_backup” &#8211;username имя &#8211;password пароль имя_файла</div>
</li>
</ol>
</div>
<p>Здесь мы указываем текст сообщения (после параметра -m), имя пользователя Subversion, его пароль и имя файла, который нужно сохранить.</p>
<p><em>Примечание</em>. Подробнее об этой системе контроля версий можно почитать в разделе <a href="http://www.simplecoding.org/category/sv">Subversion</a>.</p>
<p>Теперь рассмотрим build-файл.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;?xml</span> <span class="re0">version</span>=<span class="st0">&quot;1.0&quot;</span> <span class="re0">encoding</span>=<span class="st0">&quot;UTF-8&quot;</span><span class="re2">?&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3"><span class="re1">&lt;project</span> <span class="re0">name</span>=<span class="st0">&quot;DbBackup&quot;</span> <span class="re0">default</span>=<span class="st0">&quot;commit&quot;</span> <span class="re0">basedir</span>=<span class="st0">&quot;.&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;DUMP_FILE&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;dump.sql&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;MYSQL_PATH&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;путь_к_mysql&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;DB_NAME&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;имя_базы_данных&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;DB_HOST&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;localhost&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;DB_USER&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;имя_пользователя_mysql&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;DB_PASS&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;пароль_mysql&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;SVN_USER&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;имя_пользователя_subversion&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;property</span> <span class="re0">name</span>=<span class="st0">&quot;SVN_PASS&quot;</span> <span class="re0">value</span>=<span class="st0">&quot;пароль_subversion&quot;</span> <span class="re2">/&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;target</span> <span class="re0">name</span>=<span class="st0">&quot;backup&quot;</span><span class="re2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3"><span class="re1">&lt;exec</span> <span class="re0">command</span>=<span class="st0">&quot;${MYSQL_PATH}mysqldump -u${DB_USER} -p${DB_PASS} ${DB_NAME} &gt;</span> ${DUMP_FILE}&quot; dir=&quot;.&quot; /&gt;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3">&lt;/target&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc3">&lt;target name=&quot;</span>commit<span class="st0">&quot; depends=&quot;</span>backup<span class="st0">&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc3">&lt;exec command=&quot;</span>svn.exe commit -m <span class="st0">&quot;db_backup&quot;</span> &#8211;username $<span class="br0">&#123;</span>SVN_USER<span class="br0">&#125;</span> &#8211;password $<span class="br0">&#123;</span>SVN_PASS<span class="br0">&#125;</span> $<span class="br0">&#123;</span>DUMP_FILE<span class="br0">&#125;</span><span class="st0">&quot; dir=&quot;</span>.<span class="st0">&quot; /&gt;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc3">&lt;/target&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc3">&lt;/project&gt;</span></span></div>
</li>
</ol>
</div>
<p>Как видите, большую часть файла занимают свойства (имена, пароли, адрес сервера, размещение mysqldump).</p>
<p>В принципе, их можно было указать прямо в командах, но в большинстве случаев build-файлы гораздо сложнее. И сложно сказать заранее, что какое-то значение будет использован только один раз. Поэтому удобнее задать их один раз в начале файла.</p>
<p>Для выполнение наших команд мы использовали стандартную задачу <strong>exec</strong>. Как несложно догадаться она просто выполняет указанную команду.</p>
<p>Обратите внимание, что внутри команды использовать кавычки нельзя. Их заменяют эскейп последовательностью <code>&quot;</code>.</p>
<p>Думаю, вы догадались, что используя такие build-файлы можно автоматизировать работу с любыми консольными программами.</p>
<p>Конечно, создание самого build-файла отнимает немного времени, но вы быстро его вернете и, кроме того, будете делать меньше ошибок (особенно если нужно выполнять длинные последовательности операций).</p>
<p>И в заключение, небольшой совет. По-умолчанию Phing <strong>не</strong> выводит результат выполнения команды. Т.е. вы не знаете выполнилась на самом деле команда или нет.</p>
<p>Например, если в данном примере написать <code>sbn.exe</code> вместо <code>svn.exe</code> и запустить этот build-файл, то в результате вы увидите обычное сообщение <code>BUILD FINISHED</code>. Естественно, новая версия файла в репозитории сохранена не будет.</p>
<p>Поэтому на этапе тестирования очень полезно запускать phing с параметром -verbose.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">phing -verbose</div>
</li>
</ol>
</div>
<p>В этом случае вы увидите множество интересных сообщений и в том числе</p>
<p>“sbn.exe” не является внутренней или внешней командой …</p>
<p>После того, как вы убедитесь, что всё работает правильно, можно перейти обычный режим.</p>
<p>Время – деньги. Цените его! <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/ZTl3ZAEYy8I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/phing-backup-i-soxranenie-v-subversion-bazy-dannyx.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Откат базы данных и проблема с кодировками</title>
		<link>http://www.simplecoding.org/otkat-bazy-dannyx-i-problema-s-kodirovkami.html</link>
		<comments>http://www.simplecoding.org/otkat-bazy-dannyx-i-problema-s-kodirovkami.html#comments</comments>
		<pubDate>Tue, 23 Jun 2009 09:39:15 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=857</guid>
		<description><![CDATA[ 
Сегодня я хочу рассказать об одних граблях на которые сам недавно наступил.
Даже немного стыдно признаваться, но я столкнулся с проблемой кодировок в базе данных и какое-то время вообще не мог понять, в чём дело.
А ситуация была такая. Я написал статью «jqGrid: редактирование табличных данных с помощью inline редакторов» и сделал демонстрационную страничку.
Для того, чтобы [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_858" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/06/db_restore.png" alt="db_restore" title="db_restore" width="300" height="124" class="size-full wp-image-858" style="float:left; padding: 0 10px 10px 0" /><p class="wp-caption-text"> </p></div>
<p>Сегодня я хочу рассказать об одних граблях на которые сам недавно наступил.</p>
<p>Даже немного стыдно признаваться, но я <strong>столкнулся с проблемой кодировок в базе данных</strong> и какое-то время вообще не мог понять, в чём дело.</p>
<p>А ситуация была такая. Я написал статью «<a href="http://www.simplecoding.org/jqgrid-redaktirovanie-tablichnyx-dannyx-s-pomoshhyu-inline-redaktorov.html">jqGrid: редактирование табличных данных с помощью inline редакторов</a>» и сделал <a href="http://demosites.org.ua/jqgrid/">демонстрационную страничку</a>.</p>
<p>Для того, чтобы таблица не была пустой, я сделал дамп моей локальной базы и через <strong>phpMyAdmin</strong> залил его в базу на сервере.</p>
<p>При этом никаких проблем с кодировками не возникало вообще. Т.е. у меня везде была указана utf-8, она и использовалась.</p>
<p><strong>Тут возникает обычная проблема.</strong></p>
<p>Работать с таблицей может кто угодно, а вручную следить за тем, кто и что написал, у меня нет ни времени, ни желания.</p>
<p>Поэтому я создал задачу для <strong>Cron</strong>, которая периодически выполняет команду</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">mysql &#8211;<span class="re2">user=</span>db_user &#8211;<span class="re2">password=</span>db_pass db_name &lt; /path_to_dump_file/dump.sql</div>
</li>
</ol>
</div>
<p>Т.е. просто <strong>восстанавливает базу из файла с дампом</strong>.</p>
<p>И через некоторое время я замечаю (точнее мне пишут в комментариях, спасибо <strong>Big_Shark</strong>), что часть записей в таблице отображается <strong>кракозябрами</strong>.</p>
<p>Поначалу я подумал, что дело в каком-то бразузере, но оказалось, что и в FireFox, и в Opera, и в Safari, и в IE никаких проблем с кодировками нет.</p>
<p>Да и в любом случае данные на сервер отправляются AJAX запросом, а в них всегда используется <strong>UTF-8</strong>.</p>
<p>Понял в чем дело я только после того как попытался на локальном компьютере восстановить базу из дампа (через командную строку). В общем, mysql нужно явно указывать кодировку.</p>
<p>Для этого в командную строку добавляем параметр <code>--default_character_set=utf8</code></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">mysql <span class="co1">&#8211;user=db_user &#8211;password=db_pass &#8211;default_character_set=utf8 db_name &lt; /path_to_dump_file/dump.sql</span></div>
</li>
</ol>
</div>
<p>На локальном сервере этот параметр решил проблему, но на сервере хостера – нет.</p>
<p>Поэтому в начало дампа базы я добавил запрос</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">SET</span> CHARACTER <span class="kw1">SET</span> utf8;</div>
</li>
</ol>
</div>
<p>И он <strong>полностью решил проблему</strong>.</p>
<p>В общем, мораль у этой истории простая. Как только становишься слишком самоуверенным и перестаешь следить за мелочами, появляются проблемы <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Happy coding!</p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/5NRAC0a6L4w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/otkat-bazy-dannyx-i-problema-s-kodirovkami.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Динамическая загрузка картинок для анонсов с помощью Ajax, jQuery и PHP</title>
		<link>http://www.simplecoding.org/dinamicheskaya-zagruzka-kartinok-dlya-anonsov-s-pomoshhyu-ajax-jquery-i-php.html</link>
		<comments>http://www.simplecoding.org/dinamicheskaya-zagruzka-kartinok-dlya-anonsov-s-pomoshhyu-ajax-jquery-i-php.html#comments</comments>
		<pubDate>Sat, 20 Jun 2009 12:31:18 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=854</guid>
		<description><![CDATA[ 
Идею этого эффекта я нагло стырил позаимствовал на сайте jomsocial. Там есть блоки (под кнопкой Learn More) с анонсами. При наведении мышки на эти блоки к ним добавляется картинка.
Реализовать такой эффект можно разными способами. Например, можно теги картинок вставить прямо в страницу и прятать/показывать их с помощью JavaScript.
Основное достоинство такого варианта – отсутствие задержек [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_855" class="wp-caption alignnone" style="width: 305px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/06/ajax_image_load.jpg" alt="ajax_image_load" title="ajax_image_load" width="295" height="159" class="size-full wp-image-855" style="float:left; padding: 0 10px 10px 0" /><p class="wp-caption-text"> </p></div>
<p>Идею этого эффекта я <del datetime="2009-06-20T11:32:50+00:00">нагло стырил</del> позаимствовал на сайте <a href="http://www.jomsocial.com/">jomsocial</a>. Там есть блоки (под кнопкой <em>Learn More</em>) с анонсами. При наведении мышки на эти блоки к ним добавляется картинка.</p>
<p><strong>Реализовать такой эффект можно разными способами</strong>. Например, можно теги картинок вставить прямо в страницу и прятать/показывать их с помощью JavaScript.</p>
<p>Основное достоинство такого варианта – <strong>отсутствие задержек</strong> при появлении картинок (если конечно вы подождали пока страница полностью загрузится).</p>
<p>Но при этом увеличивается размер страницы и не факт, что посетитель вообще будет эти картинки рассматривать.</p>
<p>Поэтому я решил привести <strong>пример своей реализации этого эффекта</strong>.</p>
<p>Картинки будут загружаться только если посетитель наведет мышку на какой-нибудь блок с аннотацией. Естественно, что загрузка будет выполняться <strong>только один раз</strong>.</p>
<p>Если посетитель наведет курсор мышки на другую аннотацию, будет загружена картинка для неё, а предыдущая – исчезнет.</p>
<p>Говорят, что одна картинка стоит тысячи слов, поэтому я сделал демонстрационную страничку для этого примера.</p>
<p><a href="http://demosites.org.ua/imagepreview/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a></p>
<p>Сразу же выкладываю архив с исходниками.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2009/06/ajaximagepreview.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><strong>А теперь разберем как это все работает</strong>.</p>
<p>Допустим у нас есть страница (index.html) со следующей разметкой.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0"> &nbsp; &nbsp; &nbsp; &nbsp;&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;html</span> xmlns=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span> <span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="sc2"><span class="kw2">&lt;head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;title&gt;</span></span>Пердпросмотр с картинками<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;content-type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/html;charset=utf-8&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;Content-Style-Type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span>=<span class="st0">&quot;screen&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;styles.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;body&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;content&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;leftCol&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;butterfly&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;tiger&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;elephant&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;wolf&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;fish&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;rightCol&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;whale&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;flamingo&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;bear&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;dog&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;cat&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;annotaionBlock&quot;</span><span class="kw2">&gt;</span></span>…<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</li>
</ol>
</div>
<p>Сразу обратите внимание на блок <code>content</code>. Он состоит из двух колонок (<code>leftCol</code> и <code>rightCol</code>) в которых размещены аннотации.</p>
<p>Всем аннотациям присвоен CSS класс <code>annotaionBlock</code> и уникальный <code>id</code>. Этот <code>id</code> будет использоваться для определения нужной картинки.</p>
<p>Сами аннотации представляют собой обычный текст с HTML разметкой или без неё.</p>
<p><strong>Теперь напишем JS скрипт, который будет подгружать картинки.</strong></p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span> src=<span class="st0">&quot;jquery-1.3.1.min.js&quot;</span>&gt;&lt;/script&gt;</div>
</li>
<li class="li1">
<div class="de1">&lt;script type=<span class="st0">&quot;text/javascript&quot;</span>&gt;</div>
</li>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.annotaionBlock&#039;</span><span class="br0">&#41;</span>.<span class="me1">hover</span><span class="br0">&#40;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>event<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curAnnotation = $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curId = curAnnotation.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> annotImg = curAnnotation.<span class="me1">children</span><span class="br0">&#40;</span><span class="st0">&#039;.annotImg&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>annotImg.<span class="me1">length</span> == <span class="nu0">0</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&#039;getimage.php&#039;</span>, <span class="br0">&#123;</span>img : curId<span class="br0">&#125;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; annotImg = $<span class="br0">&#40;</span><span class="st0">&#039;&lt;div class=&quot;annotImg&quot;&gt;&lt;img src=&quot;&#039;</span> + data + <span class="st0">&#039;&quot; alt=&quot;Картинка&quot; /&gt;&lt;/div&gt;&#039;</span><span class="br0">&#41;</span>.<span class="me1">hide</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; curAnnotation.<span class="me1">append</span><span class="br0">&#40;</span>annotImg<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.annotImg&#039;</span><span class="br0">&#41;</span>.<span class="me1">not</span><span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">slideUp</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; annotImg.<span class="me1">slideDown</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.annotImg&#039;</span><span class="br0">&#41;</span>.<span class="me1">not</span><span class="br0">&#40;</span>annotImg<span class="br0">&#41;</span>.<span class="me1">slideUp</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; annotImg.<span class="me1">slideDown</span><span class="br0">&#40;</span><span class="st0">&#039;fast&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&lt;/script&gt;</div>
</li>
</ol>
</div>
<p>Прежде всего мы подключаем библиотеку <a href="http://jquery.com/">jQuery</a> и пишем функцию, которая будет вызвана сразу после загрузки страницы (строки 3-25).</p>
<p>В этой функции мы объявляем обработчик события <code>hover</code> для всех элементов страницы с классом <code>annotaionBlock</code>, т.е. для всех наших аннотаций.</p>
<p>В качестве параметров этому обработчику передается 2 функции. Первая будет вызвана при появлении мышки над блоком, вторая – при выходе из него.</p>
<p>Вторую функцию (строки 22-23) мы оставляем пустой, т.к. вставлять и прятать картинки будем в первой.</p>
<p><strong>Алгоритм работы.</strong></p>
<p>1) При появлении курсора над аннотацией, сохраняем указатель на неё и её <code>id</code> (строки 6-7).</p>
<p>2) Проверяем загружен ли рисунок для данной аннотации (строки 8-9) и если нет, выполняем AJAX запрос к серверному (PHP) скрипту, в параметрах которого передаем <code>id</code> блока (строки 10-15).</p>
<p>3) После получения ответа сервера создаем скрытый тег <code>img</code> и вставляем его в конец блока с аннотацией (строки 11, 12). После этого применяем эффект <code>slideUp</code> ко всем картинкам в блоках с аннотацией кроме текущей (строка 13). И с помощью эффекта <code>slideDown</code> показываем картинку для данной аннотации (строка 14).</p>
<p>4) Если картинка была вставлена раньше, то AJAX запрос мы не отправляем, а просто показываем её и прячем остальные (с помощью эффектов <code>slideUp</code> и <code>slideDown</code>, строки 18-19).</p>
<p>Обратите внимание. Если применять эффекты <code>slideDown</code> и <code>slideUp</code> непосредственно к тегу <code>img</code> картинка будет плавно изменять как вертикальный, так и горизонтальный размеры. Т.е. она будет «выезжать» из левого верхнего угла.<br />
Чтобы изменялась только высота картинки нужно поместить её внутрь тега <code>div</code> и примерять эффекты к нему.</p>
<p><strong>Серверная часть</strong></p>
<p>PHP скрипт, который обрабатывает запросы на получение картинок (getimage.php) должен прочитать <code>id</code> запрашиваемой картинки и вернуть соответствующую ссылку.</p>
<p>Эти ссылки можно хранить в БД или текстовом файле, выбирать случайным образом или однозначно связать с аннотациями. Всё это зависит от конкретной ситуации. Мы ограничимся простейшим вариантом с использованием оператора <code>switch</code>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">$image</span> = <span class="re0">$_GET</span><span class="br0">&#91;</span><span class="st0">&#039;img&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">switch</span> <span class="br0">&#40;</span><span class="re0">$image</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;butterfly&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/152/408688454_2d868d0104_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;tiger&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm4.static.flickr.com/3284/2507729467_915274dab3_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;elephant&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm3.static.flickr.com/2377/1520324747_e468eab773_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;wolf&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/177/402657323_ebf5c7ce51_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;fish&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm2.static.flickr.com/1084/892454941_56fd34ac3c_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;whale&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm3.static.flickr.com/2401/2052477420_fe7fb452b0_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;flamingo&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm4.static.flickr.com/3303/3557243577_3c1bab1ec3_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;bear&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/172/401014816_9d879ceac6_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;dog&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm1.static.flickr.com/68/215233902_0f2d1ac9e5_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> <span class="st0">&#039;cat&#039;</span>: <span class="kw3">echo</span> <span class="st0">&#039;http://farm3.static.flickr.com/2068/2532467266_d8b5c9ea15_m.jpg&#039;</span>; <span class="kw1">break</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Как видите, у нас есть десять аннотаций и каждой соответствует своя ссылка.</p>
<p>И в заключение <strong>несколько слов об оформлении страницы</strong>.</p>
<p>Размещение аннотаций и их внешний вид задаётся с помощью CSS стилей (файл styles.css).</p>
<p>Я приведу только его фрагмент, который создаёт две колонки (в архиве вы найдете полный вариант).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">#content</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">600px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">margin</span>: <span class="kw2">auto</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">text-align</span>: <span class="kw2">justify</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">#leftCol</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">float</span>: <span class="kw1">left</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">299px</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">#rightCol</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">margin-left</span>: <span class="re3">301px</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Как видите, ширину всего блока с аннотациями мы установили равной 600px. Для левой колонки указали правило <code>float: left</code> и ширину 299px, а для правой – отступ слева 301px (внутри этого отступа будет находится левая колонка).</p>
<p>Вот и всё. На мой взгляд, эффект довольно симпатичный, но подходит не для всех сайтов.</p>
<p>Как всегда, буду рад ответить на вопросы и выслушать замечания.</p>
<p>До встречи!</p>
<p><strong>Интересно почитать</strong></p>
<p>Актуально про seo и <a href="http://seoprofy.net/tema/poiskovye-sistemy/">поисковые системы</a> от SeoProfy</p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/QVzIwdR3-kU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/dinamicheskaya-zagruzka-kartinok-dlya-anonsov-s-pomoshhyu-ajax-jquery-i-php.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>jqGrid: редактирование табличных данных с помощью inline редакторов</title>
		<link>http://www.simplecoding.org/jqgrid-redaktirovanie-tablichnyx-dannyx-s-pomoshhyu-inline-redaktorov.html</link>
		<comments>http://www.simplecoding.org/jqgrid-redaktirovanie-tablichnyx-dannyx-s-pomoshhyu-inline-redaktorov.html#comments</comments>
		<pubDate>Sat, 13 Jun 2009 18:09:18 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=852</guid>
		<description><![CDATA[ 
В одной из прошлых статей (jQuery Grid Plugin - &#34;продвинутое&#34; решение для создания таблиц) я рассказывал об использовании jqGrid для создания таблиц.
jqGrid представляет собой плагин к библиотеке jQuery предназначенный для работы с таблицами. С его помощью можно создавать многостраничные таблицы, выполнять сортировку и, конечно, редактировать данные.
В прошлой статье речь шла только о самых простых [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_838" class="wp-caption alignnone" style="width: 410px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/05/jqgrid.png" alt="jqgrid" title="jqgrid" width="400" height="158" class="size-full wp-image-838" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>В одной из прошлых статей (<a href="http://www.simplecoding.org/jquery-grid-plugin-prodvinutoe-reshenie-dlya-sozdaniya-tablic.html">jQuery Grid Plugin - &quot;продвинутое&quot; решение для создания таблиц</a>) я рассказывал об использовании <a href="http://www.trirand.com/blog/">jqGrid</a> для создания таблиц.</p>
<p><strong>jqGrid</strong> представляет собой плагин к библиотеке <a href="http://jquery.com/">jQuery</a> предназначенный для работы с таблицами. С его помощью можно создавать многостраничные таблицы, выполнять сортировку и, конечно, редактировать данные.</p>
<p>В прошлой статье речь шла только о самых простых возможностях и, как справедливо заметили в комментариях, о самой интересной части, редактировании, не было ничего сказано. Я пообещал это исправить и сегодня постараюсь это обещание выполнить.</p>
<p>Прежде всего, напомню, что данные хранятся на стороне сервера (в базе данных) и плагин к ним непосредственного доступа не имеет. Он может только <strong>вызвать серверный (PHP) скрипт</strong> и передать ему новые значения.</p>
<p>Редактировать записи в таблице можно 2 способами.</p>
<p>1) <strong>В отдельном окне.</strong> При редактировании строки появляется окно со всеми полями, в которые нужно ввести новые значения. Клик по кнопке «OK» отправит данные серверу.</p>
<p>2) <strong>С использованием inline редакторов.</strong> В режиме редактирования текст строки заменяется полями для ввода данных. Нажатие на клавишу Enter отправляет измененные данные.</p>
<p>Общий принцип работы в обоих случаях один и тот же. Поэтому мы рассмотрим только один вариант (с использованием inline редакторов).</p>
<p>Использовать будем предыдущий пример. На данный момент он только создает таблицу с данными из базы, а мы добавим возможность их редактирования.</p>
<p>В тексте этой статьи приводить полный код скриптов нет смысла, остановимся только на тех моментах, которые касаются редактирования. Но вы можете скачать архив с этим примером и поэкспериментировать с демонстрационной страницей.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2009/06/jqgrid_edit.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><a href="http://demosites.org.ua/jqgrid/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a></p>
<p>Прежде всего, <strong>сделаем поля таблицы редактируемыми</strong>. Для этого нужно внести несколько изменений в скрипт, создающий таблицу.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">jQuery<span class="br0">&#40;</span>document<span class="br0">&#41;</span>.<span class="me1">ready</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> lastSel;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; jQuery<span class="br0">&#40;</span><span class="st0">&quot;#list&quot;</span><span class="br0">&#41;</span>.<span class="me1">jqGrid</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; url:<span class="st0">&#039;getdata.php&#039;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; datatype: <span class="st0">&#039;json&#039;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; mtype: <span class="st0">&#039;POST&#039;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; colNames:<span class="br0">&#91;</span><span class="st0">&#039;#&#039;</span>, <span class="st0">&#039;Фамилия&#039;</span>, <span class="st0">&#039;Имя&#039;</span>, <span class="st0">&#039;Отчество&#039;</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; colModel :<span class="br0">&#91;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><span class="kw3">name</span>:<span class="st0">&#039;id&#039;</span>, index:<span class="st0">&#039;id&#039;</span>, width:<span class="nu0">30</span><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,<span class="br0">&#123;</span><span class="kw3">name</span>:<span class="st0">&#039;surname&#039;</span>, index:<span class="st0">&#039;surname&#039;</span>, width:<span class="nu0">80</span>, align:<span class="st0">&#039;right&#039;</span>, editable:<span class="kw2">true</span>, edittype:<span class="st0">&quot;text&quot;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,<span class="br0">&#123;</span><span class="kw3">name</span>:<span class="st0">&#039;fname&#039;</span>, index:<span class="st0">&#039;fname&#039;</span>, width:<span class="nu0">90</span>, editable:<span class="kw2">true</span>, edittype:<span class="st0">&quot;text&quot;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,<span class="br0">&#123;</span><span class="kw3">name</span>:<span class="st0">&#039;lname&#039;</span>, index:<span class="st0">&#039;lname&#039;</span>, width:<span class="nu0">80</span>, align:<span class="st0">&#039;right&#039;</span>, editable:<span class="kw2">true</span>, edittype:<span class="st0">&quot;text&quot;</span><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; pager: jQuery<span class="br0">&#40;</span><span class="st0">&#039;#pager&#039;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; rowNum:<span class="nu0">5</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; rowList:<span class="br0">&#91;</span><span class="nu0">5</span>,<span class="nu0">10</span>,<span class="nu0">30</span><span class="br0">&#93;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sortname: <span class="st0">&#039;id&#039;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; sortorder: <span class="st0">&quot;asc&quot;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; viewrecords: <span class="kw2">true</span>,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; imgpath: <span class="st0">&#039;themes/basic/images&#039;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; caption: <span class="st0">&#039;Данные пользователей&#039;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; ondblClickRow: <span class="kw2">function</span><span class="br0">&#40;</span>id<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>id &amp;amp;&amp;amp; id != lastSel<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jQuery<span class="br0">&#40;</span><span class="st0">&quot;#list&quot;</span><span class="br0">&#41;</span>.<span class="me1">restoreRow</span><span class="br0">&#40;</span>lastSel<span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; jQuery<span class="br0">&#40;</span><span class="st0">&quot;#list&quot;</span><span class="br0">&#41;</span>.<span class="me1">editRow</span><span class="br0">&#40;</span>id, <span class="kw2">true</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lastSel = id;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; editurl: <span class="st0">&#039;saverow.php&#039;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>; </div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>В строке 2 мы добавили переменную <code>lastSel</code>, которая служит для хранения <code>id</code> строки, редактируемой в данный момент.</p>
<p>Также немного изменились строки 10-12 (по сравнению с предыдущим примером). В них перечислены параметры ячеек таблицы и для каждой ячейки (кроме первой, в которой хранится <code>id</code> записи) мы добавили параметры <code>editable:true</code> и <code>edittype:&quot;text&quot;</code>.</p>
<p>Первый параметр делает ячейку редактируемой, второй – указывает, что в ячейке нужно создать обычное текстовое поле. Другие значения этого параметра: textarea, checkbox и select.</p>
<p>После этого <strong>создаем обработчик события ondblClickRow</strong> (строки 22-28). В нем мы проверяем что пользователь кликнул по строке и эта строка в данный момент не редактируется. Восстанавливаем значения в строке, которая редактировалась перед этим (с помощью <code>restoreRow</code>) и переводим новую строку в режим редактирования (функция <code>editRow</code>).</p>
<p>Обратите внимание на второй параметр функции <code>editRow</code>. Он должен быть равен <code>true</code> для того, чтобы сохранение данных выполнялось при нажатии на клавишу Enter.</p>
<p>И последнее изменение (строка 29). В параметре <code>editurl</code> указываем имя серверного скрипта, который будет сохранять данные.</p>
<p>Теперь остается только написать <strong>серверный (PHP) скрипт</strong> (saverow.php).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">require_once</span><span class="br0">&#40;</span><span class="st0">&#039;dbdata.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">try <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="co1">//читаем новые значения</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$id</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$surname</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;surname&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$fname</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;fname&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$lname</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;lname&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//подключаемся к базе</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">new</span> PDO<span class="br0">&#40;</span><span class="st0">&#039;mysql:host=&#039;</span>.<span class="re0">$dbHost</span>.<span class="st0">&#039;;dbname=&#039;</span>.<span class="re0">$dbName</span>, <span class="re0">$dbUser</span>, <span class="re0">$dbPass</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//указываем, мы хотим использовать utf8</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span>-&gt;<span class="me1">exec</span><span class="br0">&#40;</span><span class="st0">&#039;SET CHARACTER SET utf8&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//определяем количество записей в таблице</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$stm</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&#039;UPDATE users SET surname=?, fname=?, lname=? WHERE id=?&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$stm</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$surname</span>, <span class="re0">$fname</span>, <span class="re0">$lname</span>, <span class="re0">$id</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">catch <span class="br0">&#40;</span>PDOException <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#039;Database error: &#039;</span>.<span class="re0">$e</span>-&gt;<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// end of saverow.php</span></div>
</li>
</ol>
</div>
<p>Здесь мы читаем новые значения (названия параметров в массиве <code>$_POST</code> совпадают с названиями столбцов таблицы) (строки 6-9).</p>
<p>После этого подключаемся к базе и обновляем запись (строки 11-18). Чтобы показать основную идею я максимально сократил код, убрал проверки и использовал <a href="http://ua.php.net/pdo">PDO</a> для работы с базой.</p>
<p>Всё, теперь можно спокойно редактировать записи в таблице.</p>
<p>Если есть вопросы или замечания, пишите, постараюсь ответить <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>До встречи!</p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/k-yHz4lEK5g" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/jqgrid-redaktirovanie-tablichnyx-dannyx-s-pomoshhyu-inline-redaktorov.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>WampServer: как я обновлял MySQL</title>
		<link>http://www.simplecoding.org/wampserver-kak-ya-obnovlyal-mysql.html</link>
		<comments>http://www.simplecoding.org/wampserver-kak-ya-obnovlyal-mysql.html#comments</comments>
		<pubDate>Fri, 05 Jun 2009 18:52:39 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=850</guid>
		<description><![CDATA[ 
Эта история началась с того, что на днях я решил обновить софт для web разработки (apache + php + mysql). И для этого скачал последнюю версию wampserver&#039;а.
Примечание. Почитать об этом дистрибутиве для web разработки можно в статье Инструменты web разработчика. WAMPSERVER 2 – только новый софт.
В принципе, отличия в номерах версий серверов были не [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_851" class="wp-caption alignnone" style="width: 256px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/06/mysql_config.png" alt="mysql_config" title="mysql_config" width="246" height="183" style="float:left" class="size-full wp-image-851" /><p class="wp-caption-text"> </p></div>
<p>Эта история началась с того, что на днях я решил обновить софт для web разработки (apache + php + mysql). И для этого скачал последнюю версию <a href="http://www.wampserver.com/en/">wampserver</a>&#039;а.</p>
<p><em>Примечание</em>. Почитать об этом дистрибутиве для web разработки можно в статье <a href="http://www.simplecoding.org/wampserver-tolko-novij-soft.html">Инструменты web разработчика. WAMPSERVER 2 – только новый софт</a>.</p>
<p>В принципе, отличия в номерах версий серверов были не большие и я думал, что никаких проблем не возникнет. Но, как оказалось, я ошибся. Серьезных проблем, конечно, не было, но &#034;поиграться&#034; с конфигами пришлось.</p>
<p>Для начала, хочу отметить, что сразу после установки <strong>wampserver</strong>&#039;а все работает. Т.е. можно спокойно зайти в <strong>phpMyAdmin</strong> и посмотреть базы.</p>
<p>Но мне нужно было <strong>подключить свои старые базы</strong>. Они у меня хранятся отдельно, чтобы свести действия при переустановке к минимуму. MySQL хранит данные о пользователях, пароля в своих же БД. Т.е. достаточно в <strong>my.ini</strong> указать путь к ним и перезапустить сервер. И все данные автоматически подхватятся.</p>
<p>Путь к базам указываем в параметре</p>
<p><code>datadir=path_to_db</code></p>
<p>Кроме того, при обновлении сервера mysql нужно выполнить команду</p>
<p><code>mysql_upgrade --password=ваш_пароль</code></p>
<p>причем <strong>эта команда должна выполнятся при запущенном сервере</strong>.</p>
<p>И вот тут <strong>полезли ошибки</strong>. MySQL начал мне рассказывать, что движок <strong>InnoDB</strong> не поддерживается.</p>
<p>Смотрю в конфиг (my.ini). Действительно, есть целый блок закомментированных параметров перед которым написано &#034;раскомментируйте строки ниже если хотите включить поддрежку InnoDB&#034;.</p>
<p>Ладно, решили по-умолчанию отключить поддержку, вам виднее. Снимаю комментарии в этом блоке, перезапускаю&#8230; не работает.</p>
<p>Отключаю поддержку InnoDB - снова запускается.</p>
<p>Пришлось смотреть лог ошибок MySQL.</p>
<p>Кстати, размещение этого файла указано в параметре <code>log-error</code>.</p>
<p>Как оказалось, <strong>ошибок было две</strong>.</p>
<p>1) В параметре <code>innodb_log_file_size</code> был установлено значения 5МБ, а реально размер этого файла был равен 10МБ (остался от прошлой инсталляции). Тут я просто изменил значение.</p>
<p>2) MySQL очень не понравился параметр <code>innodb_log_arch_dir</code>. И это не удивительно. Этот параметр запрещен (depricated) <a href="http://dev.mysql.com/doc/mysqld-version-reference/en/mysqld-version-reference-optvar.html">начиная с версии 5.0.24</a>. Почему он попал в конфиг непонятно. Похоже, что разработчики wampserver’а вообще не проверяли работу с InnoDB. В общем, пока я его не закомментировал сервер не запустился.</p>
<p>Обе проблемы мелкие, и о них даже говорить бы не стоило, если бы они возникли при переходе с одного дистрибутива на другой. Но на мой взгляд разработчики wampserver могли бы уделить больше внимания совместимости между версиями своего же продука.</p>
<p>Удачных обновлений!</p>
<p><strong>Интересно почитать</strong>.</p>
<p><a href="http://padlik.ru/">Padlik.ru - о том, как зарабатывать и, главное, на чем зарабатывать в интернете</a></p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/Xe9X6FrcrCQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/wampserver-kak-ya-obnovlyal-mysql.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Как найти спамера в твиттере 2</title>
		<link>http://www.simplecoding.org/kak-najti-spamera-v-tvittere-2.html</link>
		<comments>http://www.simplecoding.org/kak-najti-spamera-v-tvittere-2.html#comments</comments>
		<pubDate>Mon, 01 Jun 2009 07:37:53 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[Разное]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=844</guid>
		<description><![CDATA[ 
Что-то последнее время не дает мне покоя twitter  
Сервис очень интересный и предоставляет интересные возможности как для общения, так и для рассылки спама. Т.к. я рассылкой спама не занимаюсь, то меня больше интересуют методы борьбы со спамерами в твиттере. В одном из предыдущих постов я уже рассказывал о способе поиска «специалистов по продвижению», [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_829" class="wp-caption alignnone" style="width: 310px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/05/twitter_spam.png" alt="twitter spam" title="twitter spam" width="300" height="300" class="size-full wp-image-829" style="float:left" /><p class="wp-caption-text"> </p></div>
<p>Что-то последнее время не дает мне покоя <strong>twitter</strong> <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Сервис очень интересный и предоставляет интересные возможности как для общения, так и для рассылки спама. Т.к. я рассылкой спама не занимаюсь, то меня больше интересуют методы борьбы со спамерами в твиттере. В одном из <a href="http://www.simplecoding.org/kak-pojmat-spamerov-v-twitter.html">предыдущих постов</a> я уже рассказывал о способе поиска «специалистов по продвижению», но за это время возникло ещё несколько идей, которыми я и хочу поделиться.</p>
<p>Идея очень простая - <strong>подсчет ответов пользователю</strong>.</p>
<p>Обратите внимание, не тех ответов, которые пользователь сам написал, а тех, <strong>которые написали ему</strong>.</p>
<p>Давайте порассуждаем. Для администрации узнать количество ответов, которые пришли данному пользователю не сложно. Для этого достаточно посчитать количество сообщений в которых есть <code>@ник_пользователя</code>.</p>
<p>Дальше возникает тонкий момент. <strong>При каком количестве ответов нужно считать пользователя спамером?</strong></p>
<p>И тут опять приходят на помощь &#034;руководства по продвижению в twitter&#034;. В них предлагается интенсивно фолловить других пользователей и, чтобы twitter вас не забанил, отвечать на чужие твиты. Т.е. изображать общение.</p>
<p>Проблема (спамеров) в том, что написать несколько десятков ОСМЫСЛЕННЫХ сообщений, на которые другой пользователь захочет ответить, очень сложно. А на общие фразы типа &#034;спасибо&#034; и &#034;актуально&#034; обычно никто не отвечает.</p>
<p>А дальше все просто. <strong>Нужно считать отношение ваших сообщений другим пользователям и сообщений, отправленных вам</strong>. Если этот параметр превысит определенное значение - пользователя в бан <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Администраторы могут взять выборку 100% не спамерских аккаунтов, определить это соотношение для них и использовать его в качестве опорного.</p>
<p>Правда этот метод имеет <strong>уязвимость</strong>. Спамер может зарегистрировать несколько (десятков или сотен) аккаунтов и отвечать с них на свои же твиты.</p>
<p>Такой подход значительно усложняет ситуацию, но и тут есть решение.</p>
<p>Цель спамера – это не 10-100 фолловеров, а десятки тысяч. Поэтому если даже спамер отвечает сам себе с сотни аккаунтов, это означает, что с 99% он все равно не получает никаких ответов.</p>
<p>Зарегистрировать больше 100 аккаунтов довольно сложно, т.к. для этого нужно:<br />
1) обойти captcha;<br />
2) использовать разные IP (иначе вся эта деятельность будет выглядеть очень подозрительно).</p>
<p>В общем, метод имеет недостатки и я не думаю, что администрация твиттера когда-нибудь станет применять его в качестве основного средства поиска спамеров. Но в качестве дополнения к методу, о котором я рассказывал в <a href="http://www.simplecoding.org/kak-pojmat-spamerov-v-twitter.html">прошлой статье</a> – вполне возможно.</p>
<p>Сложно, конечно, предсказать действия владельцев твиттера. Может, в рассылке спама они видят способ монетизации своего ресурса? И будут продавать специальные спамерские аккаунты? <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Но в любом случае, <strong>возможность найти спамеров у них есть</strong>.</p>
<p>Делайте выводы <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>Интересно почитать:</strong></p>
<p><a href="http://www.alik.su/articles/artificial-intelligence/">Может ли страдать тетрадка в клеточку,<br />
<span style="font-size:90%">или моральные проблемы создания искусственного интеллекта</span></a></p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/L8_PLLziff0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/kak-najti-spamera-v-tvittere-2.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Создаём виджет для хранения заметок. Часть 2.</title>
		<link>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-2.html</link>
		<comments>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-2.html#comments</comments>
		<pubDate>Fri, 29 May 2009 10:42:59 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[CSS]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=841</guid>
		<description><![CDATA[ 
В этой статье мы продолжаем разработку виджета для работы с короткими заметками. Если вы не читали предыдущую часть, то очень советую бегло её просмотреть. В ней мы подробно описаны постановка задачи и реализована серверная часть виджета, т.е. весь PHP код.
Для того, чтобы виджет заработал нам осталось написать клиентскую часть.
Думаю, очевидно, что для виджета отправка [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_840" class="wp-caption alignnone" style="width: 229px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/05/notes_widget.png" alt="notes widget" title="notes widget" width="219" height="251" style="float:left" class="size-full wp-image-840" /><p class="wp-caption-text"> </p></div>
<p>В этой статье мы продолжаем разработку виджета для работы с короткими заметками. Если вы не читали <a href="http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-1.html">предыдущую часть</a>, то очень советую бегло её просмотреть. В ней мы подробно описаны постановка задачи и реализована <strong>серверная часть виджета</strong>, т.е. весь PHP код.</p>
<p>Для того, чтобы виджет заработал нам осталось написать <strong>клиентскую часть</strong>.</p>
<p>Думаю, очевидно, что для виджета отправка и получение данных должна выполняться с помощью <strong>AJAX запросов</strong>. Ведь вряд ли кому-то понравиться, если каждая операция с виджетом будет приводить к перезагрузке всей страницы.</p>
<p>Поэтому основную часть клиентской части у нас будет занимать <strong>JavaScript</strong> код. А чтобы его сократить мы используем библиотеку <a href="http://jquery.com/">jQuery</a> с несколькими плагинами.</p>
<p>Кстати, есть демонстрационная страничка с этим виджетом.</p>
<p><a href="http://www.demosites.org.ua/notes-widget/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a></p>
<p>И, как и обещал, выкладываю архив с исходниками.</p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2009/05/notes_widget.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p>Прежде всего, <strong>рассмотрим разметку страницы</strong> (index.html).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;</span>?xml <span class="kw3">version</span>=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;UTF-8&quot;</span>?<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;html</span> xmlns=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span> <span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;head&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;title&gt;</span></span>Notes Widget<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;content-type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/html;charset=utf-8&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;Content-Style-Type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;pagestyles.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;widgetstyles.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;content&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">…. Содержимое страницы…</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;notesWidget&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;notesHeader&quot;</span><span class="kw2">&gt;</span></span>Мои заметки<span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;notes&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;form</span> <span class="kw3">id</span>=<span class="st0">&quot;fAddNote&quot;</span> <span class="kw3">action</span>=<span class="st0">&quot;savenote.php&quot;</span> <span class="kw3">method</span>=<span class="st0">&quot;post&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;text&quot;</span> <span class="kw3">id</span>=<span class="st0">&quot;addNote&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;addNote&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;input</span> <span class="kw3">type</span>=<span class="st0">&quot;submit&quot;</span> <span class="kw3">name</span>=<span class="st0">&quot;bAddNote&quot;</span> <span class="kw3">id</span>=<span class="st0">&quot;bAddNote&quot;</span> <span class="kw3">value</span>=<span class="st0">&quot;&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/form&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery-1.3.2.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery-ui-1.7.1.custom.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/jquery.jeditable.mini.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;js/custom.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</li>
</ol>
</div>
<p>В заголовке страницы мы подключаем файлы с <strong>CSS стилями</strong> (строки 13 и 14). Я вынес все стили, которые относятся к виджету в отдельный файл (widgetstyles.css), чтобы они не путались со стилями основной страницы.</p>
<p>Внутри страницы у нас находится 2 блока: основное содержимое (<code>&lt;div id=&quot;content&quot;&gt;</code>) и виджет (<code>&lt;div id=&quot;notesWidget&quot;&gt;</code>).</p>
<p>Первый блок нас не интересует, а вот на втором остановимся подробнее. Он состоит из трёх частей:</p>
<p>- заголовок (<code>&lt;div id=&quot;notesHeader&quot;&gt;</code>);<br />
- блок заметок (<code>&lt;div id=&quot;notes&quot;&gt;</code>);<br />
- блок с формой добавления заметки (<code>&lt;form id=&quot;fAddNote&quot;</code>).</p>
<p><em>Обратите внимание</em>, что блок заметок не заполнен. Внутрь него мы будем вставлять список заметок, полученный от сервера.</p>
<p>И в конце страницы мы <strong>подключаем jQuery, плагины и файл с нашими скриптами</strong>.</p>
<p>Сразу же рассмотрим используемые плагины.</p>
<p>1) <a href="http://jqueryui.com/">jQuery UI</a>. Это скорее не плагин, а целая библиотека. На её сайте вы можете выбрать необходимые компоненты и скачать архив с ними. Для нашего виджета нужны <strong>Core UI</strong> и <strong>Draggable</strong>. С их помощью мы сможем свободно перемещать виджет по странице.</p>
<p>2) <a href="http://www.appelsiini.net/projects/jeditable/default.html">Jeditable</a>. С помощью этого плагина мы будем создавать <strong>in-line редакторы</strong>. Т.е. сделаем список с нашими заметками редактируемым. При клике по тексту заметки будет появляться поле ввода с помощью которого пользователь сможет изменить текст.</p>
<p>Теперь <strong>рассмотрим CSS стили</strong> минимально необходимые для работы плагина. Полный файл со стилями вы можете посмотреть в архиве с исходниками. К тому же при использовании виджета его оформление наверняка придется подстраивать под дизайн страницы.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="re0">#notesWidget</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">position</span>: <span class="kw2">absolute</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">top</span>: <span class="re3">200px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">left</span>: <span class="nu0">0</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">width</span>: <span class="re3">200px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">height</span>: <span class="re3">300px</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ….</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">#notesHeader</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">cursor</span>: move;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ….</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">#notes</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">overflow</span>: <span class="kw2">scroll</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ….</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Для того, чтобы виджет можно было перемещать по странице, он должен иметь абсолютное позиционирование. При этом необходимо задать его размеры и положение.</p>
<p>Чтобы пользователь без наших подсказок мог догадаться, что это перемещаемый блок, мы изменим вид курсора для заголовка виджета.</p>
<p>И, т.к. заметок может быть много, добавим прокрутку в блок <code>notes</code>.</p>
<p>Теперь переходим к самой интересной части – <strong>нашему JavaScript файлу (custom.js)</strong>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1">$<span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//делаем виджет перемещаемым</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notesWidget&#039;</span><span class="br0">&#41;</span>.<span class="me1">draggable</span><span class="br0">&#40;</span><span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; handle: <span class="st0">&#039;#notesHeader&#039;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; , containment: <span class="st0">&#039;parent&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//обработчик нажатия на кнопку добавления новой записи</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#bAddNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>$<span class="br0">&#40;</span><span class="st0">&#039;#addNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span> != <span class="st0">&#034;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//сохраняем запись</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">post</span><span class="br0">&#40;</span><span class="st0">&#039;savenote.php&#039;</span>, <span class="br0">&#123;</span>value:$<span class="br0">&#40;</span><span class="st0">&#039;#addNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, bAddNote:<span class="kw2">true</span><span class="br0">&#125;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">function</span><span class="br0">&#40;</span>noteid<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//добавляем запись в список</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> curDate = <span class="kw2">new</span> Date<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> noteData = <span class="br0">&#123;</span>id:noteid, note_text:$<span class="br0">&#40;</span><span class="st0">&#039;#addNote&#039;</span><span class="br0">&#41;</span>.<span class="me1">val</span><span class="br0">&#40;</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; note_date:curDate.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#125;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> note = $<span class="br0">&#40;</span>createListElement<span class="br0">&#40;</span>noteData<span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notes ul&#039;</span><span class="br0">&#41;</span>.<span class="me1">prepend</span><span class="br0">&#40;</span>note<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.edit&#039;</span><span class="br0">&#41;</span>.<span class="me1">editable</span><span class="br0">&#40;</span><span class="st0">&#039;savenote.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; note.<span class="me1">children</span><span class="br0">&#40;</span><span class="st0">&#039;.remove&#039;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>addRemove<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">alert</span><span class="br0">&#40;</span><span class="st0">&#039;Вы ничего не написали&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">false</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//загружаем список записей</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $.<span class="me1">getJSON</span><span class="br0">&#40;</span><span class="st0">&#039;getnotes.php&#039;</span>, <span class="br0">&#123;</span><span class="br0">&#125;</span>, <span class="kw2">function</span><span class="br0">&#40;</span>data, <span class="kw3">status</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>data.<span class="kw3">status</span> == <span class="st0">&#039;OK&#039;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//формируем список</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">var</span> notesList = <span class="st0">&#039;&lt;ul&gt;&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $.<span class="me1">each</span><span class="br0">&#40;</span>data.<span class="me1">notes</span>, <span class="kw2">function</span><span class="br0">&#40;</span>i, note<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notesList += createListElement<span class="br0">&#40;</span>note<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; notesList += <span class="st0">&#039;&lt;/ul&gt;&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notes&#039;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>notesList<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//делаем записи редактируемыми</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.edit&#039;</span><span class="br0">&#41;</span>.<span class="me1">editable</span><span class="br0">&#40;</span><span class="st0">&#039;savenote.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//добавляем обработчики нажатия на кнопку удаления записи</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;.remove&#039;</span><span class="br0">&#41;</span>.<span class="me1">click</span><span class="br0">&#40;</span><span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>addRemove<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>;<span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//вывод сообщения об ошибке</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="st0">&#039;#notes&#039;</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span><span class="st0">&#039;&lt;p&gt;Не могу загрузить список записей&lt;/p&gt;&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> createListElement<span class="br0">&#40;</span>note<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#039;&lt;li&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;img src=&quot;images/removenote.gif&quot; alt=&quot;Удалить&quot; class=&quot;remove&quot; /&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;div class=&quot;edit&quot; id=&quot;note_&#039;</span> + note.<span class="me1">id</span> + <span class="st0">&#039;&quot;&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + note.<span class="me1">note_text</span> + <span class="st0">&#039;&lt;/div&gt;&#039;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;div class=&quot;notedate&quot;&gt;&#039;</span> + note.<span class="me1">note_date</span> + <span class="st0">&#039;&lt;/div&gt;&#039;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; + <span class="st0">&#039;&lt;/li&gt;&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> addRemove<span class="br0">&#40;</span>element<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> noteid = $<span class="br0">&#40;</span>element<span class="br0">&#41;</span>.<span class="me1">next</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">attr</span><span class="br0">&#40;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//удаляем запись</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; $.<span class="me1">post</span><span class="br0">&#40;</span><span class="st0">&#039;removenote.php&#039;</span>, <span class="br0">&#123;</span>id:noteid<span class="br0">&#125;</span>, <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">//убираем данную запись из списка</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span>element<span class="br0">&#41;</span>.<span class="me1">parent</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">slideUp</span><span class="br0">&#40;</span><span class="st0">&quot;slow&quot;</span>, <span class="kw2">function</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; $<span class="br0">&#40;</span><span class="kw1">this</span><span class="br0">&#41;</span>.<span class="me1">remove</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">function</span> refreshClasses<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">var</span> odds = $<span class="br0">&#40;</span><span class="st0">&#039;#notes ul li:odd&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; odds.<span class="me1">removeClass</span><span class="br0">&#40;</span><span class="st0">&#039;even&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; odds.<span class="me1">addClass</span><span class="br0">&#40;</span><span class="st0">&#039;odd&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw2">var</span> evens = $<span class="br0">&#40;</span><span class="st0">&#039;#notes ul li:even&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; evens.<span class="me1">removeClass</span><span class="br0">&#40;</span><span class="st0">&#039;odd&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; evens.<span class="me1">addClass</span><span class="br0">&#40;</span><span class="st0">&#039;even&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
</ol>
</div>
<p>Рассмотрим его подробнее.</p>
<p>Прежде всего, <strong>сделаем виджет перемещаемым</strong> (строки 3-6). Параметр <code>handle</code> указывает, что блок можно будет перемещать только за заголовок, а <code>containment</code> – запрещает выводить блок за пределы страницы.</p>
<p>Затем, мы <strong>создаем обработчик нажатия на кнопку «Добавить»</strong> (строки 8-30). В нём мы проверяем, ввел ли пользователь текст новой заметки и отправляем AJAX запрос.</p>
<p>После получения ответа будет вызвана анонимная функция (строки 12-23), которая:</p>
<p>1) создает элемент списка с новой записью (с помощью функции <code>createListElement</code>, её мы рассмотрим чуть ниже);</p>
<p>2) вставляет его в начало общего списка;</p>
<p>3) делает редактируемым (с помощью метода <code>editable</code>);</p>
<p>4) добавляет обработчик нажатия на кнопку «Удалить» (вызывает функцию <code>addRemove</code>);</p>
<p>5) и обновляет цвет фона записей (с помощью функции <code>refreshClasses</code>).</p>
<p><strong>Теперь рассмотрим функцию createListElement</strong> (строки 59-66). Её основная задача – создать разметку новой записи.</p>
<p>Запись состоит из текста, кнопки «Удалить» (точнее это обычный рисунок, которому назначается обработчик события <code>click</code>), и даты. Оформление записи выполняется с помощью CSS стилей, но на них я останавливаться не буду, в них ничего примечательного нет, к тому же они в любом случае должны сочетаться с конкретной страницей (если интересно, качайте архив с виджетом).</p>
<p>В разметке записи стоит обратить внимание на два момента.</p>
<p>1) Тексту записи присваивается класс <code>edit</code> (<code>&lt;div class=&quot;edit&quot;…</code>). С его помощью мы выбираем элементы для которых создаются in-line редакторы.</p>
<p>2) Этому же элементу мы присваиваем атрибут <code>id</code> в формате (<code>note_№</code>), его значение используется при изменении и удалении заметок.</p>
<p>Следующая <strong>функция addRemove</strong> (строки 68-79).</p>
<p>Здесь выполняется AJAX запрос на удаление заметки (строка 72) и после этого заметка удаляется из списка. При этом используется эффект <code>slideUp</code>.</p>
<p>Теперь рассмотрим функцию <code>refreshClasses</code> (строки 81-88).</p>
<p>Она работает следующим образом.</p>
<p>1) Находим все нечетные элементы в списке заметок.</p>
<p>2) Устанавливаем для них класс <code>odd</code> и убираем <code>even</code> (если он был установлен).</p>
<p>3) Находим все четные элементы списка и устанавливаем для них класс even.</p>
<p>Стили для классов <code>odd</code> и <code>even</code> указаны в CSS файле (widgetstyles.css). Т.е. с помощью этой функции мы всегда можем обновить расцветку списка после добавления или удаления элементов.</p>
<p>Теперь <strong>рассмотрим загрузку полного списка записей</strong> (строки 32-56). Она выполняется сразу после загрузки страницы.</p>
<p>Мы отправляем AJAX запрос (с помощью метода <code>getJSON</code>) и после получения ответа формируем HTML список с заметками. Точно также как и при добавлении заметки устанавливаем обработчики нажатия на кнопку «Удалить», делаем записи редактируемыми и обновляем стили.</p>
<p>На этом можно остановиться. Общий принцип работы виджета мы рассмотрели, а если есть вопросы или замечания, пишите в комментариях, постараюсь ответить.</p>
<p><strong>P.S.</strong> В архиве с исходниками есть файл <strong>notes.sql</strong> с помощью которого можно создать таблицу в базе данных.</p>
<p><strong>Интересно почитать:</strong></p>
<p><a href="http://www.alik.su/articles/the-decline-of-the-web/">Закат Веба?</a></p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/fm9kiQM7ftE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-2.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Создаём виджет для хранения заметок. Часть 1.</title>
		<link>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-1.html</link>
		<comments>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-1.html#comments</comments>
		<pubDate>Wed, 27 May 2009 09:15:29 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[MySQL]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=839</guid>
		<description><![CDATA[ 
Приветствую всех!
В этой статье я хочу показать пример создания собственного виджета, с помощью которого можно будет создавать короткие заметки и просматривать их. Виджет будет свободно перемещаться по странице и, конечно, будет возможность редактировать и удалять заметки.
Код виджета не сложный, но требует использования сразу нескольких технологий: PHP и MySQL на стороне сервера, HTML, CSS, JavaScript [...]]]></description>
			<content:encoded><![CDATA[<div id="attachment_840" class="wp-caption alignnone" style="width: 229px"><img src="http://www.simplecoding.org/wp-content/uploads/2009/05/notes_widget.png" alt="notes widget" title="notes widget" width="219" height="251" style="float:left" class="size-full wp-image-840" /><p class="wp-caption-text"> </p></div>
<p><strong>Приветствую всех!</strong></p>
<p>В этой статье я хочу показать <strong>пример создания собственного виджета</strong>, с помощью которого можно будет создавать короткие заметки и просматривать их. Виджет будет свободно перемещаться по странице и, конечно, будет возможность редактировать и удалять заметки.</p>
<p>Код виджета не сложный, но требует использования сразу нескольких технологий: PHP и MySQL на стороне сервера, HTML, CSS, JavaScript – на стороне клиента, поэтому я разбил статью на 2 части. В первой мы рассмотрим серверную часть кода, во второй – клиентскую.</p>
<p>Чтобы лучше понять, что мы получим в результате, взгляните на демонстрационную страничку</p>
<p><a href="http://www.demosites.org.ua/notes-widget/"><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/demo_btn_green.png" alt="демонстрационный пример" /></a></p>
<p>Если задача ясна, приступим к делу.</p>
<p>Начнем с базы данных.</p>
<p>Т.к. виджет предназначен для хранения коротких заметок, структура базы будет максимально простой.</p>
<p>Создаём таблицу <code>notes</code> с тремя полями:<br />
<code>id</code> – первичный ключ;<br />
<code>note_text</code> (тип varchar(300)) – текст заметки (длина не более 300 символов);<br />
<code>note_date</code> (тип datetime) – дата создания заметки.</p>
<p>Теперь напишем PHP скрипты, с помощью которых мы будем читать, создавать, удалять и редактировать записи.</p>
<p>Т.к. пример довольно простой, то в использовании фреймворка я смысла не вижу, а для работы с базой будем использовать <a href="http://ua2.php.net/pdo">PDO</a>.</p>
<p>Создаём скрипт с параметрами подключения к БД (<strong>db.inc.php</strong>).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$dbName</span> &nbsp; = <span class="st0">&#039;database_name&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$dbUser</span> &nbsp; = <span class="st0">&#039;database_user&#039;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$dbPass</span> &nbsp; = <span class="st0">&#039;database_password&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="re0">$dbServer</span> = <span class="st0">&#039;localhost&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// end of db.inc.php</span></div>
</li>
</ol>
</div>
<p>Его мы будем включать во все скрипты, которые работают с базой.</p>
<p>Теперь напишем скрипт, возвращающий список записей (<strong>getnotes.php</strong>).</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#039;db.inc.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="re0">$results</span> = <span class="kw3">array</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">new</span> PDO<span class="br0">&#40;</span><span class="st0">&#039;mysql:host=&#039;</span>.<span class="re0">$dbServer</span>.<span class="st0">&#039;;dbname=&#039;</span>.<span class="re0">$dbName</span>, <span class="re0">$dbUser</span>, <span class="re0">$dbPass</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span>-&gt;<span class="me1">exec</span><span class="br0">&#40;</span><span class="st0">&#039;SET CHARACTER SET utf8&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$notes</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#039;SELECT * FROM notes ORDER BY note_date DESC&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&#039;status&#039;</span><span class="br0">&#93;</span> = <span class="st0">&#039;OK&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&#039;notes&#039;</span><span class="br0">&#93;</span> = <span class="re0">$notes</span>-&gt;<span class="me1">fetchAll</span><span class="br0">&#40;</span>PDO::<span class="me2">FETCH_ASSOC</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> json_encode<span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">catch <span class="br0">&#40;</span>PDOException <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&#039;status&#039;</span><span class="br0">&#93;</span> = <span class="st0">&#039;ERR&#039;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$results</span><span class="br0">&#91;</span><span class="st0">&#039;message&#039;</span><span class="br0">&#93;</span> = <span class="st0">&#039;Ошибка при работе с БД: &#039;</span>.<span class="re0">$e</span>-&gt;<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> json_encode<span class="br0">&#40;</span><span class="re0">$results</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2"><span class="co1">// end of getnotes.php</span></div>
</li>
</ol>
</div>
<p>Разберём, что здесь происходит.</p>
<p>Прежде всего, мы подключаем файл db.inc.php. И создаём объект PDO (строка 8).</p>
<p>Затем выполняем 2 запроса. С помощью первого (строка 9) настраиваем кодировку, а с помощью второго – получаем список записей, отсортированный по их датам в убывающем порядке. Таким образом, самые новые записи окажутся в начале списка.</p>
<p>После этого, формируем массив с результатами (строки 13 и 14), преобразуем его в JSON формат и отправляем браузеру, строка 16.</p>
<p>С помощью параметра <code>status</code> мы указываем удачно или нет, завершился запрос к базе.</p>
<p>Теперь рассмотрим скрипт сохранения записи (<strong>savenote.php</strong>). Он немного сложнее, т.к. наш позволяет, как изменять существующие записи, так и создавать новые.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#039;db.inc.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$newNote</span> = <span class="kw2">false</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw3">isset</span><span class="br0">&#40;</span><span class="re0">$_REQUEST</span><span class="br0">&#91;</span><span class="st0">&#039;bAddNote&#039;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$newNote</span> = <span class="kw2">true</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$id</span> = <span class="re0">$_REQUEST</span><span class="br0">&#91;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$id</span> = <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$id</span>, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$text</span> = <span class="re0">$_REQUEST</span><span class="br0">&#91;</span><span class="st0">&#039;value&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">new</span> PDO<span class="br0">&#40;</span><span class="st0">&#039;mysql:host=&#039;</span>.<span class="re0">$dbServer</span>.<span class="st0">&#039;;dbname=&#039;</span>.<span class="re0">$dbName</span>, <span class="re0">$dbUser</span>, <span class="re0">$dbPass</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span>-&gt;<span class="me1">exec</span><span class="br0">&#40;</span><span class="st0">&#039;SET CHARACTER SET utf8&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="re0">$newNote</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$stmt</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&#039;INSERT INTO notes (note_text, note_date) VALUES (?, NOW())&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$stmt</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$text</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$dbh</span>-&gt;<span class="me1">lastInsertId</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">else</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$stmt</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&#039;UPDATE notes SET note_text=?, note_date=NOW() WHERE id=?&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$stmt</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$text</span>, <span class="re0">$id</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">echo</span> <span class="re0">$text</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">null</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">catch <span class="br0">&#40;</span>PDOException <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#039;Не могу сохранить запись&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// end of savenote.php</span></div>
</li>
</ol>
</div>
<p>Разница между изменением записи и созданием новой в том, что пользователь нажимает на кнопку «Добавить запись». Т.е. скрипту будет передан параметр <code>bAddNote</code> (это значение атрибута name кнопки).</p>
<p>Кроме того, если мы хотим изменить существующую запись, то должны передать два параметра: <code>id</code> (первичный ключ записи в базе) и <code>value</code> (новый текст).</p>
<p>Тут есть один нюанс. Когда мы показываем список записей в виджете, то как-то должны сохранять их номера (поле id в БД). В данном примере для этой цели используется атрибут <code>id</code> элементов списка (теги <code>li</code>), но значение этого атрибута не может начинаться с цифры, поэтому мы будем записывать их в виде <code>note_№</code> (например, note_1, note_2 и т.д.).</p>
<p>Для того чтобы получить <code>id</code> записи мы удаляем первые пять символов, т.е. <code>note_</code> из полученного значения (строка 12).</p>
<p>Дальше мы формируем запрос либо на обновление (строка 24), либо на создание новой записи (строка 19).</p>
<p>Что касается возвращаемых значений, то при обновлении мы возвращаем браузеру новый текст записи, а при создании новой записи – её <code>id</code> в базе.</p>
<p>И последний PHP скрипт <strong>removenote.php</strong> – предназначен для удаления записей.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">include_once</span><span class="br0">&#40;</span><span class="st0">&#039;db.inc.php&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li2">
<div class="de2">try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$id</span> = <span class="re0">$_REQUEST</span><span class="br0">&#91;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$id</span> = <span class="kw3">substr</span><span class="br0">&#40;</span><span class="re0">$id</span>, <span class="nu0">5</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">new</span> PDO<span class="br0">&#40;</span><span class="st0">&#039;mysql:host=&#039;</span>.<span class="re0">$dbServer</span>.<span class="st0">&#039;;dbname=&#039;</span>.<span class="re0">$dbName</span>, <span class="re0">$dbUser</span>, <span class="re0">$dbPass</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$dbh</span>-&gt;<span class="me1">exec</span><span class="br0">&#40;</span><span class="st0">&#039;SET CHARACTER SET utf8&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$stmt</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">prepare</span><span class="br0">&#40;</span><span class="st0">&#039;DELETE FROM notes WHERE id=?&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$stmt</span>-&gt;<span class="me1">execute</span><span class="br0">&#40;</span><span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$id</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">null</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#039;OK&#039;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">catch <span class="br0">&#40;</span>PDOException <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#039;Не могу удалить запись&#039;</span>;</div>
</li>
<li class="li2">
<div class="de2"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// end of removenote.php</span></div>
</li>
</ol>
</div>
<p>Подробно останавливаться на нем, по-моему, нет смысла. Основное отличие от предыдущих скриптов – в запросе, который выполняется.</p>
<p>На этом этапе серверная часть приложения полностью готова. Мы можем редактировать, создавать, удалять и читать наши записи.</p>
<p>В следующий раз мы рассмотрим клиентскую часть приложения. Там же выложу архив с исходниками.</p>
<p>Если есть вопросы, замечания или предложения, пишите, буду рад ответить.</p>
<p><strong>Интересно почитать.</strong></p>
<p><a href="http://www.alik.su/articles/perfect-ajax/">«Совершенный Ajax» –<br />
<span style="font-size:90%">новый подход к построению настоящих клиент-серверных web-приложений</span><br />
</a></p>
<p>Сервис <a href=http://gamepay.by/>покупки игровой<br />
 валюты</a> практически для любой<br />
 онлайн игры. Большое количество способов оплаты - webmoney, sms,<br />
 paypal, наличными и др.</p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/6I4ELTYbuT0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/sozdayom-vidzhet-dlya-xraneniya-zametok-chast-1.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>jQuery Grid Plugin - "продвинутое" решение для создания таблиц</title>
		<link>http://www.simplecoding.org/jquery-grid-plugin-prodvinutoe-reshenie-dlya-sozdaniya-tablic.html</link>
		<comments>http://www.simplecoding.org/jquery-grid-plugin-prodvinutoe-reshenie-dlya-sozdaniya-tablic.html#comments</comments>
		<pubDate>Fri, 22 May 2009 20:07:11 +0000</pubDate>
		<dc:creator>Владимир</dc:creator>
		
		<category><![CDATA[Ajax]]></category>

		<category><![CDATA[HTML]]></category>

		<category><![CDATA[JavaScript]]></category>

		<category><![CDATA[PHP]]></category>

		<category><![CDATA[Web разработка]]></category>

		<guid isPermaLink="false">http://www.simplecoding.org/?p=836</guid>
		<description><![CDATA[
Сегодня речь пойдет о плагине для jQuery, предназначенном для отображения табличных данных. Я наткнулся на него практически случайно. Просто раньше я и не задумывался о том, что может существовать настолько мощное решение для таблиц. Ведь в большинстве случаев данные можно показать с помощью обычной html таблицы.
jQuery Grid Plugin имеет смысл использовать если нужно работать с [...]]]></description>
			<content:encoded><![CDATA[<img src="http://www.simplecoding.org/wp-content/uploads/2009/05/jqgrid.png" alt="jqgrid" title="jqgrid" width="400" height="158" class="size-full wp-image-838" />
<p>Сегодня речь пойдет о плагине для <a href="http://jquery.com/">jQuery</a>, предназначенном для <strong>отображения табличных данных</strong>. Я наткнулся на него практически случайно. Просто раньше я и не задумывался о том, что может существовать настолько мощное решение для таблиц. Ведь в большинстве случаев данные можно показать с помощью обычной html таблицы.</p>
<p><a href="http://www.trirand.com/blog/">jQuery Grid Plugin</a> имеет смысл использовать если нужно работать с <strong>большими</strong> таблицами. Дело в том, что плагин существенно упрощает разбивку данных на страницы. Т.е. автоматически создается панель с кнопками перелистывания страниц, а новые данные подгружаются с помощью <strong>AJAX</strong>. Кроме того, плагин имеет кучу дополнительных функций и несколько тем оформления.</p>
<p>От вас требуется настроить плагин и передавать ему данные. Звучит не сложно, но как всегда есть нюансы.</p>
<p>Чтобы не ходить вокруг да около, давайте рассмотрим небольшой пример.</p>
<p>Хочу сразу предупредить. Этот пример максимально упрощен и не заменяет <a href="http://www.secondpersonplural.ca/jqgriddocs/index.htm">документацию</a>. Он поможет понять только общий принцип работы плагина. В реальном приложении вам придется сделать кучу дополнительных настроек.</p>
<p>Кстати, есть <a href="http://trirand.com/jqgrid/jqgrid.html">демонстрационная страница</a> со множеством интересных примеров.</p>
<p><strong>Сформулируем задачу.</strong></p>
<p>Допустим, у нас есть небольшая таблица (в базе данных) с данными пользователей (фамилия, имя, отчество). Нужно создать html страничку с этими данными, причем передаваться они будут в формате <strong>JSON</strong> (это не единственный формат, который поддерживает плагин, но, на мой взгляд, наиболее удобный).</p>
<p>Прежде всего, скачиваем плагин и распаковываем в папку с проектом.</p>
<p>Создаём файлы index.html (наша страничка) и getdata.php (серверный скрипт, который будет получать данные из БД и отправлять их браузеру).</p>
<p>Скачиваем библиотеку jQuery.</p>
<p>В результате должна получиться следующая структура папок.</p>
<pre>index.html
getdata.php
jquery-1.3.1.min.js
jquery.jqGrid.js
/js
	...
/themes
	...</pre>
<p>Рассмотрим структуру нашей страницы.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;</span>?xml <span class="kw3">version</span>=<span class="st0">&quot;1.0&quot;</span> encoding=<span class="st0">&quot;UTF-8&quot;</span>?<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc0">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;html</span> xmlns=<span class="st0">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml:<span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span> <span class="kw3">lang</span>=<span class="st0">&quot;en&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;head&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;title&gt;</span></span>Использование jqGrid<span class="sc2"><span class="kw2">&lt;/title&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;content-type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/html;charset=utf-8&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;meta</span> <span class="kw3">http-equiv</span>=<span class="st0">&quot;Content-Style-Type&quot;</span> <span class="kw3">content</span>=<span class="st0">&quot;text/css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span>=<span class="st0">&quot;screen&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;themes/basic/grid.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;link</span> <span class="kw3">rel</span>=<span class="st0">&quot;stylesheet&quot;</span> <span class="kw3">type</span>=<span class="st0">&quot;text/css&quot;</span> <span class="kw3">media</span>=<span class="st0">&quot;screen&quot;</span> <span class="kw3">href</span>=<span class="st0">&quot;themes/jqModal.css&quot;</span> /<span class="kw2">&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/head&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;table</span> <span class="kw3">id</span>=<span class="st0">&quot;list&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;scroll&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/table&gt;</span></span> </div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;div</span> <span class="kw3">id</span>=<span class="st0">&quot;pager&quot;</span> <span class="kw3">class</span>=<span class="st0">&quot;scroll&quot;</span> <span class="kw3">style</span>=<span class="st0">&quot;text-align:center;&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/div&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;jquery-1.3.1.min.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span> <span class="kw3">src</span>=<span class="st0">&quot;jquery.jqGrid.js&quot;</span><span class="kw2">&gt;</span></span><span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;script</span> <span class="kw3">type</span>=<span class="st0">&quot;text/javascript&quot;</span><span class="kw2">&gt;</span></span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; jQuery(document).ready(function(){ </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; jQuery(&quot;#list&quot;).jqGrid({</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; url:&#039;getdata.php&#039;,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; datatype: &#039;json&#039;,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; mtype: &#039;POST&#039;,</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; colNames:['#', 'Фамилия', 'Имя', 'Отчество'],</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; colModel :[</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {name:'id', index:'id', width:30}</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,{name:'surname', index:'surname', width:80, align:'right'}</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,{name:'fname', index:'fname', width:90}</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ,{name:'lname', index:'lname', width:80, align:'right'}</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ],</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pager: jQuery(&#039;#pager&#039;),</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rowNum:5,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; rowList:[5,10,30],</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sortname: &#039;id&#039;,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sortorder: &quot;asc&quot;,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; viewrecords: true,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imgpath: &#039;themes/basic/images&#039;,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; caption: &#039;Данные пользователей&#039;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; }); </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; }); </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="sc2"><span class="kw2">&lt;/script&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/body&gt;</span></span></div>
</li>
<li class="li1">
<div class="de1"><span class="sc2"><span class="kw2">&lt;/html&gt;</span></span></div>
</li>
</ol>
</div>
<p>Прежде всего, обратите внимание на строки 13 и 14, в которых мы подключили файлы со стилями. В этом примере используется тема <code>basic</code>, но, естественно, её можно изменить.</p>
<p>В теле страницы мы создаем таблицу (строка 17) и панель навигации (тег <code>div</code>, строка 18). На данный момент они пустые, их содержимое будет создано плагином.</p>
<p>После этого, мы подключаем библиотеку jQuery, jQuery Grid Plugin и создаём скрипт с настройками (строки 23-44). На них мы остановимся отдельно.</p>
<p><code>url </code>– адрес скрипта, формирующего массив с данными;<br />
<code>datatype </code>– формат данных;<br />
<code>mtype </code>– метод отправки запроса;<br />
<code>colNames </code>– названия столбцов (используются в качестве заголовков таблицы);<br />
<code>colModel </code>– параметры полей (значения и количество этих элементов должны соответствовать формату передаваемых данных);<br />
<code>pager </code>– id блока в котором будет размещена навигационная панель;<br />
<code>rowNum </code>– количество строк в таблице;<br />
<code>rowList </code>– этот массив используется для настройки выпадающего списка, который пользователь может использовать для изменения количества строк в таблице;<br />
<code>sortname </code>– поле, которое по-умолчанию используется для сортировки;<br />
<code>sortorder </code>– порядок сортировки (в данном случае возрастающий);<br />
<code>viewrecords </code>– указывает, нужно ли показывать в панели управления общее количество записей;<br />
<code>imgpath </code>– размещение папки с изображениями;<br />
<code>caption </code>– заголовок таблицы.</p>
<p>Настройки достаточно простые, но очень важно их <strong>внимательно</strong> заполнить.</p>
<p>Теперь <strong>создаем базу данных и таблицу в ней</strong> (вы можете импортировать файл <code>users.sql</code> из архива с этим примером, ссылка внизу страницы).</p>
<p>После этого займемся PHP скриптом.</p>
<div class="dean_ch" style="white-space: nowrap;">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">&lt;?php</span></div>
</li>
<li class="li1">
<div class="de1">try <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//читаем параметры</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$curPage</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;page&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$rowsPerPage</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;rows&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$sortingField</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;sidx&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$sortingOrder</span> = <span class="re0">$_POST</span><span class="br0">&#91;</span><span class="st0">&#039;sord&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//подключаемся к базе</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$dbh</span> = <span class="kw2">new</span> PDO<span class="br0">&#40;</span><span class="st0">&#039;mysql:host=localhost;dbname=name&#039;</span>, <span class="st0">&#039;user&#039;</span>, <span class="st0">&#039;pass&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//указываем, мы хотим использовать utf8</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$dbh</span>-&gt;<span class="me1">exec</span><span class="br0">&#40;</span><span class="st0">&#039;SET CHARACTER SET utf8&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//определяем количество записей в таблице</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$rows</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#039;SELECT COUNT(id) AS count FROM users&#039;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$totalRows</span> = <span class="re0">$rows</span>-&gt;<span class="me1">fetch</span><span class="br0">&#40;</span>PDO::<span class="me2">FETCH_ASSOC</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$firstRowIndex</span> = <span class="re0">$curPage</span> * <span class="re0">$rowsPerPage</span> - <span class="re0">$rowsPerPage</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//получаем список пользователей из базы</span></div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$res</span> = <span class="re0">$dbh</span>-&gt;<span class="me1">query</span><span class="br0">&#40;</span><span class="st0">&#039;SELECT * FROM users ORDER BY &#039;</span>.<span class="re0">$sortingField</span>.<span class="st0">&#039; &#039;</span>.<span class="re0">$sortingOrder</span>.<span class="st0">&#039; LIMIT &#039;</span>.<span class="re0">$firstRowIndex</span>.<span class="st0">&#039;, &#039;</span>.<span class="re0">$rowsPerPage</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; </div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="co1">//сохраняем номер текущей страницы, общее количество страниц и общее количество записей</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$response</span>-&gt;<span class="me1">page</span> = <span class="re0">$curPage</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$response</span>-&gt;<span class="me1">total</span> = <span class="kw3">ceil</span><span class="br0">&#40;</span><span class="re0">$totalRows</span><span class="br0">&#91;</span><span class="st0">&#039;count&#039;</span><span class="br0">&#93;</span> / <span class="re0">$rowsPerPage</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; <span class="re0">$response</span>-&gt;<span class="me1">records</span> = <span class="re0">$totalRows</span><span class="br0">&#91;</span><span class="st0">&#039;count&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="re0">$i</span>=<span class="nu0">0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">while</span><span class="br0">&#40;</span><span class="re0">$row</span> = <span class="re0">$res</span>-&gt;<span class="me1">fetch</span><span class="br0">&#40;</span>PDO::<span class="me2">FETCH_ASSOC</span><span class="br0">&#41;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$response</span>-&gt;<span class="me1">rows</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#93;</span>=<span class="re0">$row</span><span class="br0">&#91;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#93;</span>;</div>
</li>
<li class="li2">
<div class="de2">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$response</span>-&gt;<span class="me1">rows</span><span class="br0">&#91;</span><span class="re0">$i</span><span class="br0">&#93;</span><span class="br0">&#91;</span><span class="st0">&#039;cell&#039;</span><span class="br0">&#93;</span>=<span class="kw3">array</span><span class="br0">&#40;</span><span class="re0">$row</span><span class="br0">&#91;</span><span class="st0">&#039;id&#039;</span><span class="br0">&#93;</span>, <span class="re0">$row</span><span class="br0">&#91;</span><span class="st0">&#039;surname&#039;</span><span class="br0">&#93;</span>, <span class="re0">$row</span><span class="br0">&#91;</span><span class="st0">&#039;fname&#039;</span><span class="br0">&#93;</span>, <span class="re0">$row</span><span class="br0">&#91;</span><span class="st0">&#039;lname&#039;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$i</span>++;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> json_encode<span class="br0">&#40;</span><span class="re0">$response</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li2">
<div class="de2">catch <span class="br0">&#40;</span>PDOException <span class="re0">$e</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">echo</span> <span class="st0">&#039;Database error: &#039;</span>.<span class="re0">$e</span>-&gt;<span class="me1">getMessage</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1">// end of getdata.php</span></div>
</li>
</ol>
</div>
<p>Прежде всего, обратите внимание на <strong>параметры, которые передаются в запросе</strong> (строки 4-7). С их помощью плагин указывает, какую страницу данных он хочет получить, а также по какому полю и в каком порядке она должна быть отсортирована.</p>
<p>После этого, мы <strong>получаем данные</strong>. В этом примере для работы с базой мы использовали библиотеку PDO (параметры подключения к базе вам, конечно, нужно будет указать свои, строка 10).</p>
<p><em>Обратите внимание</em>. Скрипт максимально упрощен, т.е. убрана проверку параметров, которые передает плагин. В реальном приложении так делать НЕЛЬЗЯ.</p>
<p>Затем мы формируем объект с данными (<code>$response</code>).</p>
<p>В параметрах этого объекта нужно передать:</p>
<p>- номер текущей страницы (<code>$response-&gt;page</code>);<br />
- количество страниц (<code>$response-&gt;total</code>);<br />
- общее количество записей (<code>$response-&gt;records</code>);<br />
- сами данные (<code>$response-&gt;rows</code>).</p>
<p>Формат, в котором нужно сохранять данные, можно изменить. Для этого придется изменить настройки плагина (в документации раздел Retrieving Data -&gt; JSON Data).</p>
<p>В конце скрипта мы преобразуем данные в JSON формат и отправляем браузеру (строка 33).</p>
<p>Все, задача решена. Если хотите поэкспериментировать, <strong>качайте архив с примером</strong></p>
<p><a href='http://www.simplecoding.org/wp-content/uploads/2009/05/jqgrid.zip'><img src="http://www.simplecoding.org/wp-content/themes/three_cols/images/download_btn_blue.png" alt="архив с исходным кодом" /></a></p>
<p><strong>Заключение</strong></p>
<p>Этот пример не раскрывает и 10% возможностей плагина. Например, вы можете встраивать inline редакторы для строк, изменять оформление, использовать другие форматы данных (тот же <strong>xml</strong>), создавать вложенные таблицы и т.п.</p>
<p>В общем, очень удобный инструмент.</p>
<p>Если у вас возникли вопросы, есть советы или замечания, не стесняйтесь, пишите их в комментариях. Буду рад ответить или обсудить <img src='http://www.simplecoding.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p><strong>Интересно почитать</strong></p>
<p><a href="http://www.alik.su/articles/10-ugly-programming-techniques/">Хрупкая красота программного кода:<br /> <span style="font-size:85%">10 приемов, способных ее разрушить</span></a> </p>
<img src="http://feeds.feedburner.com/~r/simplecoding/~4/s1pRnLjjJWM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.simplecoding.org/jquery-grid-plugin-prodvinutoe-reshenie-dlya-sozdaniya-tablic.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
