<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2russianfull.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><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" version="2.0">

<channel>
	<title>Лобач.info</title>
	
	<link>http://lobach.info</link>
	<description>Заметки LAMP-программиста о вебдеве и не только...</description>
	<pubDate>Tue, 18 Nov 2008 20:26:18 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6.3</generator>
	<language>en</language>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/lobach" type="application/rss+xml" /><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%2Flobach" 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%2Flobach" 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%2Flobach" 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.rojo.com/add-subscription?resource=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/lobach" 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%2Flobach" 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%2Flobach" 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%2Flobach" 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%2Flobach" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
		<title>В закладки #1</title>
		<link>http://lobach.info/some/bookmarks-1/</link>
		<comments>http://lobach.info/some/bookmarks-1/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 19:40:30 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=96</guid>
		<description><![CDATA[Сегодня хочу порекомендовать к прочтению пару блогов.
Первым представлю &#171;Zend Framework по&#8211;русски&#187;&#160;&#8212; полностью посвященный замечательному php-фреймворку. Сергей Митрошин, автор этого блога, публикует 3-4 весьма интересных статьи в месяц. Из последнего рекомендую к прочтению:

статьи про использование ContextSwitch (Сергей его почему-то называет переключателем &#171;контентов&#187;, вместо &#171;контекстов&#187;)&#160;&#8212; Переключая контенты - экспорт в RSS и Переключая контенты - работа с [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня хочу порекомендовать к прочтению пару блогов.</p>
<p>Первым представлю &laquo;<a href="http://zend-framework.ru/">Zend Framework по&ndash;русски</a>&raquo;&nbsp;&mdash; полностью посвященный замечательному php-фреймворку. Сергей Митрошин, автор этого блога, публикует 3-4 весьма интересных статьи в месяц. Из последнего рекомендую к прочтению:</p>
<ul>
<li>статьи про использование ContextSwitch (Сергей его почему-то называет переключателем &laquo;контентов&raquo;, вместо &laquo;контекстов&raquo;)&nbsp;&mdash; <a href="http://zend-framework.ru/2008/11/switchcontext-rss-export/">Переключая контенты - экспорт в RSS</a> и <a href="http://zend-framework.ru/2008/11/contextswitch-ajax-new-level/">Переключая контенты - работа с AJAH</a></li>
<li><a href="http://zend-framework.ru/2008/03/osnovy-zend_form-part-1/">Основы Zend_Form. Часть 1 - быстрый старт</a> и <a href="http://zend-framework.ru/2008/08/zend_form-part2-decorators/">Декораторы Zend_Form</a></li>
</ul>
<p>Следующий на очереди&nbsp;&mdash; блог &laquo;<a href="http://i-novice.net/">От новичка до профессионала</a>&raquo; (автор скрывается под ником Novice, хотя если судить по уровню статей, то новичком его назвать сложно :)). Зацепил он меня статьями о паттернах проектирования&nbsp;&mdash; крайне полезное знание для профессионального разработчика. Я сейчас как раз читаю классический труд на эту тему&nbsp;&mdash; &laquo;<a href="http://www.ozon.ru/context/detail/id/2457392/?partner=lobach">Приемы объектно-ориентированного проектирования. Паттерны проектирования</a>&raquo;, абсолютный must-have для разработчика, использующего ООП. Не зря эта книга считается самой полезной в плане изучения ООП.</p>
<p>Что-то я отвлекся, давайте вернемся к блогу. Описания паттернов собраны в двух рубриках: <a href="http://i-novice.net/category/advanced_php/">Продвинутый php</a> и <a href="http://i-novice.net/category/professionalnyj-php/">Профессиональный php</a> (из последнего опубликованного&nbsp;&mdash; <a href="http://i-novice.net/antipattern-spagetti-kod/">Антипаттерн: Спагетти-код</a>). Кроме этих рубрик рекомендую заглянуть еще в <a href="http://i-novice.net/category/ajax_js/">AJAX / Javascript</a> и <a href="http://i-novice.net/category/solutions/">Практика php</a>. Вообщем, однозначно полезный блог.</p>
Этот пост без меток.<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=kwXGN"><img src="http://feeds.feedburner.com/~f/lobach?i=kwXGN" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/some/bookmarks-1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Перехватчики в помощниках действий</title>
		<link>http://lobach.info/develop/zf/hooks-in-action-helpers/</link>
		<comments>http://lobach.info/develop/zf/hooks-in-action-helpers/#comments</comments>
		<pubDate>Thu, 06 Nov 2008 13:14:03 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[zend framework]]></category>

		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=91</guid>
		<description><![CDATA[Вчера Роб Ален опубликовал продолжение заметки про написание помощников действий в Zend Framework-е. Представляю перевод этой заметки.
Продолжая обсуждение помощников действий Zend Framework (мой перевод: Использование помощников действий, &#8212; прим. пер.), давайте поговорим о перехватчиках в них.
Перехватчики – это особенность помощников действий, которая позволяет вам выполнить некий код в определенных точках цикла диспетчеризации. Собственно, для помощников [...]]]></description>
			<content:encoded><![CDATA[<p><em>Вчера <a href="http://akrabat.com/">Роб Ален</a> опубликовал продолжение заметки про написание помощников действий в Zend Framework-е. Представляю перевод этой заметки.</em></p>
<p>Продолжая обсуждение <a href="http://akrabat.com/2008/10/31/using-action-helpers-in-zend-framework/">помощников действий Zend Framework</a> (мой перевод: <a href="http://lobach.info/develop/zf/using-action-helpers/">Использование помощников действий</a>, &mdash; прим. пер.), давайте поговорим о перехватчиках в них.</p>
<p>Перехватчики – это особенность помощников действий, которая позволяет вам выполнить некий код в определенных точках цикла диспетчеризации. Собственно, для помощников действий доступно всего два типа перехватчиков:</p>
<ul>
<li>preDispatch(): вызывается перед запуском действия</li>
<li>postDispatch(): вызывается после завершения работы действия</li>
</ul>
<p>Это позволяет вам быть уверенным в том, что некоторая функциональность всегда будет выполнена при каждом запросе. Рассмотрим простой пример вывода случайной цитаты в «подвале» сайта.</p>
<p>Мы начнем с помощника действия в нашем каталоге <strong>controllers/helpers</strong>, названного <em>Quote</em>:</p>
<pre><code class="php">&lt;?php

class Zend_Controller_Action_Helper_Quote extends Zend_Controller_Action_Helper_Abstract
{
    function preDispatch()
    {
        $view = $this-&gt;getActionController()-&gt;view;
        $view-&gt;footerQuote = $this-&gt;getQuote();
    }

    function getQuote()
    {
        $quotes[] = 'I want to run, I want to hide, I want to tear down the walls';
        $quotes[] = 'One man come in the name of love, One man come and go';
        return $quotes[rand(0, count($quotes)-1)];
    }
}</code></pre>
<p>Метод <strong><code>preDispatch()</code></strong> получает объект представления из контроллера действия и присваивает случайную цитату свойству footerQuote этого объекта.</p>
<p>Мы должны сказать брокеру помощников, что мы хотим активировать этот перехватчик. Для этого в дополнение к вызову <strong><code>addPath()</code></strong>, наш загрузочный файл нужно дополнить вызовом <strong><code>addHelper()</code></strong>. После этого загрузчик станет содержать код:</p>
<pre><code class="php">    // Action Helpers
    Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH .'/controllers/helpers');

    $hooks = Zend_Controller_Action_HelperBroker::getStaticHelper('Quote');
    Zend_Controller_Action_HelperBroker::addHelper($hooks);</code></pre>
<p>Пока мы используем <strong><code>addPath()</code></strong> для указания брокеру помощников где искать помощники действий, мы можем использовать <strong><code>getStaticHelper()</code></strong> в качестве простого способа инстанцирования класса без <strong><code>require()</code></strong> и последующего вызова <strong><code>new</code></strong>. Затем мы можем зарегистрировать его с помощью помощника брокера использовав <strong><code>addHelper()</code></strong>.</p>
<p>Так как цитата отображается в подвале сайта, требуется внести изменения в HTML-код в <strong><code>layout.phtml</code></strong>:</p>
<pre><code class="php">&lt;div id=&quot;footer&quot;&gt;
    &lt;div id=&quot;quote&quot;&gt;
        &lt;?php echo $this-&gt;footerQuote; ?&gt;
    &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>Вот и все - не сложно, правда?</p>

	Tags: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=YKhJN"><img src="http://feeds.feedburner.com/~f/lobach?i=YKhJN" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/hooks-in-action-helpers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Использование помощников действий</title>
		<link>http://lobach.info/develop/zf/using-action-helpers/</link>
		<comments>http://lobach.info/develop/zf/using-action-helpers/#comments</comments>
		<pubDate>Sat, 01 Nov 2008 20:09:33 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[zend framework]]></category>

		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=79</guid>
		<description><![CDATA[Вчера Роб Ален опубликовал в своем блоге Akra’s DevNotes заметку про написание помощников действий в Zend Framework-е. Заметка хоть и не большая, но для новичков будет полезной. Представляю перевод этой заметки.
Когда вам нужно использовать один и тот же функционал в нескольких контроллерах, можно воспользоваться помощником действий. Помощники действий являются очень мощным инструментом и содержат механизмы [...]]]></description>
			<content:encoded><![CDATA[<p><em>Вчера Роб Ален опубликовал в своем блоге <a href="http://akrabat.com/">Akra’s DevNotes</a> заметку про написание <a href="http://akrabat.com/2008/10/31/using-action-helpers-in-zend-framework/">помощников действий</a> в Zend Framework-е. Заметка хоть и не большая, но для новичков будет полезной. Представляю перевод этой заметки.</em></p>
<p>Когда вам нужно использовать один и тот же функционал в нескольких контроллерах, можно воспользоваться помощником действий. Помощники действий являются очень мощным инструментом и содержат механизмы автоматического запуска, когда вы в них нуждаетесь, но вы можете проигнорировать все, в случае если Вам это не нужно.</p>
<p>Первое, что вы должны сделать - решить где разместить их. Последняя версия рекомендаций по стандартной структуре проекта предлагает использовать подкаталоги вашего каталога контроллеров. Т.е. <code><strong>application/controllers/helpers/</strong></code>, и это лучший вариант.</p>
<p>Во-первых, вы должны сказать брукеру помощников где располагаются ваши помощники действий. Я обычно делаю это в загрузчике (bootstrap file), но точно так же можно сделать это и в плагине фронт-контроллера.</p>
<pre><code class="php">    Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH .'/controllers/helpers');
</code></pre>
<p>Затем вы должны создать помощник действий, мы назовем его Multiples в нашем примере, тогда название файла будет <code><strong>application/controllers/helpers/Multiples.php</strong></code>:</p>
<pre><code class="php">&lt;?php

class Zend_Controller_Action_Helper_Multiples extends
                Zend_Controller_Action_Helper_Abstract
{
    function direct($a)
    {
        return $a * 2;
    }
}</code></pre>
<p>Обратите внимание на префикс названия класса помощника действий - <code><strong>Zend_Controller_Action_Helper</strong></code>. Вы можете поменять этот префикс на другой, передав его вторым параметром в функции <code><strong>Zend_Controller_Action_HelperBroker::addPath()</strong></code>, вызвав её в вашем загрузчике.</p>
<p>Наконец, использование в действии контроллера:</p>
<pre><code class="php">&lt;?php

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this-&gt;view-&gt;headTitle('Home');
        $this-&gt;view-&gt;title = 'Test of the Multiples action helper';

        $number = 30;
        $twice = $this-&gt;_helper-&gt;multiples($number);

        $this-&gt;view->number = $number;
        $this-&gt;view-twice = $twice;
    }
}</code></pre>
<p>Обратите внимание на то, что мы вызываем помощник действия как метод класса <strong>_helper</strong>. Этот вызов транслируется в вызов метода <strong>direct()</strong> нашего класса помощника.</p>
<p>Также вы можете написать несколько методов в одном помощнике действий:</p>
<pre><code class="php">class Zend_Controller_Action_Helper_Multiples extends
                Zend_Controller_Action_Helper_Abstract
{
    function direct($a)
    {
        return $a * 2;
    }

    function thrice($a)
    {
        return $a * 3;
    }
}</code></pre>
<p>Для вызова метода <strong>thrice()</strong> в действии вашего контроллера делайте так:</p>
<pre><code class="php">$thrice = $this-&gt;_helper-&gt;multiples-&gt;thrice($number);</code></pre>
<p>Таким образом, если вы используете имя помощника действий как свойство <strong>_helper</strong>, то вы можете вызвать любой метод из этого помощника.</p>
<p>Это всего лишь общие сведения для начала освоения. За подробностями обращайтесь к руководству.</p>
<p>Удачи и избегайте копи-паста общей функциональности!</p>

	Tags: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=P42IN"><img src="http://feeds.feedburner.com/~f/lobach?i=P42IN" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/using-action-helpers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ZF 1.6 RC2</title>
		<link>http://lobach.info/develop/zf/zend-framework-1-6-rc2/</link>
		<comments>http://lobach.info/develop/zf/zend-framework-1-6-rc2/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 07:41:30 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=74</guid>
		<description><![CDATA[Кросс-пост с хабра
13 августа вышел второй кандидат версии 1.6. На девзоне анонса до сих пор нет, но загрузить его можно либо архивом, либо забрать из репозитория.
Что же нового появилось? Пока могу лишь предполагать на основе сравнения кода первого и второго кандидатов:

Добавили класс для работы с капчей и соответствующее поле для формы
Добавили поддержку FirePHP (расширения FireBug) [...]]]></description>
			<content:encoded><![CDATA[<p><em>Кросс-пост с <a href="http://habrahabr.ru/blogs/zend_framework/36891/">хабра</a></em></p>
<p>13 августа вышел второй кандидат версии 1.6. На девзоне анонса до сих пор нет, но загрузить его можно либо архивом, либо забрать из репозитория.</p>
<p>Что же нового появилось? Пока могу лишь предполагать на основе сравнения кода первого и второго кандидатов:</p>
<ul>
<li>Добавили класс для работы с капчей и соответствующее поле для формы</li>
<li>Добавили поддержку <a href="https://addons.mozilla.org/en-US/firefox/addon/6149">FirePHP</a> (расширения <a href="https://addons.mozilla.org/en-US/firefox/addon/1843">FireBug</a>) для Zend_Log и Zend_Db_Profiler</li>
<li>Добавили новые хелперы для Dojo</li>
<li>Добавили класс загрузки файлов и поле для Zend_Form + валидаторы</li>
<li>&#8230; и масса изменений в остальных классах&#8230;</li>
</ul>
<p>Пробуем и ждем релиз?</p>

	Tags: <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=qOIUFK"><img src="http://feeds.feedburner.com/~f/lobach?i=qOIUFK" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-framework-1-6-rc2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Вышел Zend Framework 1.6 RC1</title>
		<link>http://lobach.info/develop/zf/available-zend-framework-16-rc1/</link>
		<comments>http://lobach.info/develop/zf/available-zend-framework-16-rc1/#comments</comments>
		<pubDate>Tue, 22 Jul 2008 19:37:44 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=69</guid>
		<description><![CDATA[Отличная новость: сегодня выпустили ZF 1.6 RC1.
Из интересного лично мне:

класс для поддержки модульного тестирования контроллеров
паджинатор
Zend File Transfer

Кроме того:

интеграция с JS-фреймворком Dojo
SOAP
поддержка формата файлов индексов Lucene 2.3
Zend_Session теперь может хранить данные в БД
поддержка Text/Figlet
поддержка компонентом Zend_Config_Xml атриботов
установка кодировки соединения в адаптере БД
новые хелперы видов для медиа-форматов
поддержка компонентом Zend_Translate INI-файлов

Новость на английском - Zend Framework 1.6 Release [...]]]></description>
			<content:encoded><![CDATA[<p>Отличная новость: сегодня выпустили ZF 1.6 RC1.</p>
<p>Из интересного лично мне:</p>
<ul>
<li>класс для поддержки модульного тестирования контроллеров</li>
<li>паджинатор</li>
<li>Zend File Transfer</li>
</ul>
<p>Кроме того:</p>
<ul>
<li>интеграция с JS-фреймворком Dojo</li>
<li>SOAP</li>
<li>поддержка формата файлов индексов Lucene 2.3</li>
<li>Zend_Session теперь может хранить данные в БД</li>
<li>поддержка Text/Figlet</li>
<li>поддержка компонентом Zend_Config_Xml атриботов</li>
<li>установка кодировки соединения в адаптере БД</li>
<li>новые хелперы видов для медиа-форматов</li>
<li>поддержка компонентом Zend_Translate INI-файлов</li>
</ul>
<p>Новость на английском - <a href="http://devzone.zend.com/article/3712-Zend-Framework-1.6-Release-Candidate-1-now-available">Zend Framework 1.6 Release Candidate 1 now available!</a></p>
<p>Разработчики предостерегают от использования этого релиза в продакшене — релиз предназначен для ознакомления с нововведениями в ветке 1.6 и еще не стабилен.</p>

	Tags: <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=6B8FJJ"><img src="http://feeds.feedburner.com/~f/lobach?i=6B8FJJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/available-zend-framework-16-rc1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Интеграция Zend Framework и Doctrine</title>
		<link>http://lobach.info/develop/zf/integrating-zend-framework-and-doctrine/</link>
		<comments>http://lobach.info/develop/zf/integrating-zend-framework-and-doctrine/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 18:15:15 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[doctrine]]></category>

		<category><![CDATA[tutorial]]></category>

		<category><![CDATA[zend framework]]></category>

		<category><![CDATA[перевод]]></category>

		<category><![CDATA[статьи]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=58</guid>
		<description><![CDATA[Хочу предложить вашему вниманию мой новый перевод отличной статьи Integrating Zend Framework and Doctrine от Ruben Vermeersch.
Эта статья научит вас всем шагам, необходимым для создания проекта, использующего Zend Framework и Doctrine. Шаг за шагом мы создадим простейшую доску сообщений.
Прежде, чем начать
Хоть я и старался сохранить статью простой, это не значит, что тут будет введение в [...]]]></description>
			<content:encoded><![CDATA[<p><em>Хочу предложить вашему вниманию мой новый перевод отличной статьи <a href="http://ruben.savanne.be/articles/integrating-zend-framework-and-doctrine">Integrating Zend Framework and Doctrine</a> от Ruben Vermeersch.</em></p>
<p><strong>Эта статья научит вас всем шагам, необходимым для создания проекта, использующего <a href="http://framework.zend.com/">Zend Framework</a> и <a href="http://www.phpdoctrine.org/">Doctrine</a>. Шаг за шагом мы создадим простейшую доску сообщений.</strong></p>
<h3>Прежде, чем начать</h3>
<p>Хоть я и старался сохранить статью простой, это не значит, что тут будет введение в обе технологии. Я предлагаю вам поиграть с обеими технологиями по отдельности, прежде чем пытаться объединить их. Они обе имеют достаточно хорошую документацию, что бы с нее начать: <a href="http://framework.zend.com/docs/quickstart">Zend Framework Quick Start</a> и <a href="http://trac.phpdoctrine.org/wiki/MyFirstProject">Doctrine&#8217;s My First Project</a>. Кроме того, <a href="http://akrabat.com/zend-framework-tutorial/">Akra&#8217;s Zend Framework Tutorial</a> (<em>&#8220;<a href="http://archive.paradigm.ru/zend-fw-intro.pdf">Введение в Zend Framework</a>&#8221; - перевод от Александра Мусаева</em>) тоже очень хорошее введение в тему.</p>
<p>Zend Framework имеет &#8220;используй-как-хочешь&#8221; архитектуру. Это значит, что вы свободны в использовании только тех частей, которые вам нужны, в отличии от других фреймворков, предлагающих решения &#8220;все-или-ничего&#8221;. Эта архитектура (используй-как-хочешь) великолепна: она позволяет нам разрабатывать настоящие Zend Framework приложения, без использования ZF абстракции от БД (Zend_Db). Хотя Zend_Db не плохая технология, она все еще довольно низкоуровневая, и слишком близка к базе данных. Используя Doctrine, вы можете манипулировать вашими данными как объектами, не слишком беспокоясь о базе данных.</p>
<p>Zend Framework предоставляет вам много свободы в том, как строить своё приложение. Иными словами, он не заставляет вас использовать строго определенную структуру проекта. В этой статье я старался наиболее близко следовать предлагаемой по умолчанию структура проекта. Тем не менее, все это вопрос личного вкуса.</p>
<h3>Итак, приступим!</h3>
<p>Сначала мы создадим типовую структуру проекта и установим библиотеки. Откройте файл-менеджер и создайте структуру папок, как показано ниже. Я объясню, назначение этих папок через минуту.</p>
<div class="wp-caption aligncenter" style="width: 221px"><img title="Типовая структура папок" src="http://lobach.info/wp-content/uploads/2008/07/basic-folders.png" alt="Типовая структура папок" width="211" height="468" /><p class="wp-caption-text">Типовая структура папок</p></div>
<p>Тут много папок, но большинство из них должны быть вам знакомы, если вы уже разрабатывали приложения на Zend Framework. Вот отличия:</p>
<ul>
<li><code>application/doctrine/</code> — в ней содержаться все файлы данных Doctrine, такие как sql и yaml схемы бд, миграции, дампы, и т.п.</li>
<li><code>application/models/</code> — Doctrine будет автоматически генерировать  файлы моделей в этой директории, что легко использовать в рамках вашего Zend Framework приложения.</li>
<li><code>library/</code> — как правило, вы бы просто установить свою копию Zend Framework в эту папку. В нашем приложении нам нужны две библиотеки: Zend Framework и Doctrine. Таким образом, мы делаем два подкаталога и устанавливаем туда библиотеки.</li>
<li><code>scripts/</code> — Doctrine поставляется с удобнымм  скриптами командной строки (делее просто &#8220;скрипты доктрины&#8221;), мы будем хранить их здесь (как в предложении, упомянутом выше).</li>
</ul>
<p>Следующий шаг — установка Zend Framework и Doctrine. Загрузите последнюю версию с соответствующих веб-сайтов и разархивируйте library (для ZF) или lib (для Doctrine) в созданные нами папки.  Должно получиться приблизительно следующее:</p>
<div id="attachment_61" class="wp-caption aligncenter" style="width: 440px"><a href="/wp-content/uploads/2008/07/libraries-installed.png"><img class="size-full wp-image-61" title="Zend Framework и Doctrine установлены" src="http://lobach.info/wp-content/uploads/2008/07/libraries-installed.png" alt="" width="430" height="260" /></a><p class="wp-caption-text">Zend Framework и Doctrine установлены</p></div>
<h3>Время заняться загрузочным файлом</h3>
<p>Если  вы помните по Zend Framework Quick Start, мы должны создать загрузочный файл. Мы сделаем это сейчас, но с некоторыми изменениями, с тем, чтобы использовать Doctrine.</p>
<p>Во-первых, мы создадим файлы <code>public/index.php</code> и <code>public/.htaccess</code>. Запустите ваш любимый редактор и скопируйте следующие куски кода:</p>
<p><strong>public/index.php</strong></p>
<pre><code class="php">&lt;?php
require '../application/bootstrap.php';</code></pre>
<p><strong>public/.htaccess</strong></p>
<pre><code>RewriteEngine on

RewriteCond %{SCRIPT_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1</code></pre>
<p>Как вы видите, все так же, как и в любом приложении на базе Zend Framework.</p>
<p>Файл <strong>application/bootstrap.php</strong> выглядит немного иначе. Я разделил его на два файла: <strong>application/bootstrap.php</strong> и <strong>application/global.php</strong>. Первый занимается обработкой запросов клиентов, последний подключает все необходимые файлы. Я разделил их потому, что код из <strong>global.php</strong> нужен также в скриптах Doctrine (которое мы увидим через минутку).</p>
<p><strong>application/global.php</strong></p>
<pre><code class="php">&lt;?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/Brussels');

/*
* Setup libraries &amp; autoloaders
*/
set_include_path(dirname(__FILE__).'/../library/zendframework'
    . PATH_SEPARATOR . dirname(__FILE__).'/../library/doctrine'
    . PATH_SEPARATOR . dirname(__FILE__).'/models'
    . PATH_SEPARATOR . dirname(__FILE__).'/models/generated'
    . PATH_SEPARATOR . get_include_path());
require 'Zend/Loader.php';
Zend_Loader::registerAutoload('Zend_Loader');

/*
* Set super-global data
*/
Doctrine_Manager::connection("mysql://user:pass@localhost/database");

/*
* Configure Doctrine
*/
Zend_Registry::set('doctrine_config', array(
    'data_fixtures_path'  =&gt;  dirname(__FILE__).'/doctrine/data/fixtures',
    'models_path'         =&gt;  dirname(__FILE__).'/models',
    'migrations_path'     =&gt;  dirname(__FILE__).'/doctrine/migrations',
    'sql_path'            =&gt;  dirname(__FILE__).'/doctrine/data/sql',
    'yaml_schema_path'    =&gt;  dirname(__FILE__).'/doctrine/schema'
));</code></pre>
<p><strong>application/bootstrap.php</strong></p>
<pre><code class="php">&lt;?php
require dirname(__FILE__).'/global.php';

Zend_Controller_Front::run(dirname(__FILE__).'/controllers');
?&gt;</code></pre>
<p>Давайте рассмотрим его шаг за шагом:</p>
<pre><code class="php">&lt;?php
error_reporting(E_ALL | E_STRICT);
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/Brussels');
?&gt;</code></pre>
<p>Это всегда хорошая идея — установить правильную обработку ошибок и часовой пояс. Здесь ничего особенного.</p>
<pre><code class="php">&lt;?php
/*
* Setup libraries &amp; autoloaders
*/
set_include_path(dirname(__FILE__).'/../library/zendframework'
    . PATH_SEPARATOR . dirname(__FILE__).'/../library/doctrine'
    . PATH_SEPARATOR . dirname(__FILE__).'/models'
    . PATH_SEPARATOR . dirname(__FILE__).'/models/generated'
    . PATH_SEPARATOR . get_include_path());
require 'Zend/Loader.php';
Zend_Loader::registerAutoload('Zend_Loader');
?&gt;</code></pre>
<p>Именно здесь мы подключаем Doctrine. Как вы видите, мы установили include_path для подключения Zend Framework и Doctrine. Мы также подключили папки, в которых Doctrine будет генерировать файлы моделей. Заметим, что нам не нужно настраивать автозагрузчик Doctrine. Использование загрузчика Зенда работает так же хорошо, до тех пор, пока include_path настроен правильно. <em>Предупреждение: в текущей версии ZF (1.5.1) есть ошибка, приводящая к печати безобидных предупреждений при использовании классов шаблонов Doctrine. Она должна быть исправлена в будущих версиях.</em></p>
<pre><code class="php">&lt;?php
/*
* Set super-global data
*/
Doctrine_Manager::connection("mysql://user:pass@localhost/database");

/*
* Configure Doctrine
*/
Zend_Registry::set('doctrine_config', array(
    'data_fixtures_path'  =&gt;  dirname(__FILE__).'/doctrine/data/fixtures',
    'models_path'         =&gt;  dirname(__FILE__).'/models',
    'migrations_path'     =&gt;  dirname(__FILE__).'/doctrine/migrations',
    'sql_path'            =&gt;  dirname(__FILE__).'/doctrine/data/sql',
    'yaml_schema_path'    =&gt;  dirname(__FILE__).'/doctrine/schema'
));
?&gt;</code></pre>
<p>Это последний кусочек кода. Во-первых, мы создали соединение с базой данных. Чтобы не усложнять, я просто забил в код это строковое значение. В реальных системах вы должны использовать что-нибудь подобное <a href="http://framework.zend.com/manual/en/zend.config.html">Zend_Config</a>. Я оставлю это вам в качестве домашнего задания. Во-вторых, этот кусок кода настраивает пути к инструментам Doctrine для командной строки (которые генерируют весь код и схемы баз данных). Я сохранил этот массив в <a href="http://framework.zend.com/manual/en/zend.registry.html">Zend_Registry</a>, который является универсальным хранилищем, местом, где вы можете хранить объекты и получить их в нужный момент.</p>
<p>Измените строку соединения Doctrine, в соответствии с параметрами вашей системы. Вы должны указать пустую базу данных. Мы будем наполнять эту базу данных позже.</p>
<p>Содержимое файла application/bootstrap.php не должно вызывать у вас удивления. Опять же, я пытался сохранить этот пример как можно более простым.</p>
<p>Наконец, давайте настроим интерфейс командной строки Doctrine:</p>
<p><strong>scripts/doctrine-cli</strong></p>
<pre><code class="php">#!/usr/bin/env php
&lt;?php
require dirname(__FILE__).'/../application/global.php';

$cli = new Doctrine_Cli(Zend_Registry::get('doctrine_config'));
$cli-&gt;run($_SERVER['argv']);</code></pre>
<p>Сделайте этот сценарий исполняемым:</p>
<p>chmod +x scripts/doctrine-cli</p>
<p>и вы готовы двигаться дальше.</p>
<h3>Создание приложения</h3>
<p>Теперь, когда мы подготовили базовые скрипты, давайте создадим простейшее приложение с использованием Zend Framework и Doctrine. Мы будем создавать очень простую доску сообщений, место, где пользователи могут отправлять сообщения и просматривать чужие сообщения.</p>
<p>Мы будем делать это очень просто: только один контроллер и один скрипт. Скопируйте следующие файлы:</p>
<p><strong>application/views/scripts/index/index.phtml</strong></p>
<pre><code class="php">&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;ZF &amp; Doctrine example&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
&lt;h1&gt;Submit a message:&lt;/h1&gt;
&lt;?=$this-&gt;form?&gt;

&lt;hr /&gt;
&lt;h1&gt;Messages posted:&lt;/h1&gt;
&lt;!-- TODO: Show messages here --&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><strong>application/controllers/IndexController.php</strong></p>
<pre><code class="php">&lt;?php
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $form = $this-&gt;getForm();
        $req = $this-&gt;getRequest();
        if ($req-&gt;getPost() &amp;&amp; $form-&gt;isValid($req-&gt;getPost())) {
            // TODO: Insert message into database
        }
        $this-&gt;view-&gt;form = $form;

        // TODO: Retrieve all messages.
    }

    private function getForm()
    {
        $form = new Zend_Form();
        $form-&gt;addElement('text', 'name', array(
                'label' =&gt; 'Your name',
                'required' =&gt; true
        ));
        $form-&gt;addElement('textarea', 'message', array(
                'label' =&gt; 'Message',
                'required' =&gt; true,
                'rows' =&gt; 4
        ));
        $form-&gt;addElement('submit', 'send');
        return $form;
    }
}
?&gt;</code></pre>
<p>Как вы видите, остались три больших TODO пункта: один в скрипте и два в контроллере. Это места, где мы будем подключать Doctrine. Но для этого мы должны в первую очередь определить некоторые объекты данных. Мы вернемся к контроллеру и скрипту позже, сейчас пришло время для создания схемы базы данных.</p>
<h3>Определение схемы базы данных</h3>
<p>Doctrine позволяет указать ваши схемы баз данных в YAML-файлах, очень простом текстовом представлении. Мы воспользуемся этим и пусть Doctrine  генерирует PHP-файлы автоматически. Я определил следующие схему:</p>
<p><strong>application/doctrine/schema/schema.yml</strong></p>
<pre><code>Message:
    columns:
        id:
            primary: true
            autoincrement: true
            type: integer(4)
        posted:
            type: timestamp
        name:
            type: string(255)
        message:
            type: string</code></pre>
<p>В этом приложении нам нужен только один простой объект: Сообщение, имеющий 4 поля: обязательный уникальный идентификатор, время, когда сообщение было отправлено, название темы и само сообщение.</p>
<p>Теперь мы можем использовать командную строку Doctrine для создания файлов моделей и таблиц баз данных. Из вашего шелла выполните следующее:</p>
<pre><code>$ ./scripts/doctrine-cli generate-models-yaml
generate-models-yaml - Generated models successfully from YAML schema
$ ./scripts/doctrine-cli generate-sql
generate-sql - Generated SQL successfully for models
$ ./scripts/doctrine-cli create-tables
create-tables - Created tables successfully</code></pre>
<p>Если все прошло хорошо, ошибок напечатано не будет. Если это все же произошло, проверьте параметры соединения с БД и указание путей.</p>
<h3>Соеденим все вместе</h3>
<p>Теперь давайте окончательно решим куски TODO. Мы заменим их шаг за шагом. Полный код для завершенных файлов имеется в конце статьи. Во-первых, мы добавим код для хранения сообщений. Замените это:</p>
<pre><code class="php">&lt;?php
// TODO: Insert message into database
?&gt;</code></pre>
<p>Вот этим (игнорируя тэги &lt;?php и ?&gt;):</p>
<pre><code class="php">&lt;?php
$message = new Message();
$message-&gt;fromArray($form-&gt;getValues(true));
$message-&gt;posted = new Doctrine_Expression('NOW()');
$message-&gt;save();
?&gt;</code></pre>
<p>Как вы видите, мы используем объект класса Сообщение. Этот класс был автоматически сгенерирован Doctrine. Вы можете найти его в <code>application/models/</code>. Автозагрузчик позаботится о загрузке всего, что потребуется.</p>
<p>Мы также должны получать сообщения, чтобы показать их. Во-первых, контроллер. Заменить:</p>
<pre><code class="php">&lt;?php
// TODO: Retrieve all messages.
?&gt;</code></pre>
<p>На:</p>
<pre><code class="php">&lt;?php
$messages = Doctrine_Query::create()
        -&gt;from('Message m')
        -&gt;orderBy('m.posted DESC')
        -&gt;execute();
$this-&gt;view-&gt;messages = $messages;
?&gt;</code></pre>
<p>Опять же, это очень просто. Я использовал DQL запрос, чтобы сортировать в обратной хронологической последовательности.</p>
<p>Теперь все, что осталось — показать сообщение в нашем скрипте представления. Опять же, замените:</p>
<pre><code class="html">&lt;!-- TODO: Show messages here --&gt;</code></pre>
<p>На:</p>
<pre><code class="php">&lt;?php foreach ($this-&gt;messages as $message): ?&gt;
    &lt;h2&gt;&lt;?=$message-&gt;name?&gt; (&lt;?=$message-&gt;posted?&gt;)&lt;/h2&gt;
    &lt;?=$message-&gt;message?&gt;
&lt;?php endforeach; ?&gt;</code></pre>
<p>И мы сделали, результат должен выглядеть подобно этому:</p>
<div id="attachment_63" class="wp-caption aligncenter" style="width: 510px"><a href="http://lobach.info/wp-content/uploads/2008/07/chatapp-finished.png"><img class="size-full wp-image-63" title="Завершенное приложение" src="http://lobach.info/wp-content/uploads/2008/07/chatapp-finished.png" alt="Завершенное приложение" width="500" height="636" /></a><p class="wp-caption-text">Завершенное приложение</p></div>
<p>Не используйте это приложение в реальной работе — чтобы сосредоточиться на важных частях, я оставил за кадром множество вещей, таких как, например, экранирование ввода. Вы должны добавить это самостоятельно.</p>
<h3>Заключение</h3>
<p>Итак, у вас теперь есть чистое и ясное приложение-пример интеграции Zend Framework и Doctrine. Как следование некоторой философии, эта возможность интеграции их очень понятным образом, превращает создание приложений в сплошное удовольствие.</p>
<p>Если у Вас есть какие-либо замечания, комментарии или вопросы, не стесняйтесь, пишите мне по электронной почте (ruben@savanne.be), или оставляйте комментарий в моем <a href="http://weblog.savanne.be/130-gsoc-zf-doctrine">блоге</a>.</p>
<h3>Приложение: Полный код файлов</h3>
<p><strong>application/controllers/IndexController.php</strong></p>
<pre><code class="php">&lt;?php
class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $form = $this-&gt;getForm();
        $req = $this-&gt;getRequest();
        if ($req-&gt;getPost() &amp;&amp; $form-&gt;isValid($req-&gt;getPost())) {
            $message = new Message();
            $message-&gt;fromArray($form-&gt;getValues(true));
            $message-&gt;posted = new Doctrine_Expression('NOW()');
            $message-&gt;save();
        }
        $this-&gt;view-&gt;form = $form;

        $messages = Doctrine_Query::create()
            -&gt;from('Message m')
            -&gt;orderBy('m.posted DESC')
            -&gt;execute();
        $this-&gt;view-&gt;messages = $messages;
    }

    private function getForm()
    {
        $form = new Zend_Form();
        $form-&gt;addElement('text', 'name', array(
                'label' =&gt; 'Your name',
                'required' =&gt; true
        ));
        $form-&gt;addElement('textarea', 'message', array(
                'label' =&gt; 'Message',
                'required' =&gt; true,
                'rows' =&gt; 4
        ));
        $form-&gt;addElement('submit', 'send');
        return $form;
    }
}
?&gt;</code></pre>
<p><strong>application/views/scripts/index/index.phtml</strong></p>
<pre><code class="php">&lt;html&gt;
&lt;head&gt;
    &lt;title&gt;ZF &amp; Doctrine example&lt;/title&gt;
&lt;/head&gt;

&lt;body&gt;
    &lt;h1&gt;Submit a message:&lt;/h1&gt;
    &lt;?=$this-&gt;form?&gt;

    &lt;hr /&gt;
    &lt;h1&gt;Messages posted:&lt;/h1&gt;
    &lt;?php foreach ($this-&gt;messages as $message): ?&gt;
        &lt;h2&gt;&lt;?=$message-&gt;name?&gt; (&lt;?=$message-&gt;posted?&gt;)&lt;/h2&gt;
        &lt;?=$message-&gt;message?&gt;
    &lt;?php endforeach; ?&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>

	Tags: <a href="http://lobach.info/tag/doctrine/" title="doctrine" rel="tag">doctrine</a>, <a href="http://lobach.info/tag/tutorial/" title="tutorial" rel="tag">tutorial</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a>, <a href="http://lobach.info/tag/stati/" title="статьи" rel="tag">статьи</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=uZ4n6J"><img src="http://feeds.feedburner.com/~f/lobach?i=uZ4n6J" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/integrating-zend-framework-and-doctrine/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Интеграция Zend_Acl и MVC. Часть 2 (продвинутый вариант использования)</title>
		<link>http://lobach.info/develop/zf/zend_acl-and-mvc-integration-part-2/</link>
		<comments>http://lobach.info/develop/zf/zend_acl-and-mvc-integration-part-2/#comments</comments>
		<pubDate>Wed, 16 Jul 2008 19:39:30 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[ACL]]></category>

		<category><![CDATA[tutorial]]></category>

		<category><![CDATA[zend framework]]></category>

		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=44</guid>
		<description><![CDATA[На DevZone появилась вторая часть статьи о интреграции Zend_Acl в MVC Альдемара Бернала и я спешу предложить вам ее перевод.
В первой части (Интеграция Zend_Acl и MVC. Часть 1) мы говорили о том, как настроить экземпляр Zend_Acl и включить его в окружение MVC (с использованием плагина фронт-контроллера). Но как же настройки других действий для блокирования доступа, [...]]]></description>
			<content:encoded><![CDATA[<p><em>На <a href="http://devzone.zend.com/">DevZone</a> появилась <a href="http://devzone.zend.com/article/3510-Zend_Acl-and-MVC-Integration-Part-II-Advanced-Use">вторая часть статьи о интреграции Zend_Acl в MVC</a> Альдемара Бернала и я спешу предложить вам ее перевод.</em></p>
<p>В <a href="http://devzone.zend.com/article/3509-Zend_Acl-and-MVC-Integration-Part-I-Basic-Use">первой части</a> (<a href="http://lobach.info/develop/zf/zend_acl-and-mvc-integration-part-i/">Интеграция Zend_Acl и MVC. Часть 1</a>) мы говорили о том, как настроить экземпляр Zend_Acl и включить его в окружение MVC (с использованием плагина фронт-контроллера). Но как же настройки других действий для блокирования доступа, или как сделать редактирование статьи только её автором? Это и кое-что еще будет рассмотрено далее.</p>
<p>Как я уже говорил в первой части, эта статья основана на следующем <a href="http://framework.zend.com/wiki/pages/viewpage.action?pageId=39025">предложении</a>, которое в настоящий момент находится в стадии исследования.</p>
<h3>1. Использование модулей</h3>
<p>Давайте поговорим о модулях. В качестве примера для данной статьи мы взяли сайт подобный ДевЗоне. А что если мы создадим административный модуль, задачей которого будет реализация процедуры одобрения статей. Кроме того в модуле можно реализовать еще ряд задач, таких как управление короткими ссылками или категориями. В этом случае нам придется изменить нашу модель ресурсов:</p>
<p><strong>Общий модуль</strong></p>
<ol>
<li>Контроллер пользователей.</li>
<li>Контроллер статей.</li>
</ol>
<p><strong>Административный модуль</strong></p>
<ol>
<li>Контроллер статей.</li>
<li>Контроллер коротких ссылок.</li>
<li>Контроллер категорий.</li>
</ol>
<p>Основываясь на этой новой модели ресурсов, мы создадим экземпляр Zend_Acl, который будет отражает её.</p>
<p><strong>Примечание</strong>: помните, что этот код и создание экземпляра объекта Zend_Acl должно исполняться перед вызовом метода диспетчеризации фронт-контроллера (во время загрузки).</p>
<pre><code class="php">/** Creating Roles */
require_once 'Zend/Acl/Role.php';
$myAcl-&gt;addRole(new Zend_Acl_Role('guest'))
      -&gt;addRole(new Zend_Acl_Role('writer'), 'guest')
      -&gt;addRole(new Zend_Acl_Role('admin'), 'writer');

/** Creating resources */
require_once 'Zend/Acl/Resource.php';
/** Default module */
$myAcl-&gt;add(new Zend_Acl_Resource('user'))
      -&gt;add(new Zend_Acl_Resource('article'));

/** Admin module */
$myAcl-&gt;add(new Zend_Acl_Resource('admin'))
      -&gt;add(new Zend_Acl_Resource('admin:article', 'admin'))
      -&gt;add(new Zend_Acl_Resource('admin:quick-link', 'admin'))
      -&gt;add(new Zend_Acl_Resource('admin:category', 'admin'));

/** Creating permissions */
$myAcl-&gt;allow('guest', 'user')
      -&gt;deny('guest', 'article')
      -&gt;allow('guest', 'article', 'view')
      -&gt;allow(array('writer', 'admin'), 'article', array('add', 'edit'))
      -&gt;allow('admin', 'admin');

/** Setting up the front controller */
require_once 'Zend/Controller/Front.php';
$front = Zend_Controller_Front::getInstance();
$front-&gt;setControllerDirectory(array('default' =&gt; 'path/to/default/controllers',
                                     'admin' =&gt; 'path/to/admin/controllers'));

/** Registering the Plugin object */
require_once 'Zend/Controller/Plugin/Acl.php';
$front-&gt;registerPlugin(new Zend_Controller_Plugin_Acl($myAcl, 'guest')); 

/** Dispatching the front controller */
$front-&gt;dispatch();</code></pre>
<p>Отмечу, что как и раньше, мы создали ресурс для каждого контроллера. Но в случае с модулем администратора, мы создали ресурс для модуля и по одному для каждого контроллера внутри этого модуля в формате &#8220;модуль:контроллер&#8221;, сделав их потомками ресурса модуля. Так же мы сделали роль Администратор единственной, кому разрешен доступ ко всему модулю администрирования.</p>
<h3>2. Использование ролей</h3>
<p>Как только пользователь вошел в приложение, он должен получить роль. В нашем примере эта роль может быть &#8220;гость&#8221;, &#8220;автор&#8221; или &#8220;администратор&#8221;. Но как мы можем изменить текущую ACL-роль в нашем компоненте? Во-первых, вы должны сохранить эту роль в переменной, находящейся в пространстве сессии. Таким образом, как только пользователь входит, вы должны сохранить роль пользователя в сессии. При следующем запросе, вы возьмете  эту переменную из сессии и используете её для настройки плагина фронт-контроллера во время фазы загрузки.</p>
<p><strong>Контроллер пользователей</strong></p>
<pre><code class="php">class UserController extends Zend_Controller_Action
{
    protected $_application;

    public function init()
    {
        require_once 'Zend/Session/Namespace.php';
        $this-&gt;_application = new Zend_Session_Namespace('myApplication');
    }

    public function loginAction()
    {
        ... Validation code
        if ($valid) {
            /** Setting role into session */
            $this-&gt;_application-&gt;currentRole = $user-&gt;role;
            $this-&gt;_application-&gt;loggedUser = $user-&gt;username;
        }
    }

    public function logoutAction()
    {
        $this-&gt;_application-&gt;currentRole = 'guest';
        $this-&gt;_application-&gt;loggedUser = null;
    }
}</code></pre>
<p><strong>Файл-загрузчик</strong></p>
<pre><code class="php">/** Loading application from session */
require_once 'Zend/Session/Namespace.php';
$application = new Zend_Session_Namespace('myApplication');

if (!isset($application-&gt;currentRole)) {
    $application-&gt;currentRole = 'guest';
}

/** Setting up the front controller */
require_once 'Zend/Controller/Front.php';
$front = Zend_Controller_Front::getInstance();
$front-&gt;setControllerDirectory('path/to/controllers'); 

/** Registering the Plugin object */
require_once 'Zend/Controller/Plugin/Acl.php';
$front-&gt;registerPlugin(new Zend_Controller_Plugin_Acl($myAcl, $application-&gt;currentRole));

/** Dispatching the front controller */
$front-&gt;dispatch();</code></pre>
<h3>3. Установка действия при ошибке &#8220;запрет доступа&#8221;</h3>
<p>Может быть, некоторым из вас (надеюсь, никому =D) просто не нравится идея иметь действие &#8220;Доступ запрещен&#8221; в контроллере ошибок, или просто хочется назвать его как-либо иначе. Это можно сделать, вызвав метод setErrorPage плагина фронт-контроллера.</p>
<pre><code class="php">/** Setting up the front controller */
require_once 'Zend/Controller/Front.php';
$front = Zend_Controller_Front::getInstance();
$front-&gt;setControllerDirectory('path/to/controllers'); 

/** Setting default access denied action */
require_once 'Zend/Controller/Plugin/Acl.php';
$aclPlugin = new Zend_Controller_Plugin_Acl($myAcl, 'guest');
$aclPlugin-&gt;setErrorPage('goaway', 'my-error-controller', 'my-module'); 

/** Registering the Plugin object */
$front-&gt;registerPlugin($aclPlugin); 

/** Dispatching the front controller */
$front-&gt;dispatch();</code></pre>
<p>Метод setErrorPage может вызываться с указанием только имени действия. В этом случае контроллер и модуль останутся &#8220;error&#8221; и &#8220;default&#8221;. Так же метод может вызываться с передачей названий действия и контроллера, либо передав все три параметра.</p>
<h3>4. Использование помошника действий</h3>
<p>Наконец, мы увидим один из наиболее важных частей этого предложения. До сих пор в нашем примере ДевЗоны мы видели, что мы разрешаем администраторам и авторам редактировать статьи. Но постойте, есть еще недостающая часть нашего приложения. Сейчас если я автор и имею доступ к article/edit/:id, это значит, что я имею доступ к редактированию не только своих статей, но и статей остальных авторов! Это не очень хорошо, так ведь? Итак, что мы будем с этим делать? Мы будем управлять этим используя помощник действий, а это значит, что вы сможете получить доступ к нашим ACL внутри любого контроллера, а не только во время загрузки.</p>
<p>Итак, первое, что мы делаем, это регистрация не только нашего плагина фронт-контролера, но и нашего помощника действий в Брокере помощников действий контроллера.</p>
<p><strong>Файл-загрузчик</strong></p>
<pre><code class="php">/** Loading application from session */
require_once 'Zend/Session/Namespace.php';
$application = new Zend_Session_Namespace('myApplication');

if (!isset($application-&gt;loggedUser)) {
    $application-&gt;loggedUser = null;
}

/** Setting up the front controller */
require_once 'Zend/Controller/Front.php';
$front = Zend_Controller_Front::getInstance();
$front-&gt;setControllerDirectory('path/to/controllers'); 

/** Registering the Plugin object */
require_once 'Zend/Controller/Plugin/Acl.php';
$front-&gt;registerPlugin(new Zend_Controller_Plugin_Acl($myAcl, $application-&gt;currentRole)); 

/** Registering the Action Helper object */
require_once 'Zend/Controller/Action/Helper/Acl.php';
require_once 'Zend/Controller/Action/HelperBroker.php';
Zend_Controller_Action_HelperBroker::addHelper(new Zend_Controller_Action_Helper_Acl()); 

/** Dispatching the front controller */
$front-&gt;dispatch();</code></pre>
<p>И после регистрации помощника, мы можем использовать его внутри любого контроллера. Давайте дадим права доступа на изменение только для владельца или любого администратора.</p>
<p><strong>Контроллер статей</strong></p>
<pre><code class="php">class ArticleController extends Zend_Controller_Action
{
    protected $_acl;
    protected $_application;

    public function init()
    {
        /** Get our Action Helper */
        $this-&gt;_acl = $this-&gt;_helper-&gt;getHelper('acl'); 

        require_once 'Zend/Session/Namespace.php';
        $this-&gt;_application = new Zend_Session_Namespace('myApplication');
    } 

    ...

    public function editAction()
    {
        /** Load article by id */
        $article = new Article($this-&gt;_request-&gt;id);

        /** Validate if the user is the owner or an Admin */
        if (($article-&gt;author != $this-&gt;_application-&gt;loggedUser)
             &amp;&amp; ($this-&gt;_application-&gt;currentRole != 'admin')) {
            $this-&gt;_acl-&gt;denyAccess();
        } 

        ...
    }
}</code></pre>
<h3>Заключение</h3>
<p>Некоторые любители копошиться в мусоре всю свою жизнь пытаются найти недостающее звено (и они так и умрут в поиске его) и некоторые ЗФ-еры состарятся в попытках заставить работать ACL должным образом в их MVC-окружении. Надеюсь, высказанное выше предложение, может оказаться одним из недостающих кусочков в мире ACL + MVC.</p>
<p>В заключении хочу дать рекомендацию. Придерживайтесь принципа &#8220;Делай проще&#8221;: если вам не нужна позарез динамическая загрузка ACL, то его загрузка и настройка вручную - совсем не грех, возможно это лучший способ действий в данной ситуации.</p>
<p>Для более подробного ознакомления с темой вы можете почитать следующее:<br />
<a href="http://framework.zend.com/wiki/pages/viewpageattachments.action?pageId=39025">Zend_Acl &amp; MVC Integration</a><br />
и небольшой пример реализации подхода, описанного в статье:<br />
<a href="http://framework.zend.com/wiki/download/attachments/39025/ZionFramework.zip">Source Code</a></p>

	Tags: <a href="http://lobach.info/tag/acl/" title="ACL" rel="tag">ACL</a>, <a href="http://lobach.info/tag/tutorial/" title="tutorial" rel="tag">tutorial</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=UL7dYJ"><img src="http://feeds.feedburner.com/~f/lobach?i=UL7dYJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend_acl-and-mvc-integration-part-2/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Интеграция Zend_Acl и MVC. Часть 1 (простейшее использование)</title>
		<link>http://lobach.info/develop/zf/zend_acl-and-mvc-integration-part-i/</link>
		<comments>http://lobach.info/develop/zf/zend_acl-and-mvc-integration-part-i/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 20:44:57 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[ACL]]></category>

		<category><![CDATA[tutorial]]></category>

		<category><![CDATA[zend framework]]></category>

		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/some/zend_acl-and-mvc-integration-part-i/</guid>
		<description><![CDATA[Перевод статьи &#8220;Zend_Acl and MVC Integration Part I (Basic Use)&#8221; Автор Aldemar Bernal
Итак, что не так с Zend_Acl и текущей реализацией MVC в Zend Framework? Ничего неправильного нет, просто не слишком очевидно для разработчиков, как достичь оптимальной интеграции между этими двумя важными частями фреймворка.
Во-первых, эта статья основана на следующем предложении (link), в настоящий момент находящемся [...]]]></description>
			<content:encoded><![CDATA[<p>Перевод статьи &#8220;<a href="http://devzone.zend.com/article/3509-Zend_Acl-and-MVC-Integration-Part-I-Basic-Use">Zend_Acl and MVC Integration Part I (Basic Use)</a>&#8221; <cite>Автор Aldemar Bernal</cite></p>
<p>Итак, что не так с Zend_Acl и текущей реализацией MVC в Zend Framework? Ничего неправильного нет, просто не слишком очевидно для разработчиков, как достичь оптимальной интеграции между этими двумя важными частями фреймворка.</p>
<p>Во-первых, эта статья основана на следующем предложении (<a href="http://framework.zend.com/wiki/pages/viewpage.action?pageId=39025">link</a>), в настоящий момент находящемся в стадии Ожидания рекомендации.</p>
<p>Ну, как это работает? Существуют два основных компонента в этом предложении:</p>
<ol>
<li>Плагин фронт-контроллера (Front Controller Plugin): этот компонент решает, имеет ли доступ текущий пользователь к открываемой странице.</li>
<li> Помощник действия (Action Helper): Этот компонент позволяет проверить, имеет ли текущий пользователь доступ внутрь контроллера.</li>
</ol>
<p>Опираясь на эти два компонента, давайте попробуем их на примере. Давайте будем говорить о сайте, подобном DevZone.<br />
Нам потребуется контроллер для управления пользователями и еще один контроллер для управления статьями, так же 3 типа пользователей (ролей): одну для гостей, одну для авторов статей и еще одну для утверждения статей. Итого, мы имеем:</p>
<p><strong>Ресурсы:</strong></p>
<ol>
<li>Контроллер пользователей.</li>
<li>Контроллер статей.</li>
</ol>
<p><strong>Роли:</strong></p>
<ol>
<li>Гость (Guest).</li>
<li>Автор (Writer).</li>
<li>Администратор (Admin).</li>
</ol>
<h3>Настройка компонента Zend_Acl</h3>
<p>После определения того, что нам нужно сделать, следующим шагом будет создание экземпляра Zend_Acl, отражающего нашу модель.</p>
<pre><code class="php">/** Creating the ACL object */
require_once 'Zend/Acl.php';
$myAcl = new Zend_Acl();
</code></pre>
<h3>Создание ролей</h3>
<p>Сейчас мы создадим роли в нашем экземпляре Zend_Acl.</p>
<pre><code class="php">/** Creating Roles */
require_once 'Zend/Acl/Role.php';
$myAcl-&gt;addRole(new Zend_Acl_Role('guest'))
      -&gt;addRole(new Zend_Acl_Role('writer'), 'guest')
      -&gt;addRole(new Zend_Acl_Role('admin'), 'writer');
</code></pre>
<h3>Создание ресурсов</h3>
<p>Создадим необходимые ресурсы (по одному на контроллер), а также их отношения с созданными нами ролями.</p>
<pre><code class="php">/** Creating resources */
require_once 'Zend/Acl/Resource.php';
$myAcl-&gt;add(new Zend_Acl_Resource('user'))
      -&gt;add(new Zend_Acl_Resource('article'));
</code></pre>
<h3>Создание привилегий</h3>
<p>Теперь мы добавили роли и ресурсы в наш экземпляр Zend_Acl, пора объяснить, какие действия должны быть доступны для каких ролей.</p>
<ol>
<li>Гости не могут редактировать, добавлять и публиковать статьи.</li>
<li>Авторы не могут публиковать статьи.</li>
<li>Администраторы имеют полный доступ.</li>
</ol>
<pre><code class="php">/** Creating permissions */
$myAcl-&gt;allow('guest', 'user')
      -&gt;deny('guest', 'article')
      -&gt;allow('guest', 'article', 'view')
      -&gt;allow('writer', 'article', array('add', 'edit'))
      -&gt;allow('admin', 'article', 'approve');
</code></pre>
<h3>Создание страницы, отображаемой при отсутствии доступа</h3>
<p>Нам нужно будет создать представление (view) и действие (action) на которое мы переадресуем всех пользователей, у которых недостаточно привилегий.<br />
Во-первых, мы создадим новое действие в нашем контроллере ошибок:</p>
<pre><code class="php">class ErrorController extends Zend_Controller_Action
{
    ....

    public function deniedAction()
    {
    }

    ....
}
</code></pre>
<p>Затем мы создадим наш файл представления (/application/views/scripts/error/denied.phtml) с некоторым предупреждающим сообщением:</p>
<pre><code class="html">
&lt;h1&gt;Error&lt;/h1&gt;
&lt;h2&gt;Access denied&lt;/h2&gt;
&lt;p&gt;You are trying to access an area which you have not allowed.&lt;/p&gt;
</code></pre>
<h3>Завершение настройки</h3>
<p>Хорошо, мы настроили наш экземпляр Zend_Acl. Следующий шаг - регистрация плагина контроллера. Это важная часть берет созданный нами экземпляр Zend_Acl и проверяет, доступна ли текущая страница пользователю.</p>
<pre><code class="php">/** Setting up the front controller */
require_once 'Zend/Controller/Front.php';
$front = Zend_Controller_Front::getInstance();
$front-&gt;setControllerDirectory('path/to/controllers'); 

/** Registering the Plugin object */
require_once 'Zend/Controller/Plugin/Acl.php';
$aclPlugin = new Zend_Controller_Plugin_Acl($myAcl);
$aclPlugin-&gt;setRoleName($currentUserRole);

$front-&gt;registerPlugin(new Zend_Controller_Plugin_Acl($acl, 'guest')); 

/** Dispatching the front controller */
$front-&gt;dispatch();
</code></pre>
<p>После завершения настройки, как только пользователь войдет в наше приложение, в зависимости от его/её роли будет либо отображена запрошенная страница, либо страница с сообщением о запрете доступа.</p>
<p>Для более подробного ознакомления с темой вы можете почитать следующее:<br />
<a href="http://framework.zend.com/wiki/pages/viewpageattachments.action?pageId=39025">Zend_Acl &amp; MVC Integration</a></p>
<p>и небольшой пример:<br />
<a href="http://framework.zend.com/wiki/download/attachments/39025/ZionFramework.zip">Source Code</a></p>

	Tags: <a href="http://lobach.info/tag/acl/" title="ACL" rel="tag">ACL</a>, <a href="http://lobach.info/tag/tutorial/" title="tutorial" rel="tag">tutorial</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=JfB38J"><img src="http://feeds.feedburner.com/~f/lobach?i=JfB38J" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend_acl-and-mvc-integration-part-i/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Как сделать ajax-запрос на другой домен?</title>
		<link>http://lobach.info/develop/javascript/croossdomain-ajax-request/</link>
		<comments>http://lobach.info/develop/javascript/croossdomain-ajax-request/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 18:45:37 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[ajax]]></category>

		<category><![CDATA[java-script]]></category>

		<category><![CDATA[jQuery]]></category>

		<guid isPermaLink="false">http://lobach.info/develop/javascript/croossdomain-ajax-request/</guid>
		<description><![CDATA[Вчера по долгу службы пришлось разбираться с кросс-доменными ajax-запросами. Суть проблемы была в следующем: мне нужно было, чтобы мой скрипт отправлял с нескольких сайтов запросы на один сервер, собирающий некоторые данные. Политика безопасности браузеров запрещает это делать через обычный XHTTPRequest.
Погуглив и проведя ряд экспериментов у меня получилось вот что.
Примечание: Ниже я приведу готовое решение. А [...]]]></description>
			<content:encoded><![CDATA[<p>Вчера по долгу службы пришлось разбираться с кросс-доменными ajax-запросами. Суть проблемы была в следующем: мне нужно было, чтобы мой скрипт отправлял с нескольких сайтов запросы на один сервер, собирающий некоторые данные. Политика безопасности браузеров запрещает это делать через обычный XHTTPRequest.</p>
<p>Погуглив и проведя ряд экспериментов у меня получилось вот что.</p>
<p><strong>Примечание</strong>: <em>Ниже я приведу готовое решение. А для желающих обрести теоретическую подкованность, предлагаю к прочтению:
<ul>
<li>&#8220;<a href="http://javascript.ru/ajax/cross-domain-scripting">Обмен данными для документов с разных доменов</a>&#8220;,</li>
<li>&#8220;<a href="http://bob.pythonmac.org/archives/2005/12/05/remote-json-jsonp/">Remote JSON - JSONP</a>&#8220;,</li>
<li>&#8220;<a href="http://ajaxian.com/archives/jsonp-json-with-padding">JSONP: JSON With Padding</a>&#8220;</li>
<li> и применительно к jQuery статья &#8220;<a href="http://www.linkexchanger.su/2008/34.html">jQuery и Ajax: запросы</a>&#8220;</li>
</ul>
<p></em></p>
<p>Итак, для отправки запросов я воспользуюсь библиотекой <a href="http://jquery.com/">jQuery</a>. С версии 1.2 эта библиотека поддерживает JSONP нативно. Вот, собственно сам код для выполнения запроса:</p>
<pre><code class="javascript">$.getJSON("http://server.ru/logger.php?callback=?", function(data){
    // тут обрабатываем полученные данные
});</code></pre>
<p>Обратите внимание на параметр &#8220;callback=?&#8221; в адресе, на который отправляется запрос. Вместо вопроса jquery подставит название callback-функции. Эта callback-функция будет вызвана при получении ответа от сервера. Учтем это в серверной части.</p>
<pre><code class="php">&lt;?php
    echo $_GET['callback']."({param1:'value',param2:0});";
?&gt;</code></pre>
<p>Т.е. выход скрипта должен генерировать не просто JSON, а вызов callback-функции и передачей ей параметров, которые нужно передать от сервера клиенту.</p>
<p>Вот, собственно и вся премудрость. Если возникнут вопросы, задавайте в комментариях, я постараюсь на них ответить</p>

	Tags: <a href="http://lobach.info/tag/ajax/" title="ajax" rel="tag">ajax</a>, <a href="http://lobach.info/tag/java-script/" title="java-script" rel="tag">java-script</a>, <a href="http://lobach.info/tag/jquery/" title="jQuery" rel="tag">jQuery</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=THWUpJ"><img src="http://feeds.feedburner.com/~f/lobach?i=THWUpJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/javascript/croossdomain-ajax-request/feed/</wfw:commentRss>
		</item>
		<item>
		<title>“Зебра” в таблице ExtJS</title>
		<link>http://lobach.info/develop/javascript/zebra-table/</link>
		<comments>http://lobach.info/develop/javascript/zebra-table/#comments</comments>
		<pubDate>Tue, 08 Jul 2008 08:09:12 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[extjs]]></category>

		<category><![CDATA[js]]></category>

		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://lobach.info/develop/javascript/zebra-table/</guid>
		<description><![CDATA[Пост из серии &#8220;не забыть как делать&#8221;.
Мне последнее время приходится достаточно плотно заниматься разработкой на отличном javascript-фреймворке ExtJS и, в частности, много работать с таблицами. Чтобы визуально приукрасить и сделать таблицы более юзабельными я сделал для них т.н. &#8220;зебру&#8221;, т.е. чересстрочную раскраску. Далее я расскажу как это сделать.
Я не буду приводить полный код таблицы, только [...]]]></description>
			<content:encoded><![CDATA[<p>Пост из серии &#8220;не забыть как делать&#8221;.</p>
<p>Мне последнее время приходится достаточно плотно заниматься разработкой на отличном javascript-фреймворке <a href="http://extjs.com/">ExtJS</a> и, в частности, много работать с таблицами. Чтобы визуально приукрасить и сделать таблицы более юзабельными я сделал для них т.н. &#8220;зебру&#8221;, т.е. чересстрочную раскраску. Далее я расскажу как это сделать.</p>
<p>Я не буду приводить полный код таблицы, только тот кусок, который отвечает за &#8220;зебру&#8221;:</p>
<pre><code>
Example.grid = Ext.extend(Ext.grid.GridPanel, {
    initComponent:function() {
        Ext.apply(this, {
            store:....,
            columns:...,
            viewConfig: {forceFit: true}
        });
        Example.grid.superclass.initComponent.apply(this, arguments);
    },
    onRender:function() {
        Example.grid.superclass.onRender.apply(this, arguments);
        this.getView().getRowClass = function(record,index) {
            return (index%2)?'odd':'even';
        }
    }
});</code></pre>
<p>За создание &#8220;зебры&#8221;, собственно, отвечает код, расположенный в обработчике события &#8220;onRender&#8221;. Этот код определяет функцию &#8220;getRowClass&#8221; объекта GridView нашей таблицы. Определяемая функция должна возвращать название css-класса, которое будет присвоено текущей строке. Эта функция будет вызвана для каждой строки, а на вход ей будет переданы текущая запись и номер строки. Для зебры достаточно знать номер строки и в зависимости от четности этого номера вернуть то или иное название класса. Не забудьте определить эти классы в своем файле стилей, иначе никаких визуальных изменений не увидите.</p>

	Tags: <a href="http://lobach.info/tag/extjs/" title="extjs" rel="tag">extjs</a>, <a href="http://lobach.info/tag/js/" title="js" rel="tag">js</a>, <a href="http://lobach.info/tag/sovety/" title="советы" rel="tag">советы</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=pTRaPJ"><img src="http://feeds.feedburner.com/~f/lobach?i=pTRaPJ" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/javascript/zebra-table/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Впечатления от PHPConf 2008 (день второй)</title>
		<link>http://lobach.info/some/phpconf2008-second-day/</link>
		<comments>http://lobach.info/some/phpconf2008-second-day/#comments</comments>
		<pubDate>Thu, 26 Jun 2008 17:41:10 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<category><![CDATA[конференция]]></category>

		<category><![CDATA[отчет]]></category>

		<guid isPermaLink="false">http://lobach.info/some/phpconf2008-second-day/</guid>
		<description><![CDATA[Этот пост получился с задержкой почти в месяц. Долго сомневался, надо ли его вообще писать. Но все же решился на компромиссный вариант &#8212; о втором дне напишу, но очень кратко.И так, впечатления о втором дне конференции.
Второй день начался с достаточно продолжительного и насыщенного доклада сотрудника Google Маркуса Бёргера (Marcus Börger) об объектно-ориентированном программировании на PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Этот пост получился с задержкой почти в месяц. Долго сомневался, надо ли его вообще писать. Но все же решился на компромиссный вариант &mdash; о втором дне напишу, но очень кратко.И так, впечатления о втором дне конференции.</p>
<p>Второй день начался с достаточно продолжительного и насыщенного доклада сотрудника Google Маркуса Бёргера (Marcus Börger) об объектно-ориентированном программировании на PHP и применении <a href="http://ru2.php.net/manual/ru/book.spl.php">SPL</a>. В первой части Маркус провел ликбез на тему ООП в PHP. Во второй части подробнее рассказал о SPL и её применении.</p>
<p>После Маркуса выступили два представителя мелкомяхких: Алексей Шуленин (Бесплатная версия SQL Server и ее использование в веб-приложениях) и Андрей Бешков (Powershell – скриптовый язык будущего). Любопытные, но бесполезные доклады.</p>
<p>Затем был доклад Светы Смирнова из MySQL. Рассказала о наиболее частых проблемах и их решениях. Было интересно послушать.</p>
<p>Потом отжигал Аксенов Андрей - автор поискового движка &#8220;Сфинкс&#8221;. С шутками и прибаутками рассказал о особенностях работы сфинкса и его оптимизации. Для меня было полезно, т.к. я работал со сфинксом и некоторые грабли уже успел словить.</p>
<p>Далее выступила комманда из MySQL. 4 человека отвечали на вопросы, присланные желающими.</p>
<p>А затем была половина доклада о XMLDB Sedna. Я с задачами работы с Native XMLDB не сталкивался, поэтому было мало интересно. Половина доклада была по причине подвоза пива. Организаторы быстренько свернули выступление, провели розыгрыш призов и отправили всех дринькать Пилснер.</p>
<p>Вот пожалуй и все о втором дне. Кстати, уже по прошествии месяца материалов конференции на сайте нет :(</p>
<p>В качестве бонуса, в блоге &#8220;<a href="http://www.xp2ubuntu.com/">С Windows XP на Ubuntu Linux</a>&#8221; выложены больше 30 <a href="http://www.xp2ubuntu.com/2008/06/blog-post.html">видеоуроков по Linux</a>. Качество, правда, не очень хорошее, но полезность однозначна. А на сайте <a href="http://zendframework.ru.">ZendFramework.RU</a> опубликован неплохой туториал по разработке приложений на ZF 1.5 - &#8220;<a href="http://zendframework.ru/articles/tutorial-building-basic-site-on-zend-framework-1-5/">Построение простого сайта на базе Zend Framework</a>&#8220;.</p>

	Tags: <a href="http://lobach.info/tag/konferenciya/" title="конференция" rel="tag">конференция</a>, <a href="http://lobach.info/tag/otchet/" title="отчет" rel="tag">отчет</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=sflJKI"><img src="http://feeds.feedburner.com/~f/lobach?i=sflJKI" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/some/phpconf2008-second-day/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Впечатления от PHPConf 2008 (день первый)</title>
		<link>http://lobach.info/some/phpconf2008-first-day/</link>
		<comments>http://lobach.info/some/phpconf2008-first-day/#comments</comments>
		<pubDate>Thu, 29 May 2008 19:15:26 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<category><![CDATA[конференция]]></category>

		<category><![CDATA[отчет]]></category>

		<guid isPermaLink="false">http://lobach.info/some/phpconf2008-first-day/</guid>
		<description><![CDATA[Волею случая и по приказу начальства, я и два моих коллеги были заброшены на начавшуюся сегодня конференцию PHPConf 2008. В этой заметке я кратко расскажу о моем впечатлении от мероприятия, не удержавшись, конечно, от сравнения с РИТ 2008 (о РИТ-е см. РИТ2008, день первый и РИТ2008, день второй).
Это мое первое посещение PHPConf, поэтому дать оценку, [...]]]></description>
			<content:encoded><![CDATA[<p>Волею случая и по приказу начальства, я и два моих коллеги были заброшены на начавшуюся сегодня конференцию <a href="http://phpconf.ru/">PHPConf 2008</a>. В этой заметке я кратко расскажу о моем впечатлении от мероприятия, не удержавшись, конечно, от сравнения с <a href="http://rit2008.ru/">РИТ 2008</a> (о РИТ-е см. <a href="/some/rit2008-first-day/">РИТ2008, день первый</a> и <a href="/some/rit2008-second-day/">РИТ2008, день второй</a>).</p>
<p>Это мое первое посещение PHPConf, поэтому дать оценку, стала ли конференция сильнее или нет, я не смогу. Но впечатления от первого дня остались очень положительные.</p>
<p>Сначала опишу мои впечатления от докладов.</p>
<ul>
<li><strong>Что нового в PHP-5.3</strong> (Дмитрий Стогов, программист <a href="http://www.zend.com/">Zend Technologies</a>) &mdash; доклад состоял из перечисления нововведений в следующей версии PHP. Почти ничего нового для себя я не услышал, кроме введения новой библиотеки для работы с MySQL (пока, правда, PDO не поддерживается - только расширения mysql и mysqli) и введение технологии, аналогичной .htaccess (т.е. возможность указать директивы php в привязке к каталогу). Выступал Дмитрий хорошо, слушать было интересно, хоть и полезного вынес мало.</li>
<li><strong>Управление Данными (Data management)</strong> (Михаил Красовский, <a href="http://www.ornl.gov/">Oak Ridge National Laboratory</a>) &mdash; доклад об организации управлением и обработкой данных. Материал доклада был в большей степени теоретическим - фактически представлял абстрактную основу для построения качественной системы управления данными. Михаилу удалось в своем докладе донести четкую схему построения систем обработки огромных массивов данных, сделал это простым и живым языком, в меру разбавляя материал примерами из своей практики. Доклад оставил отличные впечатления.</li>
<li><strong>Zend Engine изнутри</strong> (Дмитрий Стогов, программист <a href="http://www.zend.com/">Zend Technologies</a>) &mdash; доклад был очень прикладным, описывал нюансы реализации ZE и примеры написания собственных расширений. Тема доклада была уж очень специфичной, лично мне пользы было мало - еще не дорос до таких вещей.</li>
<li><strong>Как сохранить данные в браузере?</strong> (Илья Кантор, автор <a href="http://javascript.ru/">http://javascript.ru</a>) &mdash; доклад о принципах реализации и применении технологии <a href="http://browserpersistence.ru/">BrowserPersistence</a> (хранение на стороне клиента большого количества данных, порядок - мегабайт и более). Доклад хороший, технология интересная, но применять её стоит с осторожностью. (кстати, Илья выложил презентацию доклада, желающие забирают <a href="http://javascript.ru/blog/ilya-kantor/browserpersistence-phpconf">обновленный доклад по хранению данных в браузере</a>)</li>
<li><strong>Оптимизация запросов в PostgreSQL</strong> (Борзов Алексей [SadSpirit], независимый разработчик, ведущий раздела PostgreSQL на <a href="http://phpclub.ru/">PHPClub.ru</a>) &mdash; доклад весьма информативный и полезный, жаль что не для меня. в целом, думаю, использующим PostgreSQL была несомненная польза от доклада.</li>
<li><strong>От стартапа до highload: Эволюция веб-проекта или как победить нагрузку</strong> (Антон Терехов, ведущий инженер-программист, ООО &#8220;Медиа Мир&#8221; (РБК))  &mdash; ретроспектива развития фотохостинга <a href="http://photofile.ru/">PhotoFile.ru</a>: начальное состояние проекта, этапы развития, текущие архитектурные решения и их результаты. Весьма интересный и познавательный доклад. 55 файл-серверов и столько же бэкап-серверов &mdash; это впечатляет (не рекорд, конечно, но тем не менее).</li>
<li><strong>Трансляция флэш-видео</strong> (Большов Виктор, ведущий разработчик, компания &#8220;Chronopay&#8221;)  &mdash; это был скорее не доклад, а мастер-класс на тему организации потокового вещания на веб-сайте. Занятно, но пока мне применить негде. В целом доклад неплох.</li>
</ul>
<p>Далее был заявлен доклад на тему &#8220;<strong>Zend_Memory</strong>&#8220;, но его небыло. Вместо этого было два доклада: о работе с  гео-данными в mysql и о построении XML-XSLT шаблонизатора. К сожалению ни точного названия докладов, ни имен докладчиков я не запомнил. Надеюсь, все презентации разместят на сайте конференции, тогда дополню этот пост. Впечатления: первый понравился и был полезным, второй не понравился.</p>
<p>Особо впечатлил обед - шведский стол с массой разносолов (салаты, мясная и рыбная нарезка, второе и гарниры, десерты, соки и кофе/чай). Все было вкусно. Остался очень довольным. Особенно если сравнить с организацией обедов на РИТ-е.</p>
<p>По сравнению с РИТ-ом, PHPConf более специализированная конференция. Она в большей степени отвечает моим профессиональным интересам.</p>
<p>На сегодня все. Завтра будет заметка о впечатлениях от второго дня. До встречи!</p>
<p><strong>Upd:</strong>Доклад о XML-XSLT принадлежит Сергею Антонинко (компания UMISoft)</p>

	Tags: <a href="http://lobach.info/tag/konferenciya/" title="конференция" rel="tag">конференция</a>, <a href="http://lobach.info/tag/otchet/" title="отчет" rel="tag">отчет</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=Y7GtOH"><img src="http://feeds.feedburner.com/~f/lobach?i=Y7GtOH" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/some/phpconf2008-first-day/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Будни девелопера</title>
		<link>http://lobach.info/develop/%d0%b1%d1%83%d0%b4%d0%bd%d0%b8-%d0%b4%d0%b5%d0%b2%d0%b5%d0%bb%d0%be%d0%bf%d0%b5%d1%80%d0%b0/</link>
		<comments>http://lobach.info/develop/%d0%b1%d1%83%d0%b4%d0%bd%d0%b8-%d0%b4%d0%b5%d0%b2%d0%b5%d0%bb%d0%be%d0%bf%d0%b5%d1%80%d0%b0/#comments</comments>
		<pubDate>Mon, 05 May 2008 19:38:27 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Разработка]]></category>

		<category><![CDATA[comedy]]></category>

		<category><![CDATA[pm]]></category>

		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://lobach.info/develop/%d0%b1%d1%83%d0%b4%d0%bd%d0%b8-%d0%b4%d0%b5%d0%b2%d0%b5%d0%bb%d0%be%d0%bf%d0%b5%d1%80%d0%b0/</guid>
		<description><![CDATA[Наткнулся на совершенно шикарный ролик о принципах работы в индустрии визуальных эффектов.  
Похоже, что от индустрии веб-разработок отличается мало ;)


	Tags: comedy, pm, youtube
]]></description>
			<content:encoded><![CDATA[<p>Наткнулся на совершенно шикарный ролик о принципах работы в индустрии визуальных эффектов.  </p>
<p>Похоже, что от индустрии веб-разработок отличается мало ;)</p>
<p><object width="425" height="355"><param name="movie" value="http://www.youtube.com/v/HPflLGEHUAI&#038;hl=en&#038;color1=0x006699&#038;color2=0x54abd6"></param><param name="wmode" value="transparent"></param><embed src="http://www.youtube.com/v/HPflLGEHUAI&#038;hl=en&#038;color1=0x006699&#038;color2=0x54abd6" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"></embed></object></p>

	Tags: <a href="http://lobach.info/tag/comedy/" title="comedy" rel="tag">comedy</a>, <a href="http://lobach.info/tag/pm/" title="pm" rel="tag">pm</a>, <a href="http://lobach.info/tag/youtube/" title="youtube" rel="tag">youtube</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=qCpwkH"><img src="http://feeds.feedburner.com/~f/lobach?i=qCpwkH" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/%d0%b1%d1%83%d0%b4%d0%bd%d0%b8-%d0%b4%d0%b5%d0%b2%d0%b5%d0%bb%d0%be%d0%bf%d0%b5%d1%80%d0%b0/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Итоги апреля</title>
		<link>http://lobach.info/some/april-counting/</link>
		<comments>http://lobach.info/some/april-counting/#comments</comments>
		<pubDate>Mon, 05 May 2008 19:14:27 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<guid isPermaLink="false">http://lobach.info/some/april-counting/</guid>
		<description><![CDATA[В апреле в статистике этого блога произошли знаменательные события. Количество уникальных посетителей перевалило за тысячу (жаль что не в сутки ;) ). 
Мои заметки о РИТе вызвали определенный интерес и подняли количество посетителей в два раза. Кстати, я удивился когда не обнаружил ни одного поста на тему РИТа среди ленты фидов, на которы подписан. Странная [...]]]></description>
			<content:encoded><![CDATA[<p>В апреле в статистике этого блога произошли знаменательные события. Количество уникальных посетителей перевалило за тысячу (жаль что не в сутки ;) ). </p>
<p>Мои заметки о <a href="http://rit2008.ru/">РИТе</a> вызвали определенный интерес и подняли количество посетителей в два раза. Кстати, я удивился когда не обнаружил ни одного поста на тему РИТа среди ленты фидов, на которы подписан. Странная ситуация.</p>
<p>А теперь хочу поблагодарить коллег-блогеров (и один сервис :) ):
<ul>
<li>Пискун Юрий (<a href="http://yoyurec.in.ua/">&lt;ё&gt; YoYurec Field &lt;/ё&gt;</a>) &mdash; довольно интересный блог на тему веб-девелопмента,</li>
<li>Поиск по блогам Яндекса (<a href="http://blogs.yandex.ru/">http://blogs.yandex.ru/</a>) &mdash; много запросов о РИТе,</li>
<li>Стаценко Владимир (<a href="http://www.simplecoding.org/">http://www.simplecoding.org/</a>) &mdash; коллега на ниве просвещения в области контроля версий,</li>
<li><a href="http://www.mysvn.ru/">MySVN</a> &mdash; Subversion-hosting</li>
</ul>
<p>Эти блоги и сайты в апреле привели ко мне подавляющее число читателей. Спасибо!</p>
Этот пост без меток.<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=VgXdPH"><img src="http://feeds.feedburner.com/~f/lobach?i=VgXdPH" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/some/april-counting/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Отчет о втором дне РИТ-2008</title>
		<link>http://lobach.info/some/rit2008-second-day/</link>
		<comments>http://lobach.info/some/rit2008-second-day/#comments</comments>
		<pubDate>Tue, 15 Apr 2008 20:06:13 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<category><![CDATA[конференция]]></category>

		<category><![CDATA[отчет]]></category>

		<guid isPermaLink="false">http://lobach.info/some/rit2008-second-day/</guid>
		<description><![CDATA[Итак, день второй&#8230;
К началу первого выступления мне снова не удалось подъехать, но в этот раз я опоздал всего на 5-7 минут. Проблема заключалась в транспорте &#8212; он хоть и был бесплатный, но совершенно непонятно было где его искать, единственным ориентиром было указание на метро &#8220;Тушинская&#8221;. Однако мест остановки автобусов там достаточно много, а интервал движения [...]]]></description>
			<content:encoded><![CDATA[<p>Итак, день второй&#8230;</p>
<p>К началу первого выступления мне снова не удалось подъехать, но в этот раз я опоздал всего на 5-7 минут. Проблема заключалась в транспорте &mdash; он хоть и был бесплатный, но совершенно непонятно было где его искать, единственным ориентиром было указание на метро &#8220;Тушинская&#8221;. Однако мест остановки автобусов там достаточно много, а интервал движения заявлен раз в 20 минут, было совершенно непонятно где их искать (за это &#8220;минус&#8221; организаторам). К счастью минут за 15 мне таки удалось точно отыскать место посадки. А вот находчивость ответственного за организацию доставки людей заслуживает всяческих похвал. Этот молодой человек, видя что желающих уехать много и времени уже много, а следующий автобус будет только через 20 минут, договаривается с водителями стоящих рядом маршрутных такси. После этого люди спокойно едут в &#8220;Крокус Экспо&#8221;, а не мерзнут на остановке, дожидаясь следующего автобуса (а кому-то могло и в нем не хватить мест). Могу только выразить искреннюю благодарность за хорошую работу.</p>
<p>Перехожу к впечатлениям от докладов. Остановлюсь только на тех, которые произвели впечатление.</p>
<ul>
<li>Модерируемые справочники (<a href="http://dklab.ru/">Дмитрий Котеров</a>) &mdash; интересный доклад о методике двухуровневой модерации различных справочников. Материал по большей части теоритический, но послушать было интересно.</li>
<li>Инструменты Oracle для разработки небольших web-приложений (Олег Оленин). Доклад о целесообразности применения бесплатного решения от компании Oracle, а именно о <a href="http://www.oracle.com/technology/products/database/xe/index.html">Oracle 10g XE</a> и <a href="http://www.oracle.com/technology/products/database/application_express/html/apex_and_xe.html">Oracle Application Express</a>. Выступление носило рекламный характер &mdash; описывались плюсы именно СУБД от Oracle, развенчивались &#8220;мифы&#8221;, ну и т.п. Хотя, честно говоря, после доклада мне захотелось попробовать вернуться к использованию оракловой СУБД, благо опыт есть достаточно большой, а в ограничения бесплатной версии я упереться не должен. К сожалению, времени на доклад нехватило катастрофически (приблизительно часов 5, судя по заготовленному материалу :) ). И еще одно сожаление &mdash; на сайте нет презентации этого доклада, увы.</li>
<li>Супер-доклады сделал Алексей Могилевский &#038;mdash &#8220;Презентация IE8&#8243; и &#8220;CSS - как делаются стандарты&#8221;. Алексей выступал очень живо, весело и интересно. Немного рассказал что сделано в IE8, что будет сделано и чего точно не будет сделано. Приоткрыл &#8220;кухню&#8221; разработки стандарта CSS, поделился планами и сроками реализации. Показал несколько &#8220;вкусностей&#8221; из грядущего через 3-4 года CSS3. Зал принял Алексея очень тепло, и часто поддавался на провокации докладчика бурными аплодисментами.</li>
</ul>
<p>На этом, пожалуй, понравившиеся мне доклады закончились. Мастер-класс Сергея Чикуенока на тему создания анимации без использования Flash, оставил после себя недоумение. Сергей 3/4 времени описывал проблемы, связанные с особенностями Flash, и достоинства применения java-script. Оставшееся время бегло перечислил js-фреймворки, в том числе и свой собственный, и показал четыре примера анимации, реализованной с помощью JS. На мой взгляд, мастер-класс должен содержать очень много практического материала и демонстраций, чего практически небыло у Сергея. Увы.</p>
<p>Записи некоторых докладов уже выложили на RuTube, но пока (я надеюсь) еще не все. Найти их можно по адресу <a href="http://rutube.ru/playlists/play/42454.html">http://rutube.ru/playlists/play/42454.html</a>. А тезисы и некоторые презентации располагаются на сайте РИТ в разделе <a href="http://www.rit2008.ru/2008.html">Материалы РИТ-2008</a>.</p>
<p>В итоге, впечатления от конференции остались весьма положительные, было много интересных и познавательных докладов. Хотя уровень некоторых докладчиков оставлял желать лучшего. Технические и организационные моменты конференции меня вполне устроили (за исключением вопроса питания).</p>
<p>В общем, желаю успеха организаторам конференции и дальнейшего роста уровня мероприятий.</p>

	Tags: <a href="http://lobach.info/tag/konferenciya/" title="конференция" rel="tag">конференция</a>, <a href="http://lobach.info/tag/otchet/" title="отчет" rel="tag">отчет</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=4lqQDuG"><img src="http://feeds.feedburner.com/~f/lobach?i=4lqQDuG" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/some/rit2008-second-day/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
