<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.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/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Блог маленького, но очень отважного программиста</title>
	
	<link>http://xo66ut.ru</link>
	<description>PHP, MySQL, Javascript, JQuery, ExtJS, UML, и другие интернетости...…</description>
	<lastBuildDate>Tue, 04 Oct 2011 08:40:28 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<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" type="application/rss+xml" href="http://feeds.feedburner.com/Xo66uT" /><feedburner:info uri="xo66ut" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>Xo66uT</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>codelifehack: Особенности работы со строками в PHP</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/W1euLzvqM_Q/632</link>
		<comments>http://xo66ut.ru/archives/632#comments</comments>
		<pubDate>Tue, 04 Oct 2011 08:38:18 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[codelifehack]]></category>
		<category><![CDATA[Программирование на PHP]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=632</guid>
		<description><![CDATA[Сложение строковых переменных содержащих цифры.
Что делает?
При сложении двух переменных типа String, содержащих в начале этих переменных цифры, эти цифры складываются.
Пример:


$a = &#34;1500 стр.&#34;;

$b = &#34;2500 стр.&#34;;

echo $a + $b; // 4000

Возможная проблема при использовании.
Данная особенность языка работает только, если цифры находятся сначала строки, если это не так ($a = &#8220;количество 1500 страниц&#8221;), то сложения цифровых [...]]]></description>
			<content:encoded><![CDATA[<h2>Сложение строковых переменных содержащих цифры.</h2>
<h3>Что делает?</h3>
<p>При сложении двух переменных типа <em>String</em>, содержащих в начале этих переменных цифры, эти цифры складываются.</p>
<h3>Пример:</h3>
<pre class="brush: php;">

$a = &quot;1500 стр.&quot;;

$b = &quot;2500 стр.&quot;;

echo $a + $b; // 4000
</pre>
<h3>Возможная проблема при использовании.</h3>
<p>Данная особенность языка работает только, если цифры находятся сначала строки, если это не так (<strong>$a = &#8220;количество 1500 страниц&#8221;</strong>), то сложения цифровых частей строки не произойдет, отбрасывается только правая часть.</p>
<h3>Применение.</h3>
<p>Основная польза от применения это скорость в сравнении с применением регулярного выражения (<strong>&#8220;/[0-9]{1,}/i&#8221;</strong>).  Однако будьте внимательны и применяйте, когда точно уверены, что символов перед цифрами не будет</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=632&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/W1euLzvqM_Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/632/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/632</feedburner:origLink></item>
		<item>
		<title>codelifehack: Частично скрываем email’ы, которые получаем из БД</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/q_ybzPYqZBc/625</link>
		<comments>http://xo66ut.ru/archives/625#comments</comments>
		<pubDate>Wed, 07 Sep 2011 12:53:59 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[codelifehack]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=625</guid>
		<description><![CDATA[Времени писать полноценные посты практически нет, ввиду большой загруженности проектами, поэтому буду пробовать новый формат, который я решил назвать codelifehack, это всевозможные полезные советы в областях и языках программирования с которыми мне приходится работать.
Итак первый.
Частично скрываем email&#8217;ы, которые получаем из БД.
Что делает?
Скрывает часть символов в email, чтобы нельзя было его использовать в плохих целях.
Пример.

SELECT
 INSERT(user_info.email, [...]]]></description>
			<content:encoded><![CDATA[<p>Времени писать полноценные посты практически нет, ввиду большой загруженности проектами, поэтому буду пробовать новый формат, который я решил назвать codelifehack, это всевозможные полезные советы в областях и языках программирования с которыми мне приходится работать.<br />
Итак первый.</p>
<h2>Частично скрываем email&#8217;ы, которые получаем из БД.</h2>
<h3>Что делает?</h3>
<p>Скрывает часть символов в email, чтобы нельзя было его использовать в плохих целях.</p>
<h3>Пример.</h3>
<pre class="brush: sql;">
SELECT
 INSERT(user_info.email, 3, 4, '...') AS modif_email,
 user_info.name,
 user_info.surname
 FROM
 user_info
</pre>
<p>Нас здесь интересует строчка:</p>
<pre class="brush: sql;">
SELECT
 INSERT(user_info.email, 3, 4, '...') AS modif_email,
</pre>
<p>Функция (именно функция, есть еще другой INSERT) INSERT заменяет 4 символа начиная с третьего на символы &#8220;&#8230;&#8221; (три точки) в строке user_info.email. Краткое описание функции INSERT(str,pos,len,newstr)</p>
<h3>Возможная проблема при использовании.</h3>
<p>Наша замена может попасть на символы которые при замене выдадут полноценный email, пока коллизий не выявлено.</p>
<h3>Применение.</h3>
<p>Нам нужно построить рейтинг пользователей, но по понятным причинам мы не можем показывать на сайте email&#8217;ы наших пользователей.<br />
Нам нужно показать что мы знаем email пользователя (который оставил предложение о продаже на сайте) и при определенных условия мы готовы его показать.<br />
Ну и конечно же ваш вариант.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=625&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/q_ybzPYqZBc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/625/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/625</feedburner:origLink></item>
		<item>
		<title>Впечатления от ZFConf</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/Qau77rV3psA/592</link>
		<comments>http://xo66ut.ru/archives/592#comments</comments>
		<pubDate>Mon, 16 May 2011 13:15:55 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Zend Conf]]></category>
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=592</guid>
		<description><![CDATA[
В воскресенье (15.05) побывал на конференции ZFConf. Хочу поделиться своими впечатлениями.
Организация и проведение.
Конференция проходила в Санкт-Петербурге, у станции метро &#8220;Электросила&#8221;, что примечательно, место, где проходила конференция, находится в 50 метрах от метро, вышел из него и ты уже на месте. Сам зал просторный, хорошо оборудованный. Для каких целей его использует Ленгипротранс (организация, на территории которой [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><a href="http://www.zfconf.ru/"><img class="aligncenter size-full wp-image-491" style="border: 0pt none;padding:20px;" title="ZFConf" src="http://www.zfconf.ru/bitrix/templates/books/images/logo.png" alt="Логотип ZFConf" /></a></div>
<p>В воскресенье (15.05) побывал на конференции ZFConf. Хочу поделиться своими впечатлениями.</p>
<h2>Организация и проведение.</h2>
<p>Конференция проходила в Санкт-Петербурге, у станции метро &#8220;Электросила&#8221;, что примечательно, место, где проходила конференция, находится в 50 метрах от метро, вышел из него и ты уже на месте. Сам зал просторный, хорошо оборудованный. Для каких целей его использует Ленгипротранс (организация, на территории которой проходила конференция), я не знаю, но по-моему зал можно использовать даже как кинотеатр. Хороший проектор, отличный звук, помогала также хорошая акустика в зале. Все доклады проходили строго по плану, никто чужое время не занимал, никакой суматохи и опозданий докладчиков. На кофе-брейках никаких проблем с едой и напитками не было, возможно дело в сторонней кетеринговой компании, не знаю, но организаторы молодцы.  Вообще вся организация на пять с плюсом.</p>
<h2>Доклады и докладчики.</h2>
<p>Все доклады я оцениваю с точки зрения полезности для меня, поэтому не обессудьте.</p>
<ul>
<li><strong>История разработки собственного ORM<br />
</strong>К сожалению этот доклад я проспал, все таки воскресенье.</li>
<li><strong> </strong><strong>Воюем за ресурсы<br />
</strong>Алексей Качаев &#8211; молодец, &#8220;<em>сделал конференцию</em>&#8220;, отличный рассказчик, все четко, ясно и по делу. Алексей выступил с двумя докладами, суммарно говорил около 2-х часов. Сам он участник проекта ZF, поэтому ему было что рассказать. Рассказ был по результатам оптимизации конкретного проекта с примерами и кодом, который Алексей выложил на gihub. Меня как раз интересовала подобная реализация для уменьшения нагрузки. Как представится возможность обязательно попробую.</li>
<li><strong>Behavior Driven Development<br />
</strong>Отличный доклад, пища для размышления team лидам и менеджерам, использование актуально в компании в целом или в проектах. Мне как разработчику было интересно конкретное применение и возможности.</li>
<li><strong>Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue<br />
</strong>Отличный доклад, некая &#8220;<em>альтернатива</em>&#8221; использованию метода Алексея Качаева по экономии ресурсов. К сожалению инструмент <strong>Job Queue </strong>платный, что-то в районе 4к зеленых в год. Альтернативный gearman хорош, но пока без визуальных инструментов, хотя проект развивается. Доклад был с практической точки зрения и по результатам собственного применения в компании докладчика.</li>
<li><strong>Как может помочь среда разработки при написании приложения на Zend Framework?<br />
</strong>о чем был доклад неясно, какая связь с ZF, тоже не ясно. Просто мини-тур по основным возможностям PhpStorm, 90% которых сейчас есть в любой IDE.</li>
<li><strong>Что такое Sphinx<br />
</strong>доклад слишком поверхностный для тех доклада, опять же непонятно как связан с темой Zend Fw, хотя нужно отдать должное &#8211; докладчик отличный, да и ему было что рассказать, судя по общению в кулуарах. Возможно, что конкретно рассказывать, он решал в последний момент. Об этом свидетельствует так же то, что были полностью английские слайды, &#8220;<span style="text-decoration: line-through;">давно лежащие в запасниках</span>&#8221; подготовленные для зарубежной аудитории. Хотя с английским у меня проблем нет, но многие термины все же вызывали проблему. Как кто-то справедливо заметил в зале: &#8220;А можно перевод?&#8221;</li>
<li><strong>Создание REST-API для сторонних разработчиков<br />
</strong>доклад не плохой, но для меня все это было уже известно. Да и доклад был коротким для такой большой темы, кто уже знаком с oAuth (таких в зале было человек 5-10) ничего нового не узнал, кто нет, опять же получил только поверхностную информацию.</li>
<li><strong>Гибкая архитектура Zend Framework приложений с использованием Dependency Injection<br />
</strong>Отличнейший доклад от Алексея. Был мини &#8220;<em>инсайд</em>&#8220;, Алексей рассказал о планах реализации DI в будущей версии ZF 2.0.</li>
</ul>
<p>По-моему мнению, докладчиками на подобных конференциях должны быть практикующие разработчики, понятно, что среди нас, не много людей владеют нормальной связной речью, но такие есть.<br />
Да, как я уже писал, проспал первый доклад, как мне кажется, следовало бы изменить время, начать с 10 или 11, все таки программисты &#8211; люди любящие поспать.</p>
<p>Все написанное относится только к моему видению конференции, судя по количеству присутствующих конкретно ZF интересует не так много людей, поэтому, я так понимаю, была цель разнообразить количество участников докладами связанными просто с PHP и хайлоад (Sphinx). Полностью относящихся к ZF докладов было всего 4.<br />
Конференция очень понравилась, &#8220;<em>хочу еще</em>&#8220;.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=592&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/Qau77rV3psA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/592/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/592</feedburner:origLink></item>
		<item>
		<title>Добавление индикатора загрузки в JQuery</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/Ot0GVhcR8Ss/580</link>
		<comments>http://xo66ut.ru/archives/580#comments</comments>
		<pubDate>Thu, 05 May 2011 11:49:26 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JQuery]]></category>
		<category><![CDATA[$.ajax]]></category>
		<category><![CDATA[$.ajaxSetup]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=580</guid>
		<description><![CDATA[
Любой пользовательский интерфейс, даже самый примитивный, сегодня не обходится без ajax запросов. Хорошо когда запросы проходят практически мгновенно, благодаря большой скорости соединения пользователя или по другим причинам, но что делать когда запрос длится очень долго? Нужно как-то сообщить пользователю, что все хорошо, скрипт не повис, отправка данных идет, &#8220;полет нормальный&#8221;. Для этого обычно отображают индикатор [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img class="aligncenter size-full wp-image-491" style="border: 0pt none;background-color:#39414A;padding:20px;" title="JQuery" src="http://static.jquery.com/files/rocker/images/logo_jquery_215x53.gif" alt="jquery" width="215" height="53" /></div>
<p>Любой пользовательский интерфейс, даже самый примитивный, сегодня не обходится без ajax запросов. Хорошо когда запросы проходят практически мгновенно, благодаря большой скорости соединения пользователя или по другим причинам, но что делать когда запрос длится очень долго? Нужно как-то сообщить пользователю, что все хорошо, скрипт не повис, отправка данных идет, &#8220;полет нормальный&#8221;. Для этого обычно отображают индикатор загрузки.</p>
<p>Используя JQuery.ajax очень легко отобразить и убрать индикатор загрузки когда это необходимо. Для этого существуют 2 события <em>beforeSend </em>и <em>complete</em>, на которые легко повесить соответствующее отображение индикатора.  Ниже я создаю div по событию<em> beforeSend</em> (запрос начался) и уничтожаю его по событию <em>complete </em>(запрос завершен).</p>
<pre class="brush: css;">
div.ds-loading {
 background-image: url(&quot;/images/admin/loader.gif&quot;);
 background-repeat: no-repeat;
 position: fixed;
 width: 126px;
 height: 22px;
 z-index: 11111;
}
</pre>
<pre class="brush: jscript;">
$.ajax({
  url: '/admin/photos/delete',
  data: &quot;photo_id=&quot; + photo_id,
  success: function(){
  },
  beforeSend: function(){
    //создаем div
    var loading = $(&quot;&lt;div&gt;&quot;, {
      &quot;class&quot; : &quot;ds-loading&quot;
    });
    //выравним div по центру страницы
    $(loading).css(&quot;top&quot;, ($(window).height()/2)-($(loading).height()/2)).css(&quot;left&quot;, ($(document).width()/2)-($(loading).width()/2));
    //добавляем созданный div в конец документа
    $(&quot;body&quot;).append(loading);
  },
  complete: function() {
    //уничтожаем div
    $(&quot;.ds-loading&quot;).detach();
  }
});
</pre>
<p>Но что делать, если таких запросов очень много? Вешать на каждый ajax запрос обработчики событий? Благодаря тому, что в JQuery 1.5 добавили дополнительные методы для работы с ajax, стало возможным, легко и непринужденно отобразить индикатор для всех JQuery ajax запросов выполняющийся на сайте, с помощью метода <strong>$.ajaxSetup</strong>. Просто добавляем следующий код перед началом первого ajax-запроса.</p>
<pre class="brush: jscript;">
$.ajaxSetup({
  beforeSend: function(){
    //создаем div
    var loading = $(&quot;&lt;div&gt;&quot;, {
      &quot;class&quot; : &quot;ds-loading&quot;
    });
    //выравним div по центру страницы
    $(loading).css(&quot;top&quot;, ($(window).height()/2)-($(loading).height()/2)).css(&quot;left&quot;, ($(document).width()/2)-($(loading).width()/2));
    //добавляем созданный div в конец документа
    $(&quot;body&quot;).append(loading);
  },
  complete: function() {
    //уничтожаем div
    $(&quot;.ds-loading&quot;).detach();
  }
});
</pre>
<p>Теперь нам не нужно вешать обработчики событий на каждый вызов JQuery.ajax, этот функционал теперь &#8220;преднастроен&#8221; в каждом вызове.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=580&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/Ot0GVhcR8Ss" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/580/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/580</feedburner:origLink></item>
		<item>
		<title>Снова Zend_Date и локализация</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/qm0MbtUXMcY/565</link>
		<comments>http://xo66ut.ru/archives/565#comments</comments>
		<pubDate>Wed, 19 Jan 2011 17:26:41 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Программирование на PHP]]></category>
		<category><![CDATA[Zend_Date]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=565</guid>
		<description><![CDATA[
Небольшой lifehack zendhack, по получению списка названий месяцев\дней для отображения в view.
Как нам всем известно русский язык очень сильно отличается от других языков, а самое главное он кардинально отличается от английского. В Zend_Framework, как и во многих других фреймворках локализация и функции локализации сделаны с оглядкой на английский язык. Иногда это становится причиной проблем.
Проблема
Я столкнулся [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img class="aligncenter size-full wp-image-491" style="border: 0pt none;" title="zend_framework" src="http://xo66ut.ru/wp-content/uploads/2010/08/zend_framework2.jpg" alt="zend_framework" width="282" height="174" /></div>
<p>Небольшой <span style="text-decoration: line-through;">lifehack</span> zendhack, по получению списка названий месяцев\дней для отображения в view.</p>
<p>Как нам всем известно русский язык очень сильно отличается от других языков, а самое главное он кардинально отличается от английского. В Zend_Framework, как и во многих других фреймворках локализация и функции локализации сделаны с оглядкой на английский язык. Иногда это становится причиной проблем.</p>
<h2>Проблема</h2>
<p>Я столкнулся со следующей, мне необходимо было вывести список названий месяцев в году, все бы хорошо, но в русском языке названия месяцев могут быть не только в именительном падеже, но и в родительном, в отличие от английского (<em>February, Февраль -&gt; Февраля</em>). А Zend_Framework в результате  следующего кода:</p>
<pre class="brush: php;">
$datearray = array('year' =&gt; $date-&gt;toString(&quot;yyyy&quot;), 'month' =&gt; '2');
$other_date = new Zend_Date($datearray);
$other_date-&gt;get(Zend_Date::MONTH_NAME);
</pre>
<p>выводит только месяц в родительном падеже.</p>
<h2>Решение</h2>
<p>Покопавшись в классе Date метода для вывода месяца в именительном падеже я не нашел. Тогда я полез в xml файл с переводом (Zend/Locale/Data/ru.xml) и там увидел, что раздел с месяцами в именительном падеже присутствует. Посмотрев как обычные методы Zend_Date получают информацию из файла с переводом, я нашел способ как можно вывести имя месяца.</p>
<pre class="brush: php;">
Zend_Locale_Data::getContent(&quot;ru_RU&quot;, 'month', array('gregorian', 'stand-alone', 'wide', $i));
</pre>
<p>где <strong>$i</strong> &#8211; номер месяца без лидирующего нуля (1..12)<br />
Кстати таким образом можно выводить любые данные из файла с переводом, просто идя по DOM структуре XML файла.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=565&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/qm0MbtUXMcY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/565/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/565</feedburner:origLink></item>
		<item>
		<title>Форматирование даты средствами Zend_Framework и не только.</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/yseaUdCBRfY/554</link>
		<comments>http://xo66ut.ru/archives/554#comments</comments>
		<pubDate>Mon, 10 Jan 2011 17:11:27 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Программирование на PHP]]></category>
		<category><![CDATA[Zend_Date]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=554</guid>
		<description><![CDATA[
В любом нормальном проекте не избежать форматирования даты, чтобы не тратить время на реализацию своих методов и функций я хочу рассказать как быстро отформатировать дату средствами MySQL и Zend_Date.
Форматирование с помощью Zend_Date.
Для быстрого форматирования даты при выводе ее пользователю я предлагаю создать помощник вида.
Для этого создаем простой viewHelper (application/view/helpers), я назвал его DateHelper:

&#60;?php
/**
 *
 * [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img class="aligncenter size-full wp-image-491" style="border: 0pt none;" title="zend_framework" src="http://xo66ut.ru/wp-content/uploads/2010/08/zend_framework2.jpg" alt="zend_framework" width="282" height="174" /></div>
<p>В любом нормальном проекте не избежать форматирования даты, чтобы не тратить время на реализацию своих методов и функций я хочу рассказать как быстро отформатировать дату средствами MySQL и Zend_Date.</p>
<h2>Форматирование с помощью Zend_Date.</h2>
<p>Для быстрого форматирования даты при выводе ее пользователю я предлагаю создать помощник вида.<br />
Для этого создаем простой viewHelper (application/view/helpers), я назвал его <strong>DateHelper</strong>:</p>
<pre class="brush: php;">
&lt;?php
/**
 *
 * @author Roman
 * @version
 */
require_once 'Zend/View/Interface.php';
/**
 * DateHelper helper
 *
 * @uses viewHelper Zend_View_Helper
 */
class Zend_View_Helper_DateHelper
{
    /**
     * @var Zend_View_Interface
     */
    public $view;
    /**
     *
     */
    public function dateHelper($date_value, $format)
    {
        $locale = Zend_Registry::get('Zend_Locale');
        $date = new Zend_Date($date_value, false, $locale);
        return $date-&gt;toString($format);
    }
    /**
     * Sets the view field
     * @param $view Zend_View_Interface
     */
    public function setView (Zend_View_Interface $view)
    {
        $this-&gt;view = $view;
    }
}
</pre>
<p>Теперь мы можем использовать его в view скрипте следующим образом:</p>
<pre class="brush: php;">
$unformated_data = &quot;2011-01-30 12:21:11&quot;;
$this-&gt;dateHelper($unformated_data, &quot;dd MMMM&quot;); ?&gt;
</pre>
<p>Дата будет отформатирована в &#8220;<em>30 January</em>&#8220;. Для того чтобы дата выводилась с учетом локали (языка) нужно в файле <strong>Bootstrap.php</strong> добавить метод:</p>
<pre class="brush: php;">
protected function _initLocale()
{
    $locale = new Zend_Locale('ru_RU');
    Zend_Registry::set('Zend_Locale', $locale);
}
</pre>
<p>В данном случае наш помощник вида выведет &#8220;<em>30 января</em>&#8220;. Модификаторы даты можно посмотреть <a href="http://framework.zend.com/manual/1.11/ru/zend.date.constants.html">тут</a>.</p>
<h2>Форматирование средствами СУБД MySQL.</h2>
<p>Если вы получаете дату из базы, то не стоит забывать о встроенном форматировании даты в MySQL и других СУБД.</p>
<pre class="brush: plain;">
DATE_FORMAT('2011-01-30 12:21:11', '%d %M') AS FIELD_1
</pre>
<p>Функция <strong>DATE_FORMAT</strong> вернет нам &#8220;<em>30 January</em>&#8220;, подробнее модификаторы можно посмотреть <a href="http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_date-format">тут </a></p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=554&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/yseaUdCBRfY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/554/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/554</feedburner:origLink></item>
		<item>
		<title>Запоминаем положение интерфейса средствами JavaScript</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/jb_PMulQEGU/526</link>
		<comments>http://xo66ut.ru/archives/526#comments</comments>
		<pubDate>Wed, 13 Oct 2010 06:46:03 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[JQuery]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[ui]]></category>
		<category><![CDATA[userfriendly]]></category>
		<category><![CDATA[userinterface]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=526</guid>
		<description><![CDATA[
Очень важным моментом в интерфейсе сайта является сохранение его текущего положения, для того, чтобы после перезагрузки страницы, пользователю не пришлось заново повторять свои действия с настройкой интерфейса сайта под себя. Идеальным средством для хранения состояния пользовательского интерфейса является cookies. Всем известно как работать с куки с помощью серверных (backend) языков,  но зачастую проще это делать [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: center;"><a href="http://xo66ut.ru/wp-content/uploads/2010/10/uisave.jpg"><img class="aligncenter size-full wp-image-530" style="border: 0pt none;" title="uisave" src="http://xo66ut.ru/wp-content/uploads/2010/10/uisave.jpg" alt="" width="496" height="146" /></a></p>
<p>Очень важным моментом в интерфейсе сайта является сохранение его текущего положения, для того, чтобы после перезагрузки страницы, пользователю не пришлось заново повторять свои действия с настройкой интерфейса сайта под себя. Идеальным средством для хранения состояния пользовательского интерфейса является cookies. Всем известно как работать с куки с помощью серверных (backend) языков,  но зачастую проще это делать напрямую из JavaScript. Конечно можно передавать данные интерфейса серверной части, а там уже сохранять их хоть в БД. Но как правило, если вы не разрабатывайте новый интерфейс для gmail, нет необходимости делать это для 5-6 параметров.</p>
<h2>JavaScript и Cookies.</h2>
<p>В JavaScript есть стандартные методы для работы с document.cookie, именно так происходит обращение к куки в JavaScript. Например функция для установки куки будет выглядеть следующим образом</p>
<pre class="brush: jscript;">
function setCookie(c_name,value,expiredays)
 {
        var exdate=new Date();
        exdate.setDate(exdate.getDate()+expiredays);
        document.cookie=c_name+ &quot;=&quot; +escape(value)+
        ((expiredays==null) ? &quot;&quot; : &quot;;expires=&quot;+exdate.toUTCString());
 }
</pre>
<p>Как вы видите не очень удобно, поэтому я и предпочитаю пользоваться JQuery плагинами, если конечно фреймворк в проекте уже присутствует, если нет, то подключать JQuery, только из-за работы с куки не рационально.  В принципе взяв <a href="http://www.w3schools.com/js/js_cookies.asp" target="_blank">готовые функции</a> для document.cookie или написав их самостоятельно, можно свести неудобства и количество кода к минимуму.</p>
<h2>Плагины cookies для JQuery.</h2>
<p>Если в вашем сайте уже используется JQuery, то наиболее простой способ наладить работу с cookies, это использовать плагин. Плагинов довольно много я обычно использую <a href="http://code.google.com/p/ezcookie/">ezCookie</a>. В плагине содержатся стандартные методы для работы с cookies &#8211; установка, чтение, удаление. На странице проекта есть детальное описание всех методов. Плагин ezCookie отличается от многих подобных автоматическим распознаванием значения установленной cookie, и, если это JSON данные, то функция автоматически возвращает JSON объект. Такой режим работы позволяет устанавливать subcookie, то есть множества пар имя:значение для одного cookie (для одной cookie переменной).</p>
<h2>Сохранение положения интерфейса.</h2>
<p>Давайте напишем небольшой пример, который позволит понять схему сохранения простых позиций интерфейса. Пусть у нас будет 5 разноцветных квадратов, которые по клику на кнопку &#8220;закрыть&#8221; закрываются, и текст на кнопке меняется на &#8220;открыть&#8221;. И при нажатии на кнопку &#8220;открыть&#8221; соответственно квадрат снова становится видимым.</p>
<p>Для этого воспользуемся стандартной JQuery функцией toggle (переключатель), которая в качестве аргументов принимает 2 функции, одна из которых срабатывает на четном щелчке мыши, другая на нечетном. Чтобы сохранить положение квадратов, мы в первой toggle функции будем устанавливать значение cookie в 0, а на второй функции в 1, ноль означает, что квадрат скрыт, а единица соответственно, что квадрат виден.</p>
<p>Здесь я использую функцию ezCookie <strong>$.setSubCookie</strong>, чтобы не увеличивать количество записей cookie. Так как структурно записи для каждого квадрата у нас равны, то все проще хранить в одной cookie с именем &#8220;ui_save&#8221;. В качестве дополнительных параметров метод <strong>$.setSubCookie</strong> позволяет установить время жизни cookies, но в данном случае используется время жизни по умолчанию.</p>
<p>Итак позицию интерфейса в зависимости от действий пользователя мы записали, теперь нам необходимо сделать так, чтобы после загрузки страницы интерфейс возвращался в записанное состояние. Для этого мы сначала считаем нашу куку функцией <strong>$.cookie(&#8220;ui_save&#8221;)</strong>, эта функция автоматически определяет какое значение установлено в куке и если это JSON, то она возвращает JSON объект, что в нашем случае и происходит. Далее для каждого квадрата мы проверяем значение и если оно равно нулю то вызываем событие click, которое установит нужное положение квадрата.</p>
<pre class="brush: jscript;">
	$(document).ready(function(){
		$(&quot;.close&quot;).toggle(
			function(){
				$(this).prev().slideUp(); //скрываем квадрат
				$(this).html(&quot;Открыть&quot;);
				var class_name = $(this).prev().attr(&quot;class&quot;);
//устанавливаем значение куки для конкретного квадрата в положение закрыть
				$.setSubCookie(&quot;ui_save&quot;, class_name, 0);
			},
			function(){
				$(this).prev().slideDown(); //разворачиваем квадрат
				$(this).html(&quot;Закрыть&quot;);
				var class_name = $(this).prev().attr(&quot;class&quot;);
//устанавливаем значение куки для конкретного квадрата в положение открыт
				$.setSubCookie(&quot;ui_save&quot;, class_name, 1);
			}
		);

		//Устанавливаем необходимую позицию интерфейса
		var ck = $.cookie(&quot;ui_save&quot;);
		for(key in ck){
			if(ck[key] == 0){
//вызываем событие &quot;закрыть&quot;
				$(&quot;.&quot; + key).next().trigger('click');
			}
		}

	});
</pre>
<p>То что получилось можно посмотреть <a href="http://xo66ut.ru/examples/uisave/ui_example.html">здесь</a>, после обновления страницы позиция интерфейса (закрытые, открытые квадраты) сохраняется.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=526&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/jb_PMulQEGU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/526/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/526</feedburner:origLink></item>
		<item>
		<title>(Скринкаст) Замена курсора в Flash приложении</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/6to2jI7HC_w/505</link>
		<comments>http://xo66ut.ru/archives/505#comments</comments>
		<pubDate>Thu, 09 Sep 2010 14:04:35 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[ActionSript]]></category>
		<category><![CDATA[Программирование на Flash]]></category>
		<category><![CDATA[Скринкасты]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[AS3]]></category>
		<category><![CDATA[as3 замена курсора]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[FlashDevelop]]></category>
		<category><![CDATA[screencast]]></category>
		<category><![CDATA[скринкаст]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=505</guid>
		<description><![CDATA[
В этом обучающем видео-скринкасте я рассказываю о том как заменить курсор в Flash приложении на свой(картинку), средствами ActionScript3, для разработки используется бесплатный редактор FlashDevelop. Это мой первый скринкаст, поэтому просьба сильно не пинать. Предлагайте темы для новых скринкастов.

В продолжении скринкаста я расказываю как правильно позиционировать свой курсор-картинку, а так же, демонстрирую его работоспособность при клике.
]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;padding-bottom:10px;"><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/Odu0Zi6iYos?fs=1&amp;hl=ru_RU" /><param name="allowfullscreen" value="true" /><embed style="text-align: center;" type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/Odu0Zi6iYos?fs=1&amp;hl=ru_RU" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>В этом обучающем видео-скринкасте я рассказываю о том как заменить курсор в Flash приложении на свой(картинку), средствами ActionScript3, для разработки используется бесплатный редактор FlashDevelop. Это мой первый скринкаст, поэтому просьба сильно не пинать. Предлагайте темы для новых скринкастов.</p>
<div style="text-align: center;padding-bottom:10px;"><object style="text-align: center;" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="385" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/z-vNwr4Cb_M?hl=ru&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed style="text-align: center;" type="application/x-shockwave-flash" width="480" height="385" src="http://www.youtube.com/v/z-vNwr4Cb_M?hl=ru&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<p>В продолжении скринкаста я расказываю как правильно позиционировать свой курсор-картинку, а так же, демонстрирую его работоспособность при клике.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=505&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/6to2jI7HC_w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/505/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/505</feedburner:origLink></item>
		<item>
		<title>Добавление записей MySQL из одной таблицы в другую</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/SwASUunsKQg/498</link>
		<comments>http://xo66ut.ru/archives/498#comments</comments>
		<pubDate>Sun, 29 Aug 2010 10:16:33 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Refactoring]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=498</guid>
		<description><![CDATA[Хочу написать об очень полезной возможности MySQL, которая очень помогает в рефакторинге старой БД, точнее в переносе данных из старой БД в новую, имеющую другую структуру. В данном случае нам надо вставить в новую таблицу данные, которые мы выбираем из старой.
Давайте создадим для начала две таблицы:

CREATE database testdb;
USE testdb;

CREATE TABLE table1 (id int(10) auto_increment, fname [...]]]></description>
			<content:encoded><![CDATA[<p>Хочу написать об очень полезной возможности MySQL, которая очень помогает в рефакторинге старой БД, точнее в переносе данных из старой БД в новую, имеющую другую структуру. В данном случае нам надо вставить в новую таблицу данные, которые мы выбираем из старой.</p>
<p>Давайте создадим для начала две таблицы:</p>
<pre class="brush: sql;">
CREATE database testdb;
USE testdb;

CREATE TABLE table1 (id int(10) auto_increment, fname varchar(20), lname(20), primary key(id));
CREATE TABLE table2 (id int(10) auto_increment, firstname varchar(20), lastname(20), age int, primary key(id));
</pre>
<p>Теперь добавим немного данных в таблицу для работы:</p>
<pre class="brush: sql;">
INSERT INTO table2 (firstname, lastname, age)
 VALUES
 ('Ivan', 'Ivanov', 12),
 ('Petr', 'Petrov', 13),
 ('Alex', 'Kuznetsov', 39),
 ('Vladimir', 'Ivanov', 42)
</pre>
<p>Теперь мы можем внести во вторую таблицу данные из первой отфильтрованные по <strong>WHERE</strong>, притом обратите внимание вносятся все данные, которые мы выбираем из второй таблицы, то есть запрос <strong>INSERT </strong>повторяется для каждой строчки из второй таблицы.</p>
<pre class="brush: sql;">
INSERT INTO table1 (fname, lname) SELECT firstname, lastname FROM table2 WHERE age &lt;= 39;
</pre>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=498&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/SwASUunsKQg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/498/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/498</feedburner:origLink></item>
		<item>
		<title>Работа с DB в Zend Framework</title>
		<link>http://feedproxy.google.com/~r/Xo66uT/~3/W8YM-wYhNos/489</link>
		<comments>http://xo66ut.ru/archives/489#comments</comments>
		<pubDate>Fri, 27 Aug 2010 15:06:26 +0000</pubDate>
		<dc:creator>Xo66uT</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[Программирование на PHP]]></category>
		<category><![CDATA[ООП]]></category>

		<guid isPermaLink="false">http://xo66ut.ru/?p=489</guid>
		<description><![CDATA[
Не так давно, начал разбираться с Zend Framework, в этом очень помогают скринкасты от Jon Lobenlsold. Документация на офф сайте скудная и раскрывает только частные понятия отдельных классов, которые в принципе итак показываются с помощью той же IntelliSense Eclipse.
Подвигло меня написать этот пост следующее, я не мог понять как лучше коннектиться к базе, возможно мое [...]]]></description>
			<content:encoded><![CDATA[<div style="text-align: center;"><img class="aligncenter size-full wp-image-491" style="border: 0pt none;" title="zend_framework" src="http://xo66ut.ru/wp-content/uploads/2010/08/zend_framework2.jpg" alt="zend_framework" width="282" height="174" /></div>
<p>Не так давно, начал разбираться с Zend Framework, в этом очень помогают <a href="http://www.zendcasts.com/" target="_blank">скринкасты </a>от Jon Lobenlsold. Документация на офф сайте скудная и раскрывает только частные понятия отдельных классов, которые в принципе итак показываются с помощью той же IntelliSense Eclipse.<br />
Подвигло меня написать этот пост следующее, я не мог понять как лучше коннектиться к базе, возможно мое решение поможет новичкам в ZF, таким же как и я. Я видел решение с созданием <strong><em>Helper</em></strong>&#8216;а, но как выяснилось все намного проще. Как показала практика решение с <strong><em>Helper </em></strong>подходит только тогда, когда коннект к базе происходит из Контроллеров. Я же хочу делать запросы из собственного класса, который лежит у меня в папке /library/App/.<br />
Итак для коннекта к базе необходимо сделать следующее -<br />
Прописать следующие строчки в application.ini (я прописал в секцию production)</p>
<pre class="brush: php;">
resources.db.adapter = &quot;PDO_MYSQL&quot;
resources.db.params.charset = &quot;utf8&quot;
resources.db.params.host = &quot;127.0.0.1&quot;
resources.db.params.username = &quot;root&quot;
resources.db.params.password = &quot;123456&quot;
resources.db.params.dbname = &quot;yourdb&quot;
</pre>
<p>После этого можно делать запросы из любого класс можно следующим образом.</p>
<pre class="brush: php;">
$dbAdapter = Zend_Db_Table::getDefaultAdapter();
 $result = $dbAdapter-&gt;query(&quot;SELECT * FROM users&quot;)-&gt;fetchAll();
 var_dump($result);
</pre>
<p>В данном случае статический метод <strong><em>getDefaultAdapter </em></strong>возвращает <strong><em>Zend_Db_Adapter_Abstract</em></strong>, то есть тоже самое, что и при создании подключения через <strong><em>factory</em></strong>, а именно:</p>
<pre class="brush: php;">
$config = Zend_Registry::get('config');
$dbAdapter  = Zend_Db::factory($this-&gt;config-&gt;db-&gt;type,
 array('host'     =&gt; $config-&gt;db-&gt;host,
 'username' =&gt; $config-&gt;db-&gt;user,
 'password' =&gt; $config-&gt;db-&gt;pass,
 'dbname'   =&gt; $config-&gt;db-&gt;name
 )
 );
</pre>
<p>В первом случае настройки автоматически подхватываются из application.ini, во втором же их приходится прописывать вручную.</p>
<p>Буду рад, если кому-нибудь данное открытие поможет как и мне.</p>
<img src="http://xo66ut.ru/?ak_action=api_record_view&id=489&type=feed" alt="" /><img src="http://feeds.feedburner.com/~r/Xo66uT/~4/W8YM-wYhNos" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://xo66ut.ru/archives/489/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://xo66ut.ru/archives/489</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 0.438 seconds. --><!-- Cached page generated by WP-Super-Cache on 2012-05-25 18:06:48 -->

