<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Лобач.info &#187; Zend Framework</title>
	<atom:link href="http://lobach.info/category/develop/zf/feed/" rel="self" type="application/rss+xml" />
	<link>http://lobach.info</link>
	<description>Заметки LAMP-программиста о вебдеве и не только...</description>
	<lastBuildDate>Fri, 23 Dec 2011 10:23:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</title>
		<link>http://lobach.info/develop/zf/zfconf2011-registratio/</link>
		<comments>http://lobach.info/develop/zf/zfconf2011-registratio/#comments</comments>
		<pubDate>Thu, 05 May 2011 11:22:34 +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=191</guid>
		<description><![CDATA[По просьбе организаторов публикую анонс предстоящей конференции ZFConf 2011. Присутствовать воплоти снова не удастся, так хоть окажу посильную помощь. Список докладов и финальная регистрация ZFConf 2011 Основные подготовительные работы по конференции закончены. Доклады сформированы. Среди спикеров представители KnpLabs, Magento, JetBrains, &#8230; <a href="http://lobach.info/develop/zf/zfconf2011-registratio/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.zfconf.ru/"><img src="http://lobach.info/wp-content/uploads/2011/05/a_78058dc0.jpg" alt="Логотип ZendFramework Conference" title="ZF Conf" width="192" height="139" class="alignleft size-full wp-image-192" /></a> По просьбе организаторов публикую анонс предстоящей конференции ZFConf 2011. Присутствовать воплоти снова не удастся, так хоть окажу посильную помощь.</p>
<h2>Список докладов и финальная регистрация ZFConf 2011</h2>
<p>Основные подготовительные работы по конференции закончены. Доклады сформированы. Среди спикеров представители KnpLabs, Magento, JetBrains, Sphinx и других известных компаний.</p>
<p>Открыта <a href="http://www.zfconf.ru/registration/" target="_blank"><strong>финальная регистрация</strong></a>!</p>
<p><strong>Если Вы проходили предварительную регистрацию</strong>, то для прохождения финальной регистрации Вам нужно перейти по специальной ссылке, отправленной на e-mail. Введенную ранее информацию нужно будет только подтвердить. Если ссылка не приходила Вам, ее можно запросить через <a href="http://www.zfconf.ru/get-registration-path/" target="_blank">специальную форму</a>.</p>
<p>Пожалуйста, обратите внимание на то, что <strong>изменилось <a href="http://www.zfconf.ru/2011/location/" target="_blank" >место проведения</a></strong>! Мероприятие будет проходить на прошлогодней площадке — в актовом зале ЛГТЦ (Ленгипротранс-Центр), по адресу: Московский пр., 143, ст. м. «Электросила». Кофе-брейки и обсуждения на флипчартах будут проходить в фойе.</p>
<p><strong>Cписок докладов:</strong></p>
<ul>
<li><a href="http://www.zfconf.ru/2011/topics/flexible-architecture-using-dependency-injection/">Гибкая архитектура Zend Framework приложений с использованием Dependency Injection</a><br />
Алексей Качаев (Сogniance, Senior PHP Developer)</li>
<li><a href="http://www.zfconf.ru/2011/topics/performance-increasing-with-phpdaemon-varnish-esi/">Воюем за ресурсы: Повышение производительности Zend Framework приложения с помощью phpDaemon, Varnish и ESI</a><br />
Алексей Качаев (Сogniance, Senior PHP Developer)</li>
<li><a href="http://www.zfconf.ru/2011/topics/behavior-driven-development/">Behavior Driven Development в PHP и Zend Framework</a><br />
Константин Кудряшов (KnpLabs, Senior Web Developer)</li>
<li><a href="http://www.zfconf.ru/2011/topics/multitasking-distributed-system-with-job-queue/">Разделение труда: Организация многозадачной, распределенной системы в Zend Framework с помощью Job Queue</a><br />
Александр Готгельф (Magento, PHP-разработчик)</li>
<li><a href="http://www.zfconf.ru/2011/topics/how-can-help-development-environment/">Как может помочь среда разработки при написании приложения на Zend Framework?</a><br />
Николай Матвеев (JetBrains, разработчик)</li>
<li><a href="http://www.zfconf.ru/2011/topics/creating-rest-api-for-third-party-developers-and-mobile-devices-with-oauth/">Создание REST-API для сторонних разработчиков и мобильных устройств с авторизацией по протоколу OAuth 1.0</a><br />
Дмитрий Чижевский (Дзен-мани, разработчик)</li>
<li><a href="http://www.zfconf.ru/2011/topics/fat-model-through-orm-development-history/">Толстая модель: История разработки собственного ORM</a><br />
Михаил Шамин (Геометрия, ведущий разработчик)</li>
<li><a href="http://www.zfconf.ru/2011/topics/what-is-sphinx-and-how-use-it-with-php/">Что такое Sphinx, зачем он вообще нужен и как его использовать с PHP (от простого индекса до поискового кластера)</a><br />
Владимир Федорков (Sphinx, Director of Professional Services)</li>
</ul>
<p>Стоимость участия в мероприятии составит 1500 руб. В данную сумму входит: участие в самой конференции, кофе-брейки (от внешней кейтеринг-компании), пакет материалов участника и доступ к профессиональным видеозаписям докладов (после мероприятия). Доступно <a href="http://www.zfconf.ru/payment-types/" target="_blank" >множество способов оплаты</a>.</p>
<p>Торопитесь, <strong>количество мест ограничено</strong>!</p>
<p>Обязательно следите за последними новостями:<br />
&mdash; <strong>RSS-канал:</strong> <a href="http://feeds.feedburner.com/zfconf" target="_blank">feeds.feedburner.com/zfconf</a><br />
&mdash; <strong>Twitter:</strong> <a href="http://twitter.com/zfconf" target="_blank">@zfconf</a><br />
&mdash; <strong>Группа ВКонтакте:</strong> <a href="http://vkontakte.ru/club14951507" target="_blank">vkontakte.ru/club14951507</a></p>
<p><strong>Организатор:</strong> <a href="http://www.wizartech.ru/" target="_blank">компания Wizartech</a><br />
<strong>Партнеры:</strong> <a href="http://zendframework.ru/" target="_blank">сообщество zendframework.ru</a> и <a href="http://zfconf.org.ua/" target="_blank">конференция ZFConf Ukraine</a></p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework on Лобач.info',url: 'http://lobach.info/develop/zf/zfconf2011-registratio/',contentID: 'post-191',suggestTags: 'php,zend framework,конференция',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <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/konferenciya/" title="конференция" rel="tag">конференция</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zfconf2011-registratio/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Изменение размера загружаемых изображений</title>
		<link>http://lobach.info/develop/zf/resizing-loaded-image/</link>
		<comments>http://lobach.info/develop/zf/resizing-loaded-image/#comments</comments>
		<pubDate>Wed, 17 Nov 2010 07:13:46 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[resize]]></category>
		<category><![CDATA[thumbnail]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_File_Transfer]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=175</guid>
		<description><![CDATA[Загрузка изображений&#160;&#8212; задача достаточно часто встречающаяся при разработке различных сайтов. Чаще такая потребность встречается в бэкофисе&#160;&#8212; у администратора или контент-менеджера. Но и обычным посетителям иногда нужно дать такую возможность. Реализовать загрузку файлов проблемы не составляет&#160;&#8212; для этого в Zend Framework &#8230; <a href="http://lobach.info/develop/zf/resizing-loaded-image/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://lobach.info/wp-content/uploads/2010/11/zf-logo.png" alt="Zend Framework" title="Zend Framework" width="160" height="85" class="alignleft size-full wp-image-179" />Загрузка изображений&nbsp;&mdash; задача достаточно часто встречающаяся при разработке различных сайтов. Чаще такая потребность встречается в бэкофисе&nbsp;&mdash; у администратора или контент-менеджера. Но и обычным посетителям иногда нужно дать такую возможность.</p>
<p><span id="more-175"></span></p>
<p>Реализовать загрузку файлов проблемы не составляет&nbsp;&mdash; для этого в Zend Framework есть специальный компонент: <a href="http://framework.zend.com/manual/en/zend.file.transfer.introduction.html">Zend_File_Transfer</a>. Подробно его использование я описывать не буду&nbsp;&mdash; в руководстве это описано достаточно хорошо, а хочу остановиться на связанной с загрузкой изображений задаче. А именно на изменении размеров загруженных изображений.</p>
<p>Существует два подхода к изменению размера изображений:</p>
<ul>
<li>подготовить изображение нужного размера при его загрузке пользователем</li>
<li>изменить размер изображения в момент получения запроса на его отображение</li>
</ul>
<p>Каждый из подходов имеет свои плюсы и минусы, останавливаться на этом не буду. Желающие подробнее разобраться достоинствах и недостатках подходов могут спросить у гугла или яндекса&nbsp;&mdash; материала на эту тему достаточно.</p>
<p>В качестве примера, хочу предложить свою реализацию первого подхода. Особенность её заключается в удобной интеграции с компонентом <a href="http://framework.zend.com/manual/en/zend.file.transfer.introduction.html">Zend_File_Transfer</a>. Достигается это за счет того, что ресайзер фактически представляет собой фильтр и может быть легко добавлен в цепочку фильтров/валидаторов транспорта.</p>
<p>Основой моего класса стала статья Ильдара Шайморданова &laquo;<a href="http://debugger.ru/articles/thumbnails">Thumbnails: Теория и практика создания миниатюрных изображений</a>&raquo; (<a href="http://code.google.com/p/php-funs/downloads/list">исходный код библиотеки</a>). Код класса также частично основан на библиотеке Ильдара (с его любезного разрешения). Загрузить фильтр можно с <a href="https://github.com/bladeofsteel/zfImageFilter/blob/master/library/App/Filter/File/ImageResize.php">github-а</a>. Кстати, буду благодарен за помощь в написании английской версии документации.</p>
<h3 id="options">Параметры</h3>
<p>Глупо было бы писать фильтр, создающий изображения только одного размера и только одним способом. Поэтому фильтр позволяет себя настраивать. Для этого нужно в конструктор фильтра передать массив параметров:</p>
<ul>
<li>width&nbsp;&mdash; ширина миниатюры в пикселях (целое положительное число, по умолчанию 800);</li>
<li>height&nbsp;&mdash; высота миниатюры в пикселях (целое положительное число, по умолчанию 600);</li>
<li>method&nbsp;&mdash; метод обработки&nbsp;&mdash; максимальное/минимальное сжатие, вырезание фрагмента целого(целое число, по умолчанию максимальное сжатие);</li>
<li>percent&nbsp;&mdash; масштабирование в процентах от оригинала (положительное вещественное число на интервале от 0 до 1, по умолчанию 0);</li>
<li>halign&nbsp;&mdash; вертикальное выравнивание (допустимые значения 0&nbsp;&mdash; по центру, &lt; 0&nbsp;&mdash; выравнивание по верхнему краю, > 0&nbsp;&mdash; выравнивание по нижнему краю, по умолчанию&nbsp;&mdash; 0);</li>
<li>valign&nbsp;&mdash; горизонтальное выравнивание (допустимые значения 0&nbsp;&mdash; по центру, &lt; 0&nbsp;&mdash; выравнивание влево, > 0&nbsp;&mdash; выравнивание вправо, по умолчанию&nbsp;&mdash; 0);</li>
</ul>
<p>Если указать параметр &laquo;масштаб&raquo;, отличный от 0, то для вычисления размеров будет использован он, а ширина и высота проигнорированы.</p>
<p>В классе определены несколько констант:</p>
<ul>
<li>Методы обработки:
<ul>
<li>METHOD_SCALE_MAX&nbsp;&mdash; максимальное сжатие;</li>
<li>METHOD_SCALE_MIN&nbsp;&mdash; минимальное сжатие;</li>
<li>METHOD_CROP&nbsp;&mdash; вырезание фрагмента;</li>
</ul>
</li>
<li>Методы выравнивания:
<ul>
<li>ALIGN_CENTER&nbsp;&mdash; выравнивать по центру, подходит для горизонтального и вертикального выравнивания;</li>
<li>ALIGN_LEFT&nbsp;&mdash; выравнивать по левому краю;</li>
<li>ALIGN_RIGHT&nbsp;&mdash; выравнивать по правому краю;</li>
<li>ALIGN_TOP&nbsp;&mdash; выравнивать по верхнему краю;</li>
<li>ALIGN_BOTTOM&nbsp;&mdash; выравнивать по нижнему краю;</li>
</ul>
</li>
</ul>
<h3 id="examples">Примеры</h3>
<p><div id='stb-container-7110' class='stb-container'><div id='stb-caption-box-7110' class='stb-warning-caption_box stb_caption' >Предупреждение<div id="stb-tool-7110" class="stb-tool" style="float:right; padding:0px; margin:0px auto"><img id="stb-toolimg-7110" style="border: none; background-color: transparent; padding: 0px; margin: 0px auto;" src="http://lobach.info/wp-content/plugins/wp-special-textboxes/images/hide.png" title="Скрыть" /></div></div><div id='stb-body-box-7110' class='stb-warning-body_box stb_body' >примеры намеренно упрощены для иллюстрации работы фильтра. В реальных приложениях необходимы дополнительные проверки. Примеры использования транспорта смотрите в документации</div></div></p>
<p><em>Пример создания фильтра:</em></p>
<pre><code class="php">$filter = new App_Filter_File_ImageResize(array(
    'width' =&gt; 100,
    'heigth' =&gt; 100
));
$upload = new Zend_File_Transfer_Adapter_Http();
$upload-&gt;addFilter($filter);</code></pre>
<p><em>Создание миниатюры:</em></p>
<pre><code class="php">$options = array('width' =&gt; 100, 'height' =&gt; 100);
&nbsp;
$upload = new Zend_File_Transfer_Adapter_Http();
$upload-&gt;addFilter(new App_Filter_File_ImageResize($options))
       -&gt;setDestination('/path/to/upload/directory');
if (!$upload-&gt;receive()) {
    echo implode("\n", $upload-&gt;getMessages());
    return;
}
$filename = $upload-&gt;getFileName();</code></pre>
<p>В переменной <code>$filename</code> будет имя уже уменьшенного файла.</p>
<p><em>Каскадное уменьшение больших изображений:</em></p>
<pre><code class="php">$bigSize   = array('width' =&gt; 1600, 'height' =&gt; 1200);
$smallSize = array('width' =&gt; 800, 'height' =&gt; 600);
&nbsp;
$upload = new Zend_File_Transfer_Adapter_Http();
$upload-&gt;addFilter(new App_Filter_File_ImageResize($bigSize))
       -&gt;addFilter(new App_Filter_File_ImageResize($smallSize))
       -&gt;setDestination('/path/to/upload/directory');
if (!$upload-&gt;receive()) {
    echo implode("\n", $upload-&gt;getMessages());
    return;
}
$filename = $upload-&gt;getFileName();</code></pre>
<p>В этом примере изображение сначала уменьшается до размеров 1600&times;1200, а за тем до 800&times;600. Такое каскадное уменьшение позволяет в итоге получить качество несколько лучшее, чем уменьшение очень большого изображения до очень маленького за один шаг.</p>
<p>В заключении приведу еще раз ссылку на исходный код класса: <a href="https://github.com/bladeofsteel/zfImageFilter/blob/master/library/App/Filter/File/ImageResize.php">App_Filter_File_ImageResize</a>.</p>
<p>Предложения по улучшению и багрепорты приветствуются. Можете оставлять их как здесь, так и на гитхабе.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Изменение размера загружаемых изображений on Лобач.info',url: 'http://lobach.info/develop/zf/resizing-loaded-image/',contentID: 'post-175',suggestTags: 'resize,thumbnail,zend framework,Zend_File_Transfer',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/resize/" title="resize" rel="tag">resize</a>, <a href="http://lobach.info/tag/thumbnail/" title="thumbnail" rel="tag">thumbnail</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_file_transfer/" title="Zend_File_Transfer" rel="tag">Zend_File_Transfer</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/zfconf2011-registratio/" title="Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework (05.05.2011)">Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/resizing-loaded-image/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Конференция ZFConf Ukraine &amp; MageConf. 27го ноября 2010, Киев</title>
		<link>http://lobach.info/develop/zf/zfconf-ukraine-2010/</link>
		<comments>http://lobach.info/develop/zf/zfconf-ukraine-2010/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 07:00:38 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[анонс]]></category>
		<category><![CDATA[конференция]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=178</guid>
		<description><![CDATA[По просьбе коллег публикую анонс предстоящей конференции: 27го ноября в в Киеве пройдет бесплатная, международная, совместная конференция ZFConf Ukraine &#38; MageConf. Цель конференции&#160;&#8212; объединить лучших специалистов PHP и Zend Framework Украины, России и других стран СНГ. ZFConf Ukraine &#8211; первая &#8230; <a href="http://lobach.info/develop/zf/zfconf-ukraine-2010/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>По просьбе коллег публикую анонс предстоящей конференции:</p>
<p><img vspace="5" hspace="5" border="0" align="left" src="http://habreffect.ru/files/a10/cbbfacb76/zfconfua_and_mageconf.jpg" alt="image" /><br />
27го ноября в в Киеве пройдет бесплатная, международная, совместная конференция <a href="http://zfconf.org.ua">ZFConf Ukraine</a> &amp; <a href="http://mageconf.com">MageConf</a>. Цель конференции&nbsp;&mdash; объединить лучших специалистов PHP и Zend Framework Украины, России и других стран СНГ.</p>
<p>ZFConf Ukraine &ndash; первая в Украине конференция по Zend Framework, проводится в партнерстве с <a href="http://www.zfconf.ru">ZFConf Russia</a> и сообществом <a href="http://zendframework.ru">zendframework.ru</a>. ZFConf Russia была первой конференцией по Zend Framework и прошла в марте этого года в Санкт-Петербурге, Россия, собрав более 200 участников из России, Беларуси, Украины, Литвы и других стран СНГ</p>
<p>Конференция MageConf впервые прошла в мае 2010 года в Киеве. Это была первая конференция из серии PHP and Zend Framework в Украине. Ее посетили более 150 специалистов.</p>
<p>Конференция пройдет <strong>27 ноября</strong>, в Киеве<br />
Титульный спонсор конференции &ndash; компания <a href="http://www.magentocommerce.com/">Magento</a><br />
Место: КиевЭкспоПлаза, ул. Салютная 2б, 3 павильон<br />
Время: 27 ноября 2010 г. (с 11:00 до 19:00)<br />
Длительность: 1 полный день<br />
Формат: доклады в <strong>три потока</strong> и обсуждения на флипчарте (в перерывах)<br />
Язык докладов: русский<br />
Стоимость участия: <strong>бесплатно</strong><br />
Потоки: Zend Framework, PHP, Magento.</p>
<p>Аудитория: Разработчики ПО и специалисты по Project Management с Украины, России и близлежащих стран СНГ. Ожидаемое количество участников &ndash; 500 человек.</p>
<p><strong><a href="http://zfconf.org.ua/conf-2010/category/topics/">Доклады</a></strong></p>
<p><strong>1. Встречайте Zend Framework 2.0</strong><br />
Александр Веремьев / Zend Framework Core команда (<a href="http://www.zend.com/">Zend Technologies</a>)</p>
<p><strong>2. Эволюция ZF: архитектура, шаблоны, рефакторинг</strong><br />
Виктор Фараздаги / Component Maintainer и Contributor ZF 2.0 (4C)</p>
<p><strong>3. Юнит тестирование в Zend Framework 2.0</strong><br />
Ростислав Михайлив / Chief Developer / Software Architect (Gadu-Gadu)</p>
<p><strong>4. Хранение, обработка и отдача статики с использованием \Zend \File. Опыт социальной сети starlook.ru</strong><br />
Кирилл Мокевнин / Senior developer (undev)</p>
<p><strong>5. Чуть сложнее чем Singleton: аннотации, IOC, АОП</strong><br />
Кирилл Чебунин / Senior PHP Developer (Альпари)</p>
<p><strong>6. Doctrine 2</strong><br />
Валерий Рабиевский / Team leader (<a href="http://stfalcon.com">stfalcon.com</a>)</p>
<p>Список еще будет обновляться, вы также можете подать заявку на доклад, если вам есть чем поделиться поделиться с общественностью.  Также были бы рады услышать ваши комментарии по текущим темам.</p>
<p><strong><a href="http://zfconf.org.ua/registration/">Регистрация</a></strong><br />
Регистрируясь на одну конференцию, вы автоматически получаете доступ и на другую.</p>
<p>Если у вас есть предложения, или вы хотите быть спонсором, для связи с нами используйте <a href="http://zfconf.org.ua/contacts/">контакты</a></p>
<p>Регистрируйтесь и следите за обновлениями на <a href="http://zfconf.org.ua">http://zfconf.org.ua</a></p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Конференция ZFConf Ukraine &amp; MageConf. 27го ноября 2010, Киев on Лобач.info',url: 'http://lobach.info/develop/zf/zfconf-ukraine-2010/',contentID: 'post-178',suggestTags: 'zend framework,анонс,конференция',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/%d0%b0%d0%bd%d0%be%d0%bd%d1%81/" title="анонс" rel="tag">анонс</a>, <a href="http://lobach.info/tag/konferenciya/" title="конференция" rel="tag">конференция</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/zfconf2011-registratio/" title="Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework (05.05.2011)">Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zfconf-ukraine-2010/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Вышел ZF 1.11</title>
		<link>http://lobach.info/develop/zf/%d0%b2%d1%8b%d1%88%d0%b5%d0%bb-zf-1-11/</link>
		<comments>http://lobach.info/develop/zf/%d0%b2%d1%8b%d1%88%d0%b5%d0%bb-zf-1-11/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 16:00:03 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=176</guid>
		<description><![CDATA[Вчера вышел Zend Framework 1.11. Вероятно, это будет последний релиз в ветке 1.х. Дальнейшее развитие фреймворка продолжится в ветке 2.х. Главной причиной, побудившей меня написать эту заметку, стало включение моего класса для тестирования рассылки почты в этот релиз. Хочу выразить &#8230; <a href="http://lobach.info/develop/zf/%d0%b2%d1%8b%d1%88%d0%b5%d0%bb-zf-1-11/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Вчера вышел Zend Framework 1.11. Вероятно, это будет последний релиз в ветке 1.х. Дальнейшее развитие фреймворка продолжится в ветке 2.х.</p>
<p>Главной причиной, побудившей меня написать эту заметку, стало включение моего класса для <a href="/develop/zf/mail-send-testing/">тестирования рассылки почты</a> в этот релиз. Хочу выразить огромную благодарность за работу по внедрению этого компонента в ZF <a href="http://lcf.name/">Александру Стешенко</a>.</p>
<p>Ну, и раз начал, кратко опишу что нового появилось в этом релизе:</p>
<ul>
<li>поддержка мобильных устройств с помощью компонента Zend_Http_UserAgent</li>
<li>поддержка SimpleCloud API (класс Zend_Cloud)</li>
<li>Dojo обновлен до версии 1.5.0</li>
<li>поддержка Amazon SimpleDb</li>
<li>поддержка eBay Findings API</li>
<li>Zend_Db совместима с <a href="http://mariadb.org/">MariaDB</a></li>
<li>добавлены два новых формата конфигурационных файлов&nbsp;&mdash; YAML и JSON</li>
<li>появился сервис для сокращения ссылок. В комплекте идут адаптеры для  http://jdem.cz и http://tinyurl.com</li>
<li>добавлены вью-хелперы:
<ul>
<li>Zend_View_Helper_UserAgent (поддержка мобильных устройств)</li>
<li>Zend_View_Helper_TinySrc (сокращение ссылок)</li>
<li>Zend_View_Helper_Gravatar (подгрузка аватарок из Gravatar-а)</li>
</ul>
</li>
<li>а так же множество багфиксов</li>
</ul>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Вышел ZF 1.11 on Лобач.info',url: 'http://lobach.info/develop/zf/%d0%b2%d1%8b%d1%88%d0%b5%d0%bb-zf-1-11/',contentID: 'post-176',suggestTags: '',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>
Этот пост без меток.
	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li>Нет похожих записей</li>
	</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/%d0%b2%d1%8b%d1%88%d0%b5%d0%bb-zf-1-11/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Как протестировать рассылку почты</title>
		<link>http://lobach.info/develop/zf/mail-send-testing/</link>
		<comments>http://lobach.info/develop/zf/mail-send-testing/#comments</comments>
		<pubDate>Mon, 07 Jun 2010 06:00:54 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[mail]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[zend_mail]]></category>
		<category><![CDATA[zend_mail_transport]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=169</guid>
		<description><![CDATA[Практически ни одно веб-приложение не обходится без отправки электронной почты. А это значит, что нужно как-то протестировать данную функцию приложения. В этой заметке я хочу показать как это можно сделать. Upd: этот класс был включен в Zend Framework 1.11.0. Раздел &#8230; <a href="http://lobach.info/develop/zf/mail-send-testing/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://lobach.info/wp-content/uploads/2010/06/mail-send-testing.png" alt="" title="Тестирование рассылки электронной почты" width="257" height="84" class="alignleft size-full wp-image-173" />Практически ни одно веб-приложение не обходится без отправки электронной почты. А это значит, что нужно как-то протестировать данную функцию приложения. В этой заметке я хочу показать как это можно сделать.</p>
<p><span id="more-169"></span></p>
<p><strong>Upd:</strong> этот класс был включен в Zend Framework 1.11.0. Раздел <a href="http://framework.zend.com/manual/en/zend.mail.different-transports.html#zend.mail.file-transport">руководства</a> по использованию компонента.</p>
<p>Некоторое время назад мне потребовалось протестировать генерацию писем нашим приложением. Проведя небольшое исследование, решил что можно пойти двумя путями:</p>
<ol>
<li>установить почтовый прокси и настроить приложение (или php) на отправку почты через него</li>
<li>использовать специальный почтовый транспорт.</li>
</ol>
<p>Фактически, первый вариант может удовлетворить в большинстве случаев. Но чтобы им воспользоваться, нужно вмешиваться в операционную систему&nbsp;&mdash; устанавливать скрипты или приложения, вносить изменения в php.ini. Часто это не представляет проблемы, но не всегда.</p>
<p>Я же решил воспользоваться вторым вариантом, т.к. сделать это оказалось достаточно просто.</p>
<p>В Zend Framework есть специальный компонент, отвечающий за рассылку почты&nbsp;&mdash; <a href="http://framework.zend.com/manual/en/zend.mail.html" title="Документация по Zend_Mail">Zend_Mail</a>. Этот компонент предоставляет единый интерфейс для различных почтовых транспортов (таких как php-функция mail или прямое соединение с smtp-сервером). Написать собственный транспорт не составляет большого труда, что, собственно, я и сделал.</p>
<h2>Пример использования почтового транспорта</h2>
<p>Для того, чтобы проверить содержимое генерируемых нашим приложением писем, я написал небольшой почтовый транспорт. Код транспорта можете посмотреть и скачать с <a href="http://github.com/bladeofsteel/bpLib/blob/master/library/bpLib/Mail/Transport/File.php">github-а</a>, а далее я покажу как им можно воспользоваться. Но перед этим я хочу остановиться на возможностях этого транспорта:</p>
<ul>
<li>работа в двух режимах:
<ul>
<li>имя файла дампа постоянно при отправке нескольких писем</li>
<li>имя файла генерируется для каждого письма индивидуально</li>
</ul>
</li>
<li>возможность сохранения данных как с перезаписью, так и с дописыванием в конец существующего файла</li>
<li>письма сохраняются в файлы формата *.eml, что позволяет посмотреть их в почтовом клиенте</li>
<li>возможность использовать собственную функцию для генерации имени файла письма</li>
</ul>
<p>А теперь вернемся к использованию транспорта.</p>
<p>Чтобы указать Zend_Mail каким образом следует отправлять почту, следует передать экземпляр нужного транспорта в метод отправки почты (<a href="http://framework.zend.com/manual/en/zend.mail.different-transports.html">см. документацию</a>).</p>
<p>Во-первых, указываем автолоадеру пространство имен:</p>
<pre><code class="apache"># application/config/application.in
autoloaderNamespaces[] = "bpLib_"</code></pre>
<p>Во-вторых, перед вызовом метода <strong>send</strong> Zend_Mail-а создадим экземпляр файлового транспорта:</p>
<pre><code>$transport = new bpLib_Mail_Transport_File(
        '/tmp',
        bpLib_Mail_Transport_File::MODE_REGULAR
);</code></pre>
<p>Конструктор файлового транспорта принимает 3 параметра:</p>
<ul>
<li>путь к каталогу, в который будут сохраняться письма</li>
<li>режим работы (имена постоянные/меняющиеся; дозапись/перезапись)</li>
<li>имя callback-функции</li>
</ul>
<p>По первому параметру, я думаю, все ясно, поясню остальные. Режим работы задается маской&nbsp;&mdash; в нулевом бите режим формирования имен файлов, в первом режим записи в файл. Таким образом существует три варианта:</p>
<ul>
<li>bpLib_Mail_Transport_File::MODE_REGULAR&nbsp;&mdash; для постоянного имени файла с перезаписью содержимого файла</li>
<li>bpLib_Mail_Transport_File::MODE_REGULAR | bpLib_Mail_Transport_File::MODE_APPEND&nbsp;&mdash; для постоянного имени файла с дополнением файла</li>
<li>bpLib_Mail_Transport_File::MODE_RANDOM&nbsp;&mdash; для индивидуальных  имен файлов у каждого письма</li>
</ul>
<p>Четвертый вариант (индивидуальные имена с дополнением файла) хоть и возможен, но бессмыслен.</p>
<p>Третий параметр представляет собой название callback-функции, вызываемой для генерации имени файла. Формат параметра аналогичен функции <a href="http://php.net/call_user_func_array">call_user_func_array</a>. Внутрь функции передается экземпляр транспорта. Таким образом, функция имеет доступ ко всем данным письма: заголовки, тело, вложения, что позволяет генерировать имена файлов в зависимости от содержимого письма. В качестве примера приведу метод, используемый по умолчанию:</p>
<pre><code>protected function randomFilename()
{
    return date('Y-m-d-H-i-s').'-'.rand(10000,99999).'.eml';;
}</code></pre>
<p>Ну и наконец передаем созданный нами экземпляр транспорта в метод <strong>send</strong>:</p>
<pre><code>$mail = new Zend_Mail('UTF-8');
$mail-&gt;setSubject("SUBJECT")
    -&gt;addTo('recipient@mail.com')
    -&gt;setFrom('from@mail.com', 'From User')
    -&gt;setBodyText("some text...")
    -&gt;send($transport)
    ;</code></pre>
<p>Собственно это все, что нужно для использования.</p>
<p>К сожалению, нельзя подключить этот транспорт в качестве основного в файле настроек приложения, т.к. ресурс, отвечающий за почтовый компонент, ориентирован исключительно на транспорты Zend Framework-а. Но выход из положения есть! Можно в файле начальной загрузки написать метод, устанавливающий файловый транспорт в качестве транспорта по-умолчанию:</p>
<pre><code>$transport = new bpLib_Mail_Transport_File(
        '/tmp',
        bpLib_Mail_Transport_File::MODE_REGULAR
);
Zend_Mail::setDefaultTransport($transport);</code></pre>
<p>На этом я пожалуй закончу описание транспорта. Возможно в одной из следующих заметок я опишу как можно установить и настроить почтовый прокси.</p>
<p>До новых встреч!</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Как протестировать рассылку почты on Лобач.info',url: 'http://lobach.info/develop/zf/mail-send-testing/',contentID: 'post-169',suggestTags: 'config,debug,mail,php,zend framework,zend_mail,zend_mail_transport',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/config/" title="config" rel="tag">config</a>, <a href="http://lobach.info/tag/debug/" title="debug" rel="tag">debug</a>, <a href="http://lobach.info/tag/mail/" title="mail" rel="tag">mail</a>, <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/zend_mail/" title="zend_mail" rel="tag">zend_mail</a>, <a href="http://lobach.info/tag/zend_mail_transport/" title="zend_mail_transport" rel="tag">zend_mail_transport</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/zend-framework-debug-bar/" title="Zend Framework Debug Bar (30.03.2009)">Zend Framework Debug Bar</a> (3)</li>
	<li><a href="http://lobach.info/develop/zf/zfconf2011-registratio/" title="Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework (05.05.2011)">Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/mail-send-testing/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Комьюнити требуется помощь</title>
		<link>http://lobach.info/develop/zf/community-need-help/</link>
		<comments>http://lobach.info/develop/zf/community-need-help/#comments</comments>
		<pubDate>Sat, 13 Feb 2010 00:48:41 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=171</guid>
		<description><![CDATA[На форуме Русскоязычного Zend Framework сообщества переводят на русский язык сообщения валидаторов. Начиная с версии 1.10 в Zend Framework появился механизм локализованных сообщений валидаторов об ошибках. Лидер команды интернализации Thomas Weidner предложил всем желающим помочь с переводом сообщений на родной &#8230; <a href="http://lobach.info/develop/zf/community-need-help/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>На форуме <a href="http://zendframework.ru/forum/">Русскоязычного Zend Framework сообщества</a> переводят на русский язык сообщения валидаторов. Начиная с версии 1.10 в <a href="http://framework.zend.com">Zend Framework</a> появился механизм локализованных сообщений валидаторов об ошибках. Лидер команды интернализации <a href="http://www.thomasweidner.com/">Thomas Weidner</a> предложил всем желающим помочь с переводом сообщений на родной язык. На это предложение откликнулись члены сообщества и уже проделали большой объем работы по переводу. Томас уже в курсе проделанной сообществом работы по локализации и, возможно, перевод попадет уже в следующий релиз (версии 1.10.2).</p>
<p>Если вы хорошо знаете русский язык и видите грамматические и прочие ошибки в тексте, Ваша помощь нужна сообществу. Это Ваш шанс поучаствовать в развитии фреймворка!</p>
<p>Вот ссылка на обсуждение перевода: <a href="http://zendframework.ru/forum/index.php?topic=2340.0">Переводы на русский сообщений валидаторов</a>. В этом топике есть вся необходимая информация.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Комьюнити требуется помощь on Лобач.info',url: 'http://lobach.info/develop/zf/community-need-help/',contentID: 'post-171',suggestTags: 'news,zend framework',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/news/" title="news" rel="tag">news</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/" title="Открыта регистрация на первую Российскую конференцию посвященную Zend Framework (02.02.2010)">Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/release-zf-1_7_1/" title="Вышел ZendFramework 1.7.1 (03.12.2008)">Вышел ZendFramework 1.7.1</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/zfconf2011-registratio/" title="Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework (05.05.2011)">Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/community-need-help/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Создание повторно используемых плагинов ресурсов Zend_Application</title>
		<link>http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/</link>
		<comments>http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 06:00:57 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[Zend_Application_Resource]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=170</guid>
		<description><![CDATA[Перевод продолжения статьи <a href="http://weierophinney.net/matthew/">Matthew Weier O'Phinney</a> о <code>Zend_Application</code>. В этот раз Мэтью рассказывает о разработке собственных плагинов ресурсов. <a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://weierophinney.net/matthew/archives/231-Creating-Re-Usable-Zend_Application-Resource-Plugins.html">Creating Re-Usable Zend_Application Resource Plugins</a><br />
<strong>Автор:</strong> <a href="http://weierophinney.net/matthew/">Matthew Weier O&#39;Phinney</a><br />
<strong>Перевод:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>В моей <a href="http://weierophinney.net/matthew/archives/230-Quick-Start-to-Zend_Application_Bootstrap.html">последней статье</a> (<a href="/develop/zf/quick-start-to-zend_application_bootstrap/">Быстрый старт с Zend_Application_Bootstrap</a>) я писал о том, как начать работу с <code>Zend_Application</code>, в том числе информацию о том, как писать методы ресурсов, а также список доступных плагинов ресурсов. Что произойдет, когда вам потребуется повторно используемый ресурс, для которого не поставляется готовый плагин? Ответ прост: напишите ваш собственный, конечно!</p>
<p>Все плагины в <code>Zend Framework</code> следуют <a href="http://framework.zend.com/manual/en/learning.plugins.intro.html">общему шаблону</a>. В общем случае, вы группируете плагины в общем каталоге, с общим префиксом класса, а затем уведомляете подключающий класс о их местонахождении.</p>
<p>В этой статье давайте предположим, что вы хотите, чтобы ресурс плагина выполнял следующие действия:</p>
<ul>
<li>Установил DOCTYPE представления (<code>View</code>)</li>
<li>Задал заголовок страницы и разделитель по умолчанию</li>
</ul>
<h3 id="part1">Начало работы</h3>
<p>Прежде всего, давайте определим префикс класса, который мы будем использовать. Если мы будем следовать <a href="http://framework.zend.com/manual/en/coding-standard.overview.html">Стандартам кодирования Zend Framework</a>, мы сможем эффективно использовать автозагрузку, при одновременном обеспечении общего префикса класса для наших ресурсов.</p>
<p>Для целей данного упражнения, мы будем использовать префикс класса <code>Phly_Resource</code>, расположенного в <code>Phly/Resource/</code> нашего <code>include_path</code>.</p>
<p>Назовем наш особый ресурс <code>Layouthelpers</code>, с полным названием класса <code>Phly_Resource_Layouthelpers</code>, и поместим его в <code>Phly/Resource/Layouthelpers.php</code>. Он должен реализовывать <code>Zend_Application_Resource_Resource</code>, но зачастую бывает проще расширить <code>Zend_Application_Resource_ResourceAbstract</code>. В обоих случаях необходимо определить метод <code>init()</code>. Давайте реализуем скелет нашего класса:</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
    }
}</code></pre>
<h3 id="part2">Об отслеживании зависимостей</h3>
<p>В моей предыдущей статье я показал пример отслеживания зависимостей в <code>Zend_Application</code>. Нам необходимо будет этим воспользоваться, так как обе наши задачи взаимодействуют с объектом представления, который мы будем извлекать с помощью ресурса <code>View</code>.</p>
<p>При создании методов ресурсов непосредственно в вашем загрузке, вы можете просто вызвать <code>$this-&gt;getResource($name)</code>. Однако, в классе плагина ресурсов, необходимо сначала получить доступ к самому объекту начальной загрузки&nbsp;&mdash; с помощью метода <code>getBootstrap()</code>.</p>
<p>Давайте убедимся в том, что ресурс представления инициализирован, и извлечем его.</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');
        // ...
    }
}</code></pre>
<h3 id="part3">Настройка ресурса</h3>
<p>Теперь, когда мы получили наш объект представления, мы можем сделать определенную работу. Так как мы хотим, чтобы ресурс можно было повторно использовать, мы должны разрешить некоторые параметры конфигурации. <code>Zend_Application_Resource_ResourceAbstract</code> предоставляет некоторую шаблонную функциональность для этого.</p>
<p>Во-первых, мы предоставим некоторые параметры по умолчанию через свойство <code>$_options</code>.</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    protected $_options = array(
        'doctype'         =&gt; 'XHTML1_STRICT',
        'title'           =&gt; 'Site Title',
        'title_separator' =&gt; ' :: ',
    );

    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');
        // ...
    }
}</code></pre>
<p>Затем мы можем получить параметры воспользовавшись методом <code>getOptions()</code>.</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    protected $_options = array(
        'doctype'         =&gt; 'XHTML1_STRICT',
        'title'           =&gt; 'Site Title',
        'title_separator' =&gt; ' :: ',
    );

    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');
        $options = $this-&gt;getOptions();
        // ...
    }
}</code></pre>
<p>Теперь, в файлах конфигурации разработчики могут изменять стандартные значения:</p>
<pre><code>[production]
; ...
resources.layouthelpers.doctype = "HTML5"
resources.layouthelpers.title = "My Snazzy New Website"
resources.layouthelpers.title_separator = " &amp;emdash; "</code></pre>
<h3 id="part4">Выполняем некоторую работу</h3>
<p>Теперь, когда у нас есть все нужные части, давайте сделаем основную работу:</p>
<pre><code>&lt;?php
// Phly/Resource/Layouthelpers.php
//
class Phly_Resource_Layouthelpers
    extends Zend_Application_Resource_ResourceAbstract
{
    protected $_options = array(
        'doctype'         =&gt; 'XHTML1_STRICT',
        'title'           =&gt; 'Site Title',
        'title_separator' =&gt; ' :: ',
    );

    public function init()
    {
        $bootstrap = $this-&gt;getBootstrap();
        $bootstrap-&gt;bootstrap('View');
        $view = $bootstrap-&gt;getResource('View');

        $options = $this-&gt;getOptions();
        $view-&gt;doctype($options['doctype']);
        $view-&gt;headTitle()-&gt;setSeparator($options['title_separator'])
                          -&gt;append($options['title']);
    }
}</code></pre>
<p>Это все!</p>
<h3 id="part5">Расскажем загрузчику о нас</h3>
<p>Ну, это все что нужно сделать для реализации плагина ресурса. Но как мы расскажем нашему классу загрузчика о нем? Через наш конфигурационный файл, используя ключ <code>pluginPaths</code>. Это массив, ключами которого являются префиксы классов плагинов, а значениями&nbsp;&mdash; путь, соответствующий префиксу.</p>
<pre><code>[production]
; ...
pluginPaths.Phly_Resource = "Phly/Resource"
resources.layouthelpers.doctype = "HTML5"
resources.layouthelpers.title = "My Snazzy New Website"
resources.layouthelpers.title_separator = " &amp;emdash; "</code></pre>
<p>Вы можете зарегистрироваться так много путей к плагинам, сколько захотите. Так как этот ключ обрабатывается до исполнения любого из ресурсов, он может быть определен в любом месте вашего конфигурационного файла.</p>
<h3 id="part6">Дальнейшие соображения</h3>
<p>Пример из этого поста тривиален. Но один аспект не был обсужден&nbsp;&mdash; создание ресурса, который будет использоваться повсюду в вашем приложении. Например, вы можете захотеть создать ресурс, который вы будете использовать в разное время в вашем приложении. Если вы возвращаете значение из вашего метода <code>init()</code>, объект начальной загрузки сохранит его для последующего извлечения. Хороший пример этого мы видели раньше: ресурс <code>View</code> зарегистрировал объект <code>Zend_View</code> в классе начальной загрузки просто возвратив экземпляр из плагина ресурса.</p>
<h3 id="part7">Выводы</h3>
<p>Надеюсь, эта и предыдущая статьи помогли пролить некоторый свет на <code>Zend_Application</code> и, в частности, как писать и загружать ресурсы.</p>
<p>Если у Вас есть дополнительные вопросы, вы можете найти меня в <a href="http://framework.zend.com/archives">списке рассылки ZF</a>, на IRC через серверы Freenode, или в <a href="http://twitter.com/weierophinney">Twitter</a>. Удачи!</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Создание повторно используемых плагинов ресурсов Zend_Application on Лобач.info',url: 'http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/',contentID: 'post-170',suggestTags: 'bootstrap,php,plugins,zend framework,Zend_Application,Zend_Application_Resource,ZF1.8,перевод',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/bootstrap/" title="bootstrap" rel="tag">bootstrap</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_application/" title="Zend_Application" rel="tag">Zend_Application</a>, <a href="http://lobach.info/tag/zend_application_resource/" title="Zend_Application_Resource" rel="tag">Zend_Application_Resource</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (7)</li>
	<li><a href="http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/" title="Включение условных запросов в приложениях на Zend Framework (07.04.2009)">Включение условных запросов в приложениях на Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/zend-tool-and-zf-18/" title="Zend_Tool и ZF 1.8 (12.05.2009)">Zend_Tool и ZF 1.8</a> (4)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Открыта регистрация на первую Российскую конференцию посвященную Zend Framework</title>
		<link>http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/</link>
		<comments>http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/#comments</comments>
		<pubDate>Tue, 02 Feb 2010 06:30:47 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[конференция]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=167</guid>
		<description><![CDATA[Анонс первой в России конференции по Zend Framework. Заявлены очень интересные докладчики, в том числе один из разработчиков ядра фреймворка. <a href="http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>В конце марта 2010 г. в Санкт-Петербурге пройдет первая в России конференция по Zend Framework. Сам я к сожалению поехать не смогу, но по просьбе организаторов конференции публикую анонс предстоящей конференции.</p>
<hr />
<p><a href="http://www.zfconf.ru/" target="_blank"><img src="http://lh5.ggpht.com/_LTrMB58vSzk/S2XRVWUWqMI/AAAAAAAAABw/ItmlHrVIMVs/s800/205x175.png" width="205" height="175" align="left"></a>На днях закончился прием тезисов по планируемым докладам. Примечательно, что в состав докладчиков вошли ведущие участники русскоязычного сообщества ZF, опытнейшие специалисты и лично один из создателей фрэймворка!</p>
<p>Участие в конференции планируется сделать бесплатным или за небольшую стоимость. На данный момент уже открыта <a href="http://www.zfconf.ru/pre-registration.php">предварительная регистрация</a> на конференцию! Для решения ряда вопросов организаторам <strong>очень важно</strong> сейчас понять приблизительное количество человек, которые смогут посетить конференцию или каким-то иным образом принять участие в ней.</p>
<p>Каждый предстоящий доклад возможно обсудить на форуме ZF-сообщества. Ваше мнение очень важно для авторов!</p>
<h4>Планируемые доклады:</h4>
<p><a href="http://zendframework.ru/forum/index.php?topic=2269.0">Жизненный цикл предложений (proposals) в проекте Zend Framework</a>&nbsp;&mdash; <em>Александр Веремьев (<a href="http://www.zend.com">Zend Technologies</a>, Zend Framework Core команда)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2270.0" target="_blank">Zend_Search_Lucene в деталях</a>&nbsp;&mdash; <em>Александр Веремьев (<a target="_blank" href="http://www.zend.com">Zend Technologies</a>, Zend Framework Core команда)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2271.0" target="_blank">Zend Framework и производительность</a>&nbsp;&mdash; <em>Александр Махомет (создатель сообщества <a target="_blank" href="http://zendframework.ru">ZendFramework.ru</a>)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2272.0" target="_blank">Zend Framework и MVC, &laquo;толстая&raquo; модель</a>&nbsp;&mdash; <em>Александр Стешенко (<a target="_blank" href="http://norada.com">Norada Corporation</a>, PHP-разработчик)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2273.0" target="_blank">ФотоСтрана.ru: Прототипирование с использованием ZF (история боевого применения Zend Framework в highload-проекте)</a>&nbsp;&mdash; <em>Леонид Жаворонков (<a target="_blank" href="http://fotostrana.ru">ФотоСтрана.ru</a>, тимлид)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2274.0" target="_blank">Использование очередей сообщений в повседневных проектах</a>&nbsp;&mdash; <em>Денис Баклыков (<a href="http://obnovlenie.ru" target="_blank">Обновление</a>, веб-разработчик)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2275.0" target="_blank">Zend Framework и Doctrine</a>&nbsp;&mdash; <em>Степан Танасийчук (руководитель веб-студии <a target="_blank" href="http://stfalcon.com">stfalcon.com</a>)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2276.0" target="_blank">Zend Framework и мультиязычность</a>&nbsp;&mdash; <em>Степан Танасийчук (руководитель веб-студии <a target="_blank" href="http://stfalcon.com">stfalcon.com</a>)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2277.0" target="_blank">История проекта e-Штаб</a>&nbsp;&mdash; <em>Анатолий Ларин (<a target="_blank" href="http://www.e-legion.com">e-Легион</a>, веб-программист)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2278.0" target="_blank">Что нового несет нам Zend Framework 2.0?</a>&nbsp;&mdash; <em>Надежда Блинова (<a target="_blank" href="http://www.wizartech.ru">Wizartech</a>, веб-программист), Георгий Туревич (<a href="http://www.wizartech.ru" target="_blank">Wizartech</a>, ведущий веб-программист)</em></p>
<p><a href="http://zendframework.ru/forum/index.php?topic=2279.0" target="_blank">Интеграция Zend Framework c Javascript-фрэймворками jQuery и Dojo Toolkit</a>&nbsp;&mdash; <em>Георгий Туревич (<a href="http://www.wizartech.ru" target="_blank">Wizartech</a>, ведущий веб-программист)</em></p>
<p>Смело обсуждайте доклады и <strong>регистрируйтесь</strong>!</p>
<p>За последними новостями можно следить здесь:</p>
<ul>
<li><strong>RSS-канал:</strong> <a href="http://feeds.feedburner.com/zfconf" target="_blank">feeds.feedburner.com/zfconf</a></li>
<li><strong>Twitter:</strong> <a href="http://twitter.com/zfconf" target="_blank">@zfconf</a></li>
<li><strong>Группа Вконтакте:</strong> vkontakte.ru/club14951507</li>
</ul>
<p><strong>К участию также приглашаются информационные и финансовые спонсоры.</strong></p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Открыта регистрация на первую Российскую конференцию посвященную Zend Framework on Лобач.info',url: 'http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/',contentID: 'post-167',suggestTags: 'news,php,zend framework,конференция',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/news/" title="news" rel="tag">news</a>, <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/konferenciya/" title="конференция" rel="tag">конференция</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/zfconf2011-registratio/" title="Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework (05.05.2011)">Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/registration-to-first-zend-framework-conference-open/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Быстрый старт с Zend_Application_Bootstrap</title>
		<link>http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/</link>
		<comments>http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 12:30:47 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[bootstrap]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=161</guid>
		<description><![CDATA[<a href="http://weierophinney.net/matthew/">Matthew Weier O'Phinney</a> в своем блоге опубликовал статью из которой можно почерпнуть начальные сведения об использовании такого гибкого и функционального инструмента как Zend_Application. Этот компонент обеспечивает унифицированный и гибко конфигурируемый процесс начальной загрузки вашего приложения. Далее - мой перевод данной статьи. <a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://weierophinney.net/matthew/archives/230-Quick-Start-to-Zend_Application_Bootstrap.html">Quick Start to Zend_Application_Bootstrap</a><br />
<strong>Автор:</strong> <a href="http://weierophinney.net/matthew/">Matthew Weier O&#39;Phinney</a><br />
<strong>Перевод:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>Мы добавили <a href="http://framework.zend.com/manual/en/zend.application.html">Zend_Application</a> в <em>Zend Framework</em> начиная с версии 1.8.0. Намерением, лежащим в основе компонента, была формализация процесса загрузки приложений, а также обеспечение упрощенного, основанного на файле конфигураций, механизма для него.</p>
<p><em>Zend_Application</em> работает в связке с <em>Zend_Application_Bootstrap</em>, который, как можно догадаться из названия, является тем, что на самом деле выполняет большую часть работы по загрузке вашего приложения. Это позволяет вам использовать подключаемые ресурсы загрузчика, либо определить локальные ресурсы загрузчика как методы класса. Разработчик получает возможность повторного использования, а в последующем специфическую для приложения инициализацию и конфигурацию.</p>
<p>Кроме того, <em>Zend_Application_Bootstrap</em> обеспечивает отслеживание зависимостей (например, если один из ресурсов зависит от другого, вы можете гарантировать выполнение другого ресурса первым), а также выступает в качестве хранилища для инициализированных ресурсов. Это означает, что если ресурс прошел начальную загрузку, вы можете извлечь его позднее из самого загрузчика.</p>
<h3 id="part1">Как это работает</h3>
<p>Теперь, когда вы знаете, что он делает, давайте окунемся в основы.</p>
<p>Если вы используете утилиту командной строки <em>zf</em>, предоставляемую <em>Zend Framework</em> для создания своих проектов (<code>"zf create project"</code>), вы получите загрузчик и настройки по умолчанию прямо &laquo;из коробки&raquo;. Это включает в себя следующие файлы в файловой структуре:</p>
<p><img src="http://lobach.info/wp-content/uploads/2010/01/screenshot_001.png" alt="" title="Файловая структура приложения по-умолчанию" width="179" height="179" class="aligncenter size-full wp-image-165" /></p>
<p>Файл <em>Bootstrap.php</em> будет содержать класс <em>Bootstrap</em>, который расширяет <em>Zend_Application_Bootstrap_Bootstrap</em>; этот класс изначально будет пустой. Файл <em>application.ini</em> будет содержать следующее:</p>
<pre><code class="ini">[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1</code></pre>
<p><em>Zend_Application</em> проходит в три этапа. Во-первых, оно инициализирует среду PHP, используя INI параметры вашей конфигурации, если они заданы, а также настройку <em>include_path</em> и автозагрузку. Во-вторых, оно инициализирует и выполняет класс начальной загрузки. Наконец, &laquo;выполняется&raquo; приложение (вызовом метода <em>run ()</em> загрузчика).</p>
<h3 id="part2">Параметры конфигурации</h3>
<p>Мы видим, что приведенный выше листинг представляет собой набор:</p>
<ul>
<li>Параметры инициализации PHP (в данном случае они свидетельствуют о том, следует ли отображать ошибки)</li>
<li>Настройки <em>include_path</em></li>
<li>Настройки, которые указывают название и место нахождения класса начальной загрузки</li>
<li>Настройки ресурсов приложения</li>
</ul>
<p>Ключ <em>phpSettings</em> принимает любые ключи из <em>php.ini</em> как подразделы, и эти пары ключ/значение будут переданы <em>ini_set</em>. Это может быть полезно, когда вам нужно быть уверенным в том, что установлены особые INI параметры, особенно если вы хотите, чтобы они зависели от окружения. (В приведенном выше примере, <em>display_errors</em> включен в тестовом окружении и в окружении для разработки, но отключен в остальных)</p>
<p>Когда дело доходит до <em>include_path</em> и автозагрузки, вероятно, наиболее часто задаваемый вопрос: &laquo;Как я могу добавить в автозагрузчик префиксы пространств имен для кода, отличного от ZF?&raquo;. Это можно легко сделать в конфигурационном файле, воспользовавшись ключом <em>autoloaderNamespaces</em> и префиксом пространства имен в качестве его значения:</p>
<pre><code class="ini">autoloaderNamespaces[] = "Phly_"</code></pre>
<p>Что касается класса загрузчика и местоположения файла, как правило, вариант по умолчанию будет наилучшим. Однако, если вы хотите задать пользовательское наименование&nbsp;&mdash; например, чтобы указать префикс класса&nbsp;&mdash; или, возможно, если ваш модуль по умолчанию находится в подкаталоге, вы можете уведомить <em>Zend_Application</em> об этом через настройки <em>bootstrap.class</em> и <em>boostrap.path</em>:</p>
<pre><code class="ini">bootstrap.class = "Application_Bootstrap"
bootstrap.path = APPLICATION_PATH "/modules/application/Bootstrap.php"</code></pre>
<h3 id="part3">Начало работы с ресурсами загрузчика</h3>
<p>Теперь мы, наконец, займемся самым интересным: непосредственно ресурсами загрузчика.</p>
<p><em>Да, я знаю, что я умалчиваю о ключе &laquo;appnamespace&raquo;; я расскажу об этом в другое время.</em></p>
<p>Ресурсы загрузчика могут быть одной из двух вещей:</p>
<ul>
<li>Защищенный метод в классе начальной загрузки с префиксом <em>&laquo;_init&raquo;</em> (например, <code>protected function _initFoo()</code>)</li>
<li>Класс, реализующий <em>Zend_Application_Resource_Resource_Resource</em></li>
</ul>
<p>В первом случае, <code>_init*()</code> методы, каждый из них будет выполняться в каждом запросе. В последнем, будут выполнены только те, которые вы укажете в вашем конфигурационном файле, что позволяет вам выбирать, какие из различных поставляемых плагинов ресурсов (или написанных вами самим!) будут использованы.</p>
<p>В случае с конфигурацией по умолчанию, только плагин ресурса <em>&laquo;frontController&raquo;</em> будет использоваться, соответствуя <em>Zend_Application_Resource_Frontcontroller</em>. По состоянию на предстоящий релиз 1.10, вы можете выбрать один из следующих дополнительных плагинов ресурсов, таких как:</p>
<ul>
<li>Cachemanager</li>
<li>Db</li>
<li>Dojo</li>
<li>Layout</li>
<li>Locale</li>
<li>Log</li>
<li>Mail</li>
<li>Modules</li>
<li>Multidb</li>
<li>Navigation</li>
<li>Router</li>
<li>Session</li>
<li>Translate</li>
<li>View</li>
</ul>
<p>Каждый из них имеет собственные параметры конфигурации, <a href="http://framework.zend.com/manual/en/zend.application.available-resources.html">описанные в руководстве</a>.</p>
<h3 id="part4">Написание методов ресурсов</h3>
<p>Написание ваших собственных методов ресурсов тривиально: вы просто создаете метод, и выполняете какую-то работу. Затем вы имеете возможность вернуть значение. Если вы это сделаете, оно будет храниться в загрузчике и вы сможете получить его позже. К примеру:</p>
<pre><code>class Bootstrap
          extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initRegistry()
    {
        $registry = new Zend_Registry();
        return $registry;
    }
}</code></pre>
<p>Если бы мы хотели получить реестр позже, мы могли бы сделать это, используя метод загрузчика <em>getResource ()</em>:</p>
<pre><code class="php">$registry = $bootstrap-&gt;getResource('Registry');</code></pre>
<p>Обратите внимание, что мы передаем имя метода без префикса <em>&laquo;_init&raquo;</em>, это &laquo;краткое имя&raquo; показывает как ресурс упоминается в загрузчике, и как вы будете ссылаться на него позже.</p>
<p>Теперь, допустим, у вас есть ресурс, который зависит от вашего ресурса &laquo;Реестр&raquo;. Например, вы хотите создать объект <em>Zend_Currency</em> и передать его в реестр. <em>Zend_Application_Bootstrap</em> был спроектирован для обработки этой ситуации, и включает в себя отслеживание зависимостей (это, на самом деле, истинная причина создания методов инициализации защищенными, что предотвращает их прямой вызов). Просто вызовите метод <code>bootstrap()</code> с названием ресурса для его инициализации. Кроме того, метод <em>getResource ()</em> может быть использован для получения значений, зарегистрированных этим ресурсом. К примеру:</p>
<pre><code>class Bootstrap
          extends Zend_Application_Bootstrap_Bootstrap
{
    protected function _initCurrency()
    {
        $this-&gt;bootstrap('Registry');
        $registry = $this-&gt;getResource('Registry');

        $currency = new Zend_Currency('$');
        $registry['Zend_Currency'] = $currency;
        return $currency;
    }
    protected function _initRegistry()
    {
        $registry = new Zend_Registry();
        return $registry;
    }
}</code></pre>
<p>Вот что произойдет:</p>
<ul>
<li><em>Zend_Application</em> вызовет <code>bootstrap()</code> без аргументов, который сначала перебирает внутренние методы ресурсов, а затем любые настраиваемые плагины ресурсов.</li>
<li>этот загрузчик выполнит метод <em>_initCurrency ()</em></li>
<li>он встречает метод <code>bootstrap()</code> и выполняет его</li>
<li>вызов <code>bootstrap()</code> выполняет метод <em>_initRegistry ()</em>, сохраняя по завершению экземпляр <em>Zend_Registry</em> (который был возвращен из метода)</li>
<li>выполнение <em>_initCurrency ()</em> продолжается вызовом <em>getResource ()</em>; он возвращает экземпляр <em>Zend_Registry</em>, хранящемуся в загрузчике по этому ключу.</li>
<li>выполнение <em>_initCurrency ()</em> завершается, и загрузчик сохраняет возвращенный экземпляр <em>Zend_Currency</em>.</li>
<li>метод <code>bootstrap()</code> затем пытается вызвать метод <em>_initRegistry ()</em>, но при этом отмечает, что он уже был выполнен, и поэтому переходит к выполнению плагинов ресурсов.</li>
</ul>
<p>Как вы можете теперь видеть, загрузчик функционально достаточно гибкий и мощный, и предоставляет целый ряд преимуществ сразу &laquo;из коробки&raquo;.</p>
<h3 id="part5">До следующей встречи ...</h3>
<p>На данный момент, вы должны знать достаточно для того, чтобы начать писать собственные инициализационные ресурсы начальной загрузки. В ближайшие недели я собираюсь написать о том, как написать повторно используемые плагины ресурсов, а также обсудить, каким образом процесс начальной загрузки вписывается в модульные приложения.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Быстрый старт с Zend_Application_Bootstrap on Лобач.info',url: 'http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/',contentID: 'post-161',suggestTags: 'bootstrap,php,zend framework,Zend_Application,ZF1.8,перевод',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/bootstrap/" title="bootstrap" rel="tag">bootstrap</a>, <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/zend_application/" title="Zend_Application" rel="tag">Zend_Application</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/zend-tool-and-zf-18/" title="Zend_Tool и ZF 1.8 (12.05.2009)">Zend_Tool и ZF 1.8</a> (4)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Пользовательские ресурсы для Zend_Application</title>
		<link>http://lobach.info/develop/zf/custom-zend_application-resources/</link>
		<comments>http://lobach.info/develop/zf/custom-zend_application-resources/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 09:51:56 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Rob Allen]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Application]]></category>
		<category><![CDATA[Zend_Application_Resource]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[разработка]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=163</guid>
		<description><![CDATA[Перевод небольшой заметки Роба Алена о создании собственных плагинов ресурсов для Zend_Application <a href="http://lobach.info/develop/zf/custom-zend_application-resources/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://akrabat.com/zend-framework/custom-zend_application-resources/">Custom Zend_Application Resources</a><br />
<strong>Автор:</strong> <a href="http://akrabat.com/">Rob Allen</a><br />
<strong>Переводчик:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>Рано или поздно, вы захотите использовать Zend_Application эффективней при помощи создания собственных плагинов ресурсов. Это значительно упрощает и ускоряет начальную стадию разработки нового приложения за счет повторного использования однажды уже проделанной работы по инициализации окружения. К тому же это сделает ваш Boostrap-класс очень компактным!</p>
<p>В моем случае, я хотел создать ресурс для <a href="http://couchdb.apache.org/">CouchDb</a>, который проверял бы что база данных была создана, в противном случае создавал бы её.</p>
<p>Создание собственных плагинов достаточно просто. Очевидным местом для размещения будет <em>library/App/Application/Resource</em> и типичный ресурс будет выглядеть следующим образом:</p>
<pre><code>class App_Application_Resource_Couchdb
            extends Zend_Application_Resource_ResourceAbstract
{
    /**
     * Defined by Zend_Application_Resource_Resource
     *
     * @return Phly_Couch|null
     */
    public function init()
    {
         // тут выполняются действия для инициализации CouchDb
        $options = $this-&gt;getOptions();
        // в $options находится все содержимое 'resources.couchdb' из application.ini
    }
}</code></pre>
<p>Вы должны уведомить Zend_Application о ваших новых плагинах. Это делается посредством одной строчки в application.ini:</p>
<pre><code>pluginPaths.App_Application_Resource_ = "App/Application/Resource"</code></pre>
<p>Теперь вы можете иметь столько плагинов ресурсов, сколько вам захочется, располагая их в пространстве App_Application_Resource_.</p>
<p>Кроме того, Matthew Weier O&#39;Phinney написал статью о <a href="http://www.weierophinney.net/matthew/archives/230-Quick-Start-to-Zend_Application_Bootstrap.html">Zend_Application</a>, которую вам обязательно стоит прочесть.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Пользовательские ресурсы для Zend_Application on Лобач.info',url: 'http://lobach.info/develop/zf/custom-zend_application-resources/',contentID: 'post-163',suggestTags: 'php,Rob Allen,zend framework,Zend_Application,Zend_Application_Resource,ZF1.8,перевод,разработка,советы',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/rob-allen/" title="Rob Allen" rel="tag">Rob Allen</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_application/" title="Zend_Application" rel="tag">Zend_Application</a>, <a href="http://lobach.info/tag/zend_application_resource/" title="Zend_Application_Resource" rel="tag">Zend_Application_Resource</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a>, <a href="http://lobach.info/tag/%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0/" title="разработка" rel="tag">разработка</a>, <a href="http://lobach.info/tag/%d1%81%d0%be%d0%b2%d0%b5%d1%82%d1%8b/" title="советы" rel="tag">советы</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (7)</li>
	<li><a href="http://lobach.info/develop/zf/zend-tool-and-zf-18/" title="Zend_Tool и ZF 1.8 (12.05.2009)">Zend_Tool и ZF 1.8</a> (4)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/custom-zend_application-resources/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Виновник &#171;падения&#187; веб-сервера найден</title>
		<link>http://lobach.info/develop/zf/find-culprit-down-web-server/</link>
		<comments>http://lobach.info/develop/zf/find-culprit-down-web-server/#comments</comments>
		<pubDate>Tue, 30 Jun 2009 20:28:22 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=157</guid>
		<description><![CDATA[Этот пост я хочу посвятить решению одной проблемы, которая доставила мне массу проблем. Хотя, если говорить о неприятностях, то они скорее были не у меня, а у пользователей проекта, в котором я участвую <a href="http://lobach.info/develop/zf/find-culprit-down-web-server/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Этот пост я хочу посвятить решению одной проблемы, которая доставила мне массу проблем. Хотя, если говорить о неприятностях, то они скорее были не у меня, а у пользователей проекта, в котором я участвую<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>.</p>
<p>Проблема заключалась в том, что пользователи не могли сохранить на сервере данные, если они превышали определённый объём. При чем, не могли сохранить на столько, что отправляли апач в &laquo;кору&raquo;. Честно говоря, это сильно раздражало, потому что происходило буквально на ровном месте.</p>
<p>В конце концов такая ситуация надоела и я по локоть залез своими шаловливыми ручонками вглубь Zend_Db. Предположения о вероятной причине у нас были и это несколько облегчило задачу. Падения могли происходить из-за того, что регулярка уходила в глубокую рекурсию и там умирала. Эту гипотезу я и стал проверять. Почему я полез именно в Zend_Db? Очень просто&nbsp;&mdash; поиск причины показал, что скрипт умирает именно там.</p>
<p>И оказалось таки да&nbsp;&mdash; Zend_Db при создании экземпляра стэйтмента регуляркой вырезал все экранирующие символы. Если при этом тест запроса был достаточно объемным, то весь процесс завершался падением.</p>
<p>Вот так наш код выглядел ранее (естественно, код крайне упрощен):</p>
<pre><code>$sql = "INSERT INTO tab (id,name)
             VALUES (null,'очень ... длинный ... текст')";
$db-&gt;query($sql); // $db - экземпляр Zend_Db_Adapter_Mysqli</code></pre>
<p>Пытливый ум некоторый читателей моего блога может зародить разумную мысль: &laquo;А зачем, собственно, писать текст запроса целиком, если есть методы и для вставки, и для выборки?&raquo;. И, таки да, будет в чем-то прав. Но! К сожалению, Zend_Db реализует не все возможности SQL и иногда приходится идти на крайние меры и писать запросы явно.</p>
<p>Вернемся к проблеме. Покрутив и так, и эдак, я решил пойти по пути наименьшего сопротивления. А именно, воспользоваться плейсхолдерами. Теперь код стал выглядеть так:</p>
<pre><code>$sql = "INSERT INTO tab (id,name)
             VALUES (null, ?)";
$name = 'очень ... длинный ... текст'; // значение поступает от пользователя
$db-&gt;query($sql, array($name)); // $db - экземпляр Zend_Db_Adapter_Mysqli</code></pre>
<p>Это изменение полностью решило данную проблему. Ура!</p>
<p>Пытливый читатель может опять спросить: &laquo;А чего же не вы не воспользовались плейсхолдерами сразу?!&raquo;. И будет снова прав! Надо было поступать именно так. Но богомерзкое желание сохранить пару тактов процессора сделало свое грязное дело и мы нашли <del datetime="2009-06-30T19:11:12+00:00">приключения на свой зад</del> проблемы на свою голову.</p>
<p>Мораль сей басни такова: пользуйтесь плейсхолдерами и ваши волосы будут мягкими и шелковистыми!</p>
<p>P.S.: Я надеюсь, что после прочтения этого поста у вас не сложилось впечатление, что мы запросы к базе пишем исключительно текстом. Спешу развеять это впечатление: поиск по нашему (очень не маленькому) проекту выявил всего 4 или 5 таких мест. Код исправлен, виновные понесли заслуженное поощрение.</p>
<hr />
<p><strong>Постовой:</strong></p>
<p>Если Вам нужен эвакуатор, то заказать его можете тут: <a href="http://www.evakuator-gruzovik.ru" title="эвакуатор в Москве">эвакуатор в Москве</a>. А если хочется экзотики, то можете съездить на <a href="http://modern-japan.ru">отдых в Японии</a></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p><em>Для справки: проект представляет из себя некий веб-сервис развлекательного характера.</em>&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Виновник &amp;laquo;падения&amp;raquo; веб-сервера найден on Лобач.info',url: 'http://lobach.info/develop/zf/find-culprit-down-web-server/',contentID: 'post-157',suggestTags: 'database,php,zend framework',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/database/" title="database" rel="tag">database</a>, <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><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/zfconf2011-registratio/" title="Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework (05.05.2011)">Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/find-culprit-down-web-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend_Tool и ZF 1.8</title>
		<link>http://lobach.info/develop/zf/zend-tool-and-zf-18/</link>
		<comments>http://lobach.info/develop/zf/zend-tool-and-zf-18/#comments</comments>
		<pubDate>Tue, 12 May 2009 07:25:48 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Tool]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[перевод]]></category>
		<category><![CDATA[разработка]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=150</guid>
		<description><![CDATA[Перевод статьи о новом для ZF инструменте, появившемся в последнем релизе, - Zend_Tool. В статье рассмотрены предпосылки создания, архитектурные решения, возможности расширения и примеры использования. <a href="http://lobach.info/develop/zf/zend-tool-and-zf-18/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><strong>Источник:</strong> <a href="http://devzone.zend.com/article/4559-Zend_Tool-and-ZF-1.8">Zend_Tool and ZF 1.8</a><br />
<strong>Автор:</strong> Ralph Schindler<br />
<strong>Переводчик:</strong> <a href="http://lobach.info/">Лобач Олег</a></p>
<p>Вы уже наверняка слышали новость о выпуске Zend Framework 1.8. Вместе с ZF 1.8 в наше распоряжение поступило несколько новых инструментов, таких как Zend_Tool (это мой любимчик), Zend_Application, Zend_Navigation и Zend_Tag_Cloud. Zend_Tool не является компонентом в обычном понимании. Большинство компонентов имеют класс на верхнем уровне пространства имен, а Zend_Tool нет. Большинство компонентов обычно используется внутри кода вашего приложения для упрощения выполнения задач, а Zend_Tool нет. Zend_Tool более близок к фреймворку, нежели к компоненту&nbsp;&mdash; этакий фреймворк в фреймворке.</p>
<h2 id="section1">Так что же такое Zend_Tool?</h2>
<p>Первый шаг&nbsp;&mdash; приступить к изучению того, что нужно предпринять для разработки следующего поколения фреймворка для RAD<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>. RAD, как вы можете себе представить, это термин, имеющий довольно широкое определение. В общем смысле, этот термин обозначает скорость, с которой вы можете создать ресурсы, требуемые вашему приложению. В идеальной ситуации, начальная разработка (или подготовительная фаза проекта<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>) должна быть сведена к минимуму с тем, чтобы разработчики могли приступить к более интересной разработке. В конце концов, &laquo;интересная разработка&raquo; является наиболее вероятной причиной рождения приложения.</p>
<p>Итак, если есть &laquo;интересная разработка&raquo;, что же такое &laquo;неинтересная разработка&raquo;? Для Zend Framework (и большинства MVC-фреймворков, если уж на то пошло) это процесс создания начальных ресурсов проекта, общих для всех проектов: первичная структура проекта, первичные файлы конфигурации, первичный загрузочный код и код автозагрузки, и т.п. Это так же включает задачи обработки ошибок, создания контроллеров и представлений и многое другое. Для кого-то, кто только начинает увлекаться ZF, некоторые из этих задач потребуют часы чтения учебников, руководств и материалов типа &laquo;быстрый старт&raquo;. Не слишком &laquo;быстро&raquo;, не так ли?</p>
<h2 id="section2">Zend_Tool как фреймворк</h2>
<p>Вместо тесного связывания системы, которая была бы специально нацелена на создание ZF-приложений непосредственно из командной строки, и точной генерации кода, без модификации существующего кода, мы заложили в архитектуру системы расширяемость в местах, которые должны касаться разработчика. Zend_Tool был разработан для облегчения абстракции во всех необходимых местах, которые мы посчитали удобными разработчикам для расширения системы. Например, у нас пока основной клиент&nbsp;&mdash; CLI<sup id="fnref:3"><a href="#fn:3" rel="footnote">3</a></sup>, но фреймворк разработан как универсальная RPC-система, с тем, чтобы разрабатывать другие, не-CLI, клиенты. Хотя у нас уже есть запас провайдеров (базовые возможности системы), интерфейсы для построения провайдеров в будущем остается простым и удобным для расширения и понимания.</p>
<h2 id="section3">Zend_CodeGenerator и Zend_Reflection</h2>
<p>В ходе разработки, мы обнаружили несколько проблемных областей, которые не имели единодушного решения. Генерация кода&nbsp;&mdash; одна из таких областей. Вообще говоря, когда Вы говорите о генерации кода, это обычно подход, основанный на шаблонах&nbsp;&mdash; генерируемый код поступает из файлов шаблонов, которые обычно написаны без учета правильно ли они сформированы<sup id="fnref:4"><a href="#fn:4" rel="footnote">4</a></sup> (в соответствии со стандартами языка). Имея подход, основанный на шаблонах, включает риск того, что разработчики выйдут за рамки стандартов кодирования и будут генерировать вообще плохой код (плохой код в этом смысле&nbsp;&mdash; это и неработающий код, и плохо сформированный код). Итак, мы сразу поняли, что существует возможность создать компонент, который будет обеспечивать объектно-ориентированный интерфейс, аналогичный <a href="http://ru.php.net/manual/ru/language.oop5.reflection.php">Reflection API</a> в PHP, с единственной целью&nbsp;&mdash; создание хорошо сформированного и хорошо отформатированного объектно-ориентированного кода. Следует отметить, что компонент Zend_CodeGenerator может быть использован без остальной части Zend_Tool. Это означает, что если вы когда-нибудь окажетесь в положении, когда нужно постоянно генерировать код, в первую очередь вы должны посмотреть в сторону Zend_CodeGenerator.</p>
<p>Zend_CodeGenerator не просто пишет код с нуля; у него есть возможность чтения существующего кода, изменения его, и создания нового кода. Это главным образом связано с другим компонентом&nbsp;&mdash; Zend_Reflection, рожденным вне Zend_Tool. Zend_Reflection&nbsp;&mdash; это не, и я это особо подчеркну, переизобретение колеса. Фактически, он расширяет Reflection API, добавляя поддержку пользовательских расширений, отражений Dockbloc (и в том числе тэгов dockbloc), и основанных на файлах отражений. Семантика компонента такая же, как у прародителя, и он может использоваться в качестве замены базовых классов в случае необходимости в дополнительных возможностях.</p>
<p>Zend_CodeGenerator и Zend_Reflection имеют схожие API: Zend_Reflection нацелен на чтение структур кода, а Zend_CodeGenerator нацелен на написание структур кода. Вместе эти два компонента облегчают исследование и написание кода во время процесса развития приложения.</p>
<h2 id="section4">Клиент командной строки Zend_Tool</h2>
<p>Само собой разумеется, что RAD, основанный на интерфейсе командной строки, очень востребован у ZF-разработчиков. Как упомянуто ранее, задача настраивания начальных ресурсов проекта может быть утомительной. Многие разработчики предпочитают взаимодействовать со средой разработки через терминал, или командную строку, так что, естественно, мы решили, что наиболее целесообразно встроить клиента в Zend_Tool. Это не означает, что может быть только один клиент&nbsp;&mdash; как упомянуто ранее, клиентские функциональные возможности Zend_Tool были абстрагированы таким образом, что дополнительные клиенты могут быть построены так, чтобы взаимодействовать с Zend_Tool. У интегрированных сред разработки и редакторов текста есть возможность встроиться в клиентский фреймворк и подавать команды посредством их родного интерфейса. Два вероятных расширения включают два моих любимых инструмента: Zend Studio и Textmate&nbsp;&mdash; но возможности почти безграничны. Любой клиент, который способен выполнять PHP-код, может эффективно надстроиться  поверх Zend_Tool для нужд инструментов.</p>
<h2 id="section5">Zend_Tool_Project</h2>
<p>В связи с тем, что разработка проекта это итерационный процесс, со стороны инструментария так же необходимо отслеживать историю, если можно так выразиться. То, что мы подразумеваем под историей, отслеживает действия, которые вы выполнили: что вы создали, где это расположено в структуре проекта, и каков контекст этого в проекте? Например, после создания проекта, вы можете захотеть создать контроллер. Для всех намерений и целей, контроллер это просто файл, с одним классом в нем, как может инструментальная среда узнать разницу между обычным файлом и файлом контроллера?</p>
<p>Zend_Tool_Project намеревается решать эту проблему. Zend_Tool_Project это набор функциональности выстроенной для работы с Zend_Tool_Framework, чтобы предоставить решение проблемы управления проектами. Zend_Tool_Project отслеживает ресурсы внутри вашего приложения, где они находятся по отношению друг к другу, и названия, которыми вы обращаетесь к ним, что является ключевым моментом, который дает возможность &laquo;итерационную разработку&raquo;. Например, если вы имеете созданный проект с контроллером, названным &laquo;Foo&raquo;, вы можете позже захотеть добавить действие в этот контроллер. Чтобы сделать разработку настолько гладкой, на сколько возможно, изменение должно быть таким же простым, как создание новых ресурсов. Чтобы сделать это, Zend_Tool_Project отслеживает все, что вы уже сделали в вашем проекте.</p>
<p>Помимо отслеживания ресурсов приложения, Zend_Tool_Project является ключевой частью Zend_Tool, которая обеспечивает решение &laquo;построение проекта, основанного на Zend Framework&raquo;. Zend_Tool_Project точно знает, что такое проект, контроллер, представление, загрузочный класс, файл index.php, и т.д., как должны выглядеть, и помогает вам в их создании. Если вы извлечете Zend_Tool_Project из среды выполнения Zend_Tool, у вас останется только фреймворк (или платформа) для построения инструментальной системы. Это говорит о том, что любой проект может использовать Zend_Tool_Framework для создания инструментов, обеспечивающих их нужды.</p>
<h2 id="section6">На что оно способно сейчас</h2>
<p>Итак, имеем в виду все вышесказанное. Что оно может сделать прямо сейчас? Вместо того чтобы говорить об этом, давайте посмотрим несколько скриншотов.</p>
<h3>Помощь</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool1.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool1-300x270.png" alt="Zend_Tool. Помощь" title="Zend_Tool. Помощь" width="300" height="270" class="aligncenter size-medium wp-image-151" /></a></p>
<h3>Ошибка</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool2.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool2-300x275.png" alt="Zend_Tool. Ошибка" title="Zend_Tool. Ошибка" width="300" height="275" class="aligncenter size-medium wp-image-152" /></a></p>
<h3>Создание проекта</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool3.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool3-300x235.png" alt="Zend_Tool. Создание проекта" title="Zend_Tool. Создание проекта" width="300" height="235" class="aligncenter size-medium wp-image-153" /></a></p>
<h3>Создание контроллера</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool4.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool4-300x235.png" alt="Zend_Tool. Создание контроллера" title="Zend_Tool. Создание контроллера" width="300" height="235" class="aligncenter size-medium wp-image-154" /></a></p>
<h3>Создание действия</h3>
<p><a href="http://lobach.info/wp-content/uploads/2009/05/zf_tool5.png"><img src="http://lobach.info/wp-content/uploads/2009/05/zf_tool5-300x235.png" alt="Zend_Tool. Создание действия" title="Zend_Tool. Создание действия" width="300" height="235" class="aligncenter size-medium wp-image-155" /></a></p>
<h2>Что дальше</h2>
<p>В дополнение к тому, что уже сделано в релизе 1.8, ряд дополнительных возможностей уже в процессе разработки. Некоторые из этих возможностей уже в статусе бета-версии (и это причина, почему они не в дистрибутиве релиза), или все еще в фазе проектирования. К примеру, Zend_Application&nbsp;&mdash; мы приняли решение о том, как &laquo;модель&raquo; должна выглядеть, пусть даже всего лишь мы говорим о названии. Так же, с релизом 1.8 мы опубликовали структуру проекта по-умолчанию. Для проекта, основой которого является &laquo;библиотека компонентов&raquo;, это огромный шаг.</p>
<p>В дополнение к поддержке моделей, мы планируем добавить поддержку &laquo;моделей&raquo; (для построения компонентных приложений), соединений с базой данных и генерацию файлов Zend_Db_Table. Ищите эти возможности в ближайших релизах. Кроме того, поскольку Zend_Tool так расширяем, новые возможности могут быть вынесены за пределы проектов, внедряемых непосредственно в модуль Zend_Tool.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Rapid Application Development&nbsp;&mdash; <a href="http://ru.wikipedia.org/wiki/RAD">быстрая разработка приложений</a>&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:2">
<p>loading phase of a project&#160;<a href="#fnref:2" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:3">
<p>Command Line Interface&nbsp;&mdash; интерфейс командной строки&#160;<a href="#fnref:3" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:4">
<p>well-formed&nbsp;&mdash; синтаксически корректны&#160;<a href="#fnref:4" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Zend_Tool и ZF 1.8 on Лобач.info',url: 'http://lobach.info/develop/zf/zend-tool-and-zf-18/',contentID: 'post-150',suggestTags: 'php,zend framework,Zend_Tool,ZF1.8,перевод,разработка',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <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/zend_tool/" title="Zend_Tool" rel="tag">Zend_Tool</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a>, <a href="http://lobach.info/tag/%d1%80%d0%b0%d0%b7%d1%80%d0%b0%d0%b1%d0%be%d1%82%d0%ba%d0%b0/" title="разработка" rel="tag">разработка</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (7)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-tool-and-zf-18/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Хитрости ZF1.8</title>
		<link>http://lobach.info/develop/zf/tips-zf18/</link>
		<comments>http://lobach.info/develop/zf/tips-zf18/#comments</comments>
		<pubDate>Sun, 03 May 2009 22:26:40 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[config]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Rob Allen]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[ZF1.8]]></category>
		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=147</guid>
		<description><![CDATA[Небольшая заметка, которая может сберечь вам кучу времени при переводе проектов на эту версию фреймворка. Возможно даже будет цикл таких заметок. В первой идет разговор о конфигурационных параметрах. <a href="http://lobach.info/develop/zf/tips-zf18/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>В комментариях к учебнику <a href="http://akrabat.com/" title="Блог Роба Алена">в блоге Роба Алена</a> (кстати, он его уже обновил до последней текущей версии ZF&nbsp;&mdash; 1.8) <a href="http://akrabat.com/zend-framework-tutorial/#comment-25889" title="Комментарий к учебнику с вопросом о доступе к конфигурационным параметрам">задают вопрос</a>:</p>
<blockquote>
<p>Как в новой версии фреймворка применять конфигурационный файл?<br />
Раньше вопрошающий устанавливал переменную в своем конфигурационном файле:<br />
<code>cms.max.feeds = 10</code></p>
<p>А в загрузочном файле писал следующее:</p>
<pre><code>$configuration = new Zend_Config_Ini(
    APPLICATION_PATH . '/config/app.ini',
    APPLICATION_ENVIRONMENT
);
$registry = Zend_Registry::getInstance();
$registry-&gt;configuration = $configuration;</code></pre>
<p>Соответственно в контроллере получал значение следующим образом:</p>
<pre><code class="php">$this-&gt;_nMaxFeeds = INTVAL(Zend_Registry::getInstance()
             -&gt;configuration
             -&gt;cms
             -&gt;max
             -&gt;feeds);</code></pre>
</blockquote>
<p>Комментатор жалуется, что теперь он не знает как получить подобную функциональность в ZF1.8<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup></p>
<p>Роб ответил:</p>
<blockquote>
В контроллере можно сделать так:
<pre><code class="php">$bootstrap = $this-&gt;getInvokeArg('bootstrap');
$configArray = $bootstrap-&gt;getOptions();</code></pre>
<p>А если нужен экземпляр объекта _Zend_Config_, то надо добавить строчку:</p>
<pre><code class="php">$config = new Zend_Config($configArray);</code></pre>
</blockquote>
<p>Такая вот маленькая хитрость, которая наверняка может сохранить массу времени при переходе на новый релиз.</p>
<p><strong>Кстати1:</strong> из этой заметки наверняка понятно, что вышел новый релиз ZF, но если кто еще не знает рекомендую ознакомиться с переводом анонса релиза ZF1.8&nbsp;&mdash; <a href="http://zend-framework.ru/2009/05/zend-framework-1-8-0-reseas/" title="Перевод анонса выпуска релиза ZF1.8">Вышел Zend Framework 1.8.0</a></p>
<p><strong>Кстати2:</strong> Рекомендую ознакомиться с <a href="http://akrabat.com/zend-framework-tutorial/" title="Учебник / быстрый старт по ZF">учебником Роба</a>, чтобы иметь представление о применении консоли ZF, если кто еще не пробовал её в работе.</p>
<p><strong>Upd:</strong> Там же в комментариях Роб предложил универсальное решение в &laquo;старом&raquo; стиле:</p>
<pre><code>class Bootstrap extends Zend_Application_Bootstrap_Base
{
   public function run()
   {
       Zend_Registry::set('config',
           new Zend_Config($this-&gt;getOptions()));
       parent::run();
   }
}</code></pre>
<p>В этом случае объект конфига будет доступен в любом месте приложения.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Видимо имеется в виду каноническое использование ZF, т.е. через Zend_Application и стандартный bootstraping.&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Хитрости ZF1.8 on Лобач.info',url: 'http://lobach.info/develop/zf/tips-zf18/',contentID: 'post-147',suggestTags: 'config,php,Rob Allen,zend framework,ZF1.8,советы',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/config/" title="config" rel="tag">config</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/rob-allen/" title="Rob Allen" rel="tag">Rob Allen</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zf18/" title="ZF1.8" rel="tag">ZF1.8</a>, <a href="http://lobach.info/tag/%d1%81%d0%be%d0%b2%d0%b5%d1%82%d1%8b/" title="советы" rel="tag">советы</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/mail-send-testing/" title="Как протестировать рассылку почты (07.06.2010)">Как протестировать рассылку почты</a> (13)</li>
	<li><a href="http://lobach.info/develop/zf/using-zend-application/" title="Использование Zend_Application (26.03.2009)">Использование Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (7)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/tips-zf18/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Включение условных запросов в приложениях на Zend Framework</title>
		<link>http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/</link>
		<comments>http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/#comments</comments>
		<pubDate>Tue, 07 Apr 2009 08:52:26 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[zend framework]]></category>
		<category><![CDATA[Zend_Controller_Plugin]]></category>
		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=130</guid>
		<description><![CDATA[Источник: Enable your Zend Framework App with Conditional GET! Автор: Danila Vershinin Перевод: Лобач Олег В этой статье я покажу вам простой подход, позволяющий вашим приложениям на Zend Framework снизить нагрузку на каналы связи, став таким образом более дружелюбными к &#8230; <a href="http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><em><strong>Источник</strong>: <a href="http://smartycode.com/performance/zend-framework-browser-caching/">Enable your Zend Framework App with Conditional GET!</a><br />
<strong>Автор</strong>: Danila Vershinin<br />
<strong>Перевод</strong>: Лобач Олег</em></p>
<p>В этой статье я покажу вам простой подход, позволяющий вашим приложениям на Zend Framework снизить нагрузку на каналы связи, став таким образом более дружелюбными к пользователю.</p>
<p>Эта техника предполагает использование условного GET-запроса (HTTP conditional GET). Это базовая возможность HTTP-протокола. Посылая правильные HTTP-заголовки, ваше приложение позволяет браузерам посетителей кэшировать страницы вашего сайта.</p>
<p><span id="more-130"></span></p>
<p>Вы беспокоитесь о посетителях, имеющих старые версии страниц в кэше? Не стоит! Предлагаемый метод позволяет получить все выгоды от кэширования на стороне клиента без внесения каких-либо изменений, и требует всего 5 минут вашего времени для ее интеграции :).</p>
<p>Zend Framework великолепен в том, что вы можете легко расширить его. Мы собираемся создать плагин фронт-контроллера, который будет заботиться о обработке условных GET-запросов.</p>
<p>Давайте создадим наш плагин фронт-контроллера:</p>
<pre><code>&lt;?php
/**
 * Plugin to support conditional GET for php pages (using ETag)
 * Should be loaded the very last in the plugins stack
 *
 * @author $Author: danila $
 * @version $Id: Conditional.php 15741 2009-02-08 11:58:44Z danila $
 *
 */
class Smartycode_Http_Conditional extends Zend_Controller_Plugin_Abstract
{

    public function dispatchLoopShutdown()
    {
        $send_body = true;

        $etag = '"' . md5($this-&gt;getResponse()-&gt;getBody()) . '"';

        $inm = split(',', getenv("HTTP_IF_NONE_MATCH"));

        $inm = str_replace('-gzip', '', $inm);

        // TODO If the request would, without the If-None-Match header field,
        // result in anything other than a 2xx or 304 status,
        // then the If-None-Match header MUST be ignored

        foreach ($inm as $i) {
            if (trim($i) == $etag) {
                $this-&gt;getResponse()
                     -&gt;clearAllHeaders()
                     -&gt;setHttpResponseCode(304)
                     -&gt;clearBody();
                $send_body = false;
                break;
            }
        }

        $this-&gt;getResponse()
             -&gt;setHeader('Cache-Control', 'max-age=7200, must-revalidate', true)
             -&gt;setHeader('Expires', gmdate('D, d M Y H:i:s', time() + 2 * 3600) . ' GMT', true)
             -&gt;clearRawHeaders();

        if ($send_body) {
            $this-&gt;getResponse()
                 -&gt;setHeader('Content-Length', strlen($this-&gt;getResponse()-&gt;getBody()));
        } 

        $this-&gt;getResponse()-&gt;setHeader('ETag', $etag, true);
        $this-&gt;getResponse()-&gt;setHeader('Pragma', '');
    }
}</code></pre>
<p>Подключить этот плагин к фронт-контроллеру очень легко. Так же легко, как добавление строки в загрузочный файл:</p>
<pre><code class="php">$frontController-&gt;registerPlugin(
            new Smartycode_Http_Conditional(),
            101
        );</code></pre>
<p>Обратите внимание на &laquo;101&raquo;. Вы должны зарегистрировать плагин последним в стеке плагинов.</p>
<p>Эти простые шаги сделают ваше приложение на Zend Framework более дружелюбным к окружению:</p>
<ul>
<li>Работа AJAX-запросов происходит через зендовский MVC (все виды запросов)</li>
<li>Если страницы не изменялись со времени последнего запроса, то они не будут передаваться</li>
<li>Можно также полагать, что вы получите пользу для SEO&nbsp;&mdash; поисковые системы, поддерживающие Etag, смогут эффективно пропускать загрузку / повторный анализ страниц сайта, что ускорит индексацию страниц вашего сайта</li>
<li>Отправка заголовка Content-Length включает постоянные соединения (Keep-Alive connections)</li>
<li>Есть еще достоинства, но мне лень о них думать</li>
</ul>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Включение условных запросов в приложениях на Zend Framework on Лобач.info',url: 'http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/',contentID: 'post-130',suggestTags: 'php,plugins,zend framework,Zend_Controller_Plugin,перевод',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/zend_controller_plugin/" title="Zend_Controller_Plugin" rel="tag">Zend_Controller_Plugin</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/custom-zend_application-resources/" title="Пользовательские ресурсы для Zend_Application (13.01.2010)">Пользовательские ресурсы для Zend_Application</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/hooks-in-action-helpers/" title="Перехватчики в помощниках действий (06.11.2008)">Перехватчики в помощниках действий</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/using-action-helpers/" title="Использование помощников действий (02.11.2008)">Использование помощников действий</a> (8)</li>
	<li><a href="http://lobach.info/develop/zf/quick-start-to-zend_application_bootstrap/" title="Быстрый старт с Zend_Application_Bootstrap (23.01.2010)">Быстрый старт с Zend_Application_Bootstrap</a> (7)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zend Framework Debug Bar</title>
		<link>http://lobach.info/develop/zf/zend-framework-debug-bar/</link>
		<comments>http://lobach.info/develop/zf/zend-framework-debug-bar/#comments</comments>
		<pubDate>Mon, 30 Mar 2009 20:44:09 +0000</pubDate>
		<dc:creator>Олег Лобач</dc:creator>
				<category><![CDATA[Zend Framework]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=127</guid>
		<description><![CDATA[Сегодня с подачи Федерико обнаружил один интересный плагин — «Scienta ZF Debug Bar». Этот плагин обеспечивает удобный вывод полезной отладочной информации в небольшую панель внизу каждой страницы. Внешне эта панель очень похожа на аналогичную панель в Symfony. Бросив на панель &#8230; <a href="http://lobach.info/develop/zf/zend-framework-debug-bar/">Продолжить чтение <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Сегодня с подачи <a title="Блог Federico Cargnelutti" href="http://blog.fedecarg.com/">Федерико</a> обнаружил один интересный плагин  — «<a title="Домашняя страница плагина Scienta ZF Debug Bar" href="http://jokke.dk/software/scientadebugbar">Scienta ZF Debug Bar</a>».</p>
<p>Этот плагин обеспечивает удобный вывод полезной отладочной информации в небольшую панель внизу каждой страницы.</p>
<p><img class="aligncenter size-full wp-image-128" title="Внешний вид отладочной панели" src="http://lobach.info/wp-content/uploads/2009/03/2009-scienta_debugbar.png" alt="Внешний вид отладочной панели" width="569" height="21" /></p>
<p>Внешне эта панель очень похожа на аналогичную панель в <a href="http://www.symfony-project.org/">Symfony</a>. Бросив на панель беглый взгляд, сразу можно узнать затраченное на генерацию страницы время,  расход памяти и количества запросов. Дополнительно в отдельных панелях показываются подключенные файлы, список переменных, доступных в представлении, перечень SQL-запросов (возможно настроить до двух адаптеров), ошибки и исключения.</p>
<p>В ближайшее время попробую этот плагин в работе. О впечатлениях напишу.</p>
<div class="evernoteSiteMemory"><a href="javascript:" onclick="Evernote.doClip({title: 'Zend Framework Debug Bar on Лобач.info',url: 'http://lobach.info/develop/zf/zend-framework-debug-bar/',contentID: 'post-127',suggestTags: 'debug,php,plugins,zend framework',providerName: 'Лобач.info',styling: 'text' });return false" class="evernoteSiteMemoryLink"><img src="http://static.evernote.com/article-clipper-rus.png" class="evernoteSiteMemoryButton" /><br />
				</a>
<div class="evernoteSiteMemoryClear">&nbsp;</div>
</div>

	Метки: <a href="http://lobach.info/tag/debug/" title="debug" rel="tag">debug</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />

	<h4>Похожие записи</h4>
	<ul class="st-related-posts">
	<li><a href="http://lobach.info/develop/zf/creating-re-usable-zend_application-resource-plugins/" title="Создание повторно используемых плагинов ресурсов Zend_Application (08.02.2010)">Создание повторно используемых плагинов ресурсов Zend_Application</a> (2)</li>
	<li><a href="http://lobach.info/develop/zf/mail-send-testing/" title="Как протестировать рассылку почты (07.06.2010)">Как протестировать рассылку почты</a> (13)</li>
	<li><a href="http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/" title="Включение условных запросов в приложениях на Zend Framework (07.04.2009)">Включение условных запросов в приложениях на Zend Framework</a> (0)</li>
	<li><a href="http://lobach.info/develop/zf/tips-zf18/" title="Хитрости ZF1.8 (04.05.2009)">Хитрости ZF1.8</a> (1)</li>
	<li><a href="http://lobach.info/develop/zf/zfconf2011-registratio/" title="Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework (05.05.2011)">Список докладов и финальная регистрация ZFConf 2011 — второй российской конференции по Zend Framework</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-framework-debug-bar/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

