<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" version="2.0">

<channel>
	<title>Лобач.info</title>
	
	<link>http://lobach.info</link>
	<description>Заметки LAMP-программиста о вебдеве и не только...</description>
	<pubDate>Tue, 30 Jun 2009 20:28:22 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/lobach" type="application/rss+xml" /><feedburner:emailServiceId xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">lobach</feedburner:emailServiceId><feedburner:feedburnerHostname xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.bloglines.com/sub/http://feeds.feedburner.com/lobach" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Flobach" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
		<title>Виновник «падения» веб-сервера найден</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[Этот пост я хочу посвятить решению одной проблемы, которая доставила мне массу проблем. Хотя, если говорить о неприятностях, то они скорее были не у меня, а у пользователей проекта, в котором я участвую1.
Проблема заключалась в том, что пользователи не могли сохранить на сервере данные, если они превышали определённый объём. При чем, не могли сохранить на [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/i2PqCQqZPxRYTyVuLs4HT-vdDHQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/i2PqCQqZPxRYTyVuLs4HT-vdDHQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/i2PqCQqZPxRYTyVuLs4HT-vdDHQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/i2PqCQqZPxRYTyVuLs4HT-vdDHQ/1/di" border="0" ismap="true"></img></a></p><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>

	Tags: <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 />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=ryW3buBsqdI:etKQzUJILe4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/find-culprit-down-web-server/feed/</wfw:commentRss>
		</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. В статье рассмотрены предпосылки создания, архитектурные решения, возможности расширения и примеры использования.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/FJCSFYwSnL0QQmQ9xulvpUHncE0/0/da"><img src="http://feedads.g.doubleclick.net/~a/FJCSFYwSnL0QQmQ9xulvpUHncE0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/FJCSFYwSnL0QQmQ9xulvpUHncE0/1/da"><img src="http://feedads.g.doubleclick.net/~a/FJCSFYwSnL0QQmQ9xulvpUHncE0/1/di" border="0" ismap="true"></img></a></p><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>

	Tags: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/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 />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=2w70MvoFtQw:7ASOfrDyr-c:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-tool-and-zf-18/feed/</wfw:commentRss>
		</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[Небольшая заметка, которая может сберечь вам кучу времени при переводе проектов на эту версию фреймворка. Возможно даже будет цикл таких заметок. В первой идет разговор о конфигурационных параметрах.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/G6exvce-ifDt_KHf-pxparv88Eo/0/da"><img src="http://feedads.g.doubleclick.net/~a/G6exvce-ifDt_KHf-pxparv88Eo/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/G6exvce-ifDt_KHf-pxparv88Eo/1/da"><img src="http://feedads.g.doubleclick.net/~a/G6exvce-ifDt_KHf-pxparv88Eo/1/di" border="0" ismap="true"></img></a></p><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>

	Tags: <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 />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=qjP4p7viv_A:tRn6apsKdBI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/tips-zf18/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Снова про скроллер и jQuery</title>
		<link>http://lobach.info/develop/javascript/again-about-scroller-and-jquery/</link>
		<comments>http://lobach.info/develop/javascript/again-about-scroller-and-jquery/#comments</comments>
		<pubDate>Thu, 30 Apr 2009 08:43:09 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[javascript]]></category>

		<category><![CDATA[jQuery]]></category>

		<category><![CDATA[plugins]]></category>

		<category><![CDATA[примеры]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=146</guid>
		<description><![CDATA[Больше года назад я уже писал о примере реализации скроллера на jQuery. Смысл скроллера состоял в том, что нужно было сделать &#171;бесконечную&#187; ленту неких объектов и отображать в их в небольшом окошке, в котором эта лента как-бы прокручивается. Реализация получилась вполне работоспособная, хоть и не без недостатков.

А совсем недавно мне снова потребовался скроллер, но горизонтальный [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/dBSW-sET6ewNqk0W9m2nB9q3ZE4/0/da"><img src="http://feedads.g.doubleclick.net/~a/dBSW-sET6ewNqk0W9m2nB9q3ZE4/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/dBSW-sET6ewNqk0W9m2nB9q3ZE4/1/da"><img src="http://feedads.g.doubleclick.net/~a/dBSW-sET6ewNqk0W9m2nB9q3ZE4/1/di" border="0" ismap="true"></img></a></p><p>Больше года назад я уже писал о <a href="/develop/javascript/slideup-scroller/" title="статья 'Пример создания SlideUp скроллера с помощью jQuery'">примере реализации скроллера на jQuery</a>. Смысл скроллера состоял в том, что нужно было сделать &laquo;бесконечную&raquo; ленту неких объектов и отображать в их в небольшом окошке, в котором эта лента как-бы прокручивается. Реализация получилась вполне работоспособная, хоть и не без недостатков.</p>
<p><span id="more-146"></span></p>
<p>А совсем недавно мне снова потребовался скроллер, но горизонтальный и управляемый пользователем (в отличии от предыдущего вертикального и автоскролируемого). Изобретать велосипед снова мне было лениво и я решил проверить, есть ли плагины для jQuery с нужным мне функционалом. Перепробовал я массу разных плагинов (упоминать о них смысла нет) пока не набрел на настоящую жемчужину! Идеальный для моей задачи плагин&nbsp;&mdash; <strong>Scrollable</strong> (<a href="http://plugins.jquery.com/project/scrollable" title="Страница плагина в каталоге jQuery">страница в каталоге</a> и <a href="http://www.flowplayer.org/tools/scrollable.html" title="Домашняя страница плагина Scrollable">домашняя страница</a>).</p>
<p>Плагин совершенно замечательный&nbsp;&mdash; масса возможностей, прост в использовании, понятные примеры, приятный код.</p>
<p><strong>Фичи:</strong></p>
<ul>
<li>горизонтальный и вертикальный скролинг</li>
<li>скролинг при помощи навигационных кнопок, вызовов API, курсорных клавиш на клавиатуре и колесом прокрутки на мыше</li>
<li>настраиваемое количество элементов скролируемых за раз</li>
<li>настраивание навигационных кнопок без единой строчки JavaScript</li>
<li>постраничное скролирование</li>
<li>действия, вызываемые программно: next, prev, nextPage, prevPage, seekTo, begin, end ...</li>
<li>динамическое добавление и удаление элементов</li>
<li>автоматически скролинг</li>
<li>возможность настроить поведение скролинга с помощью листенеров onBeforeSeek и onSeek</li>
<li>размер минимизированного файла около 6.0K</li>
</ul>
<p>Применил я этот плагин для организации вывода постраничной навигации. На мой взгляд получилось достаточно удобно&nbsp;&mdash; легко можно добраться до любой страницы. Правда у этого способа тоже есть недостаток&nbsp;&mdash; если страниц уж очень много, то это становится неудобно для пользователя и тяжеловато для браузера. Мы решили ограничиться 100 страницами, а остальные просо отбрасываем.</p>
<p>Была у мне с этим плагином одна непонятка: не срабатывали вызовы API. Моя логика (основываясь на курении доки) подсказывала такой способ вызова:</p>
<pre><code class="javascript">var api = $("div.scrollable").scrollable();
api.click(10); // для перехода к десятому элементу</code></pre>
<p>Но этот код работать не захотел. Пришлось извратиться так:</p>
<pre><code class="javascript">$("div.scrollable").scrollable();
$("div.scrollable").scrollable().click(10);</code></pre>
<p>Если кто-нибудь подскажет более красивое решение или объяснит где я неправ в своих хотелках&nbsp;&mdash; буду очень признателен.</p>
<p>Еще статьи об этом плагине:</p>
<ul>
<li><a href="http://vremenno.net/js/jquery-scrolling-plugin/" title="Скроллер содержимого на jQuery">Скроллер содержимого на jQuery</a></li>
<li><a href="http://blog.webmasterschool.ru/javascript/200/" title="Навигация с использованием jQuery">Навигация с использованием jQuery</a></li>
</ul>

	Tags: <a href="http://lobach.info/tag/javascript/" title="javascript" rel="tag">javascript</a>, <a href="http://lobach.info/tag/jquery/" title="jQuery" rel="tag">jQuery</a>, <a href="http://lobach.info/tag/plugins/" title="plugins" rel="tag">plugins</a>, <a href="http://lobach.info/tag/%d0%bf%d1%80%d0%b8%d0%bc%d0%b5%d1%80%d1%8b/" title="примеры" rel="tag">примеры</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=EflzD2rNty4:GErzFs3SrwM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/javascript/again-about-scroller-and-jquery/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Советы по фиксациям в SVN</title>
		<link>http://lobach.info/develop/svn/svn-commit-tutorial/</link>
		<comments>http://lobach.info/develop/svn/svn-commit-tutorial/#comments</comments>
		<pubDate>Wed, 15 Apr 2009 21:43:12 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[SVN]]></category>

		<category><![CDATA[контроль версий]]></category>

		<category><![CDATA[перевод]]></category>

		<category><![CDATA[советы]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=136</guid>
		<description><![CDATA[Предлагаю перевод хорошей статьи с советами по выполнению фиксаций в хранилище. Оригинал написан для проекта T2, но практически все советы универсальны и легко применимы для любого другого проекта. А самое главное&#160;&#8212; они действительно полезны.
В названии статьи хоть и фигурирует SVN, но советы, изложенные в ней, подходят ко всем известным мне системам кондроля версий. Стоит так [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/m-84G88S_cpuMXi8CeLnzlxA5JQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/m-84G88S_cpuMXi8CeLnzlxA5JQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/m-84G88S_cpuMXi8CeLnzlxA5JQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/m-84G88S_cpuMXi8CeLnzlxA5JQ/1/di" border="0" ismap="true"></img></a></p><p><em>Предлагаю перевод хорошей статьи с советами по выполнению фиксаций в хранилище. Оригинал написан для проекта <a href="http://www.t2-project.org/">T2</a>, но практически все советы универсальны и легко применимы для любого другого проекта. А самое главное&nbsp;&mdash; они действительно полезны.</em></p>
<p><em>В названии статьи хоть и фигурирует SVN, но советы, изложенные в ней, подходят ко всем известным мне системам кондроля версий. Стоит так же заметить, что советы направлены в основном на командную разработку.</em></p>
<p><span id="more-136"></span></p>
<p><em><strong>Источник</strong>: <a href="http://www.t2-project.org/developer/svn-commit-tutorial.html">T2 SVN commit tutorial</a><br />
<strong>Автор</strong>: The T2 SDE Project<br />
<strong>Перевод</strong>: Лобач Олег</em></p>
<p><strong>Дважды подумайте перед фиксацией изменений</strong></p>
<p>Т.к. фиксация изменений в SVN может иметь серьёзные последствия, найдите время для того, чтобы разобраться, не сломает ли ваш код что либо у других разработчиков. Ведь хранилище кода одно на всех, и если вы что-то сломаете, то это сломается у всех. SVN, конечно, позволяет вернуться к предыдущим версиям и это может помочь решить проблему, но лучше все же предупредить проблему, чем её в последствии героически устранять.</p>
<p><strong>Никогда не фиксируйте код, который не компилируется</strong></p>
<p><em>Прим. пер.: в этом пункте речь идет о компиляции, что для веб-разработки не актуально, но если под компиляцией понимать отсутствие ошибок, то пункт вполне обретает смысл и для веб-приложений</em></p>
<p>Скомпилируйте код и устраните все ошибки прежде чем фиксировать изменения в хранилище. Убедитесь, что новые файлы были зафиксированы. Если их не будет, то у вас локально код будет компилироваться, а все остальные не смогут этого сделать.</p>
<p>Вам, безусловно, следует убедиться, что код компилируется с вашими локальными настройками и на вашей платформе. Вы также должны принять во внимание последствия вашей фиксации для компиляции на другой архитектуре.</p>
<p><strong>Тестируйте ваши изменения перед фиксацией</strong></p>
<p>Запустите приложение и проверьте работу тех участков, которые могли быть затронуты вашими изменениями,чтобы убедиться в том, что изменения ведут себя так, как вы задумывали.</p>
<p><strong>Дважды проверьте то, что фиксируете</strong></p>
<p>Сделайте <em>&laquo;svn up&raquo;</em> и <em>&laquo;svn diff&raquo;</em> перед фиксацией. Получите сообщения от SVN о конфликтах, неизвестных файлах и прочее. &laquo;svn diff&raquo; покажет, что же именно вы фиксируете. Проверьте, действительно ли это то, что вы собирались фиксировать.</p>
<p><strong>Всегда добавляйте содержательные комментарии<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup> к фиксации</strong></p>
<p>Комментарии должны быть понятны любому, кто видит только лог. Они не должны зависеть от информации вне контекста фиксации.<br />
Попробуйте описать только те файлы, которые реально затрагиваются в описываемых в комментариях изменениями.</p>
<p>На практике, заносите в комментарии всю важную информацию, которую невозможно увидеть из вывода команды <em>diff</em>.</p>
<p><strong>Система контроля версий не является заменой общению между разработчиками</strong></p>
<p>Когда вы планируете сделать изменения, затрагивающие множество различного кода в SVN, сообщите об этом в подписном листе заранее.</p>
<p>Изменения, затрагивающие множество кода в SVN, такие как переход на использование новых функций в библиотеках, способны сломать прочий код, даже если они кажутся тривиальными. Такие изменения могут быть опасны потому, что приложение должно по ряду причин компилироваться со старыми библиотеками. Сообщив об изменениях заранее, разработчики могут подготовиться и высказать обеспокоенность, прежде, чем что-то сломается.</p>
<p><strong>Возьмите на себя ответственность за собственные фиксации</strong></p>
<p>Если ваша фиксация сломала что-то или имеет побочное действие на другие участки кода, будьте ответственными и исправьте это или помогите другим исправить проблему.</p>
<p><strong>Не фиксируйте код, который вы не понимаете</strong></p>
<p>Избегайте ситуаций, подобных этой: &laquo;Я не знаю, почему он <em>падает</em>, но когда я делаю это, он больше не <em>падает&raquo;</em> или &laquo;Я не вполне уверен, что это правильно, но во всяком случае у меня это работает&raquo;.</p>
<p>Если вы не нашли решение проблемы, обсудите её с другими разработчиками.</p>
<p><strong>Не злоупотребляйте своим SVN-аккаунтом, чтобы пропихнуть изменения, отвергнутые другими разработчиками</strong></p>
<p>Если есть разногласия по поводу изменения кода, они должны быть урегулированы путем обсуждения их в списке рассылки или в частном порядке, а не насильной заменой кода других, просто зафиксировав свои изменения в хранилище.</p>
<p><strong>Если вы фиксируете багфикс, учитывайте перенос исправлений в другие ветки</strong></p>
<p>Используйте одинаковый комментарий для обеих фиксаций &ndash; основного исправления и переносимого (только дополните комментарий номером ревизии основной фиксации). Таким образом, можно легко увидеть, какие исправления были уже перенесены.</p>
<p><strong>Если вы исправляете ошибки, зафиксированные в системе учета ошибок<sup id="fnref:2"><a href="#fn:2" rel="footnote">2</a></sup>, добавьте в комментарий номер ошибки</strong></p>
<p>Для того, чтобы сохранять вашу систему учета ошибок и SVN синхронизированными, вы должны указывать номер ошибки в комментариях к вашим фиксациям, а затем закрывать ошибку в системе учета.</p>
<p><strong>Создавайте атомарные фиксации</strong></p>
<p>SVN имеет возможность фиксировать более одного файла за один раз. Поэтому, пожалуйста, фиксируйте все связанные изменения в нескольких файлах (даже если они охватывают несколько каталогов одновременно) за один раз. Таким образом, вы будете уверенны, что хранилище останется в компилируемом состоянии (<em>т.е. код в хранилище компилируется без ошибок,&nbsp;&mdash; прим. пер.</em>) до и после фиксации, а так же наборы изменений легки для слияний или откатов.</p>
<p><strong>Не смешивайте изменения форматирования и изменения кода</strong></p>
<p>Изменение форматирования кода, такое как <em>отступ</em> или <em>разрежение</em>, просто взрывает <em>diff</em>, что сильно затрудняет поиск изменений в коде если они перемешаны с форматированием. Фиксирование изменений форматирования отдельно разрешает эту проблему.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>в оригинале: log messages&#160;<a href="#fnref:1" rev="footnote">&#8617;</a></p>
</li>
<li id="fn:2">
<p>bug tracking system&#160;<a href="#fnref:2" rev="footnote">&#8617;</a></p>
</li>
</ol>
</div>

	Tags: <a href="http://lobach.info/tag/svn/" title="SVN" rel="tag">SVN</a>, <a href="http://lobach.info/tag/%d0%ba%d0%be%d0%bd%d1%82%d1%80%d0%be%d0%bb%d1%8c-%d0%b2%d0%b5%d1%80%d1%81%d0%b8%d0%b9/" title="контроль версий" rel="tag">контроль версий</a>, <a href="http://lobach.info/tag/perevod/" 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 />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=OtOH3oDXlXo:o45-iabxTyU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/svn/svn-commit-tutorial/feed/</wfw:commentRss>
		</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 снизить нагрузку на каналы связи, став таким образом более дружелюбными к пользователю.
Эта техника предполагает использование условного GET-запроса (HTTP conditional GET). Это базовая возможность HTTP-протокола. Посылая правильные HTTP-заголовки, ваше приложение [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/Eir2WgyfSiFHAPb1m8agksUBJmk/0/da"><img src="http://feedads.g.doubleclick.net/~a/Eir2WgyfSiFHAPb1m8agksUBJmk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Eir2WgyfSiFHAPb1m8agksUBJmk/1/da"><img src="http://feedads.g.doubleclick.net/~a/Eir2WgyfSiFHAPb1m8agksUBJmk/1/di" border="0" ismap="true"></img></a></p><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>

	Tags: <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 />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=uDgJYBJAMFs:lpQt3moWLtc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/enable-conditional-get-in-zend-framework-app/feed/</wfw:commentRss>
		</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. Бросив на панель беглый взгляд, сразу можно узнать затраченное на генерацию страницы время,  расход памяти и количества запросов. [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/4eRZ_qHiclcJH6f9apEDAPLprkk/0/da"><img src="http://feedads.g.doubleclick.net/~a/4eRZ_qHiclcJH6f9apEDAPLprkk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/4eRZ_qHiclcJH6f9apEDAPLprkk/1/da"><img src="http://feedads.g.doubleclick.net/~a/4eRZ_qHiclcJH6f9apEDAPLprkk/1/di" border="0" ismap="true"></img></a></p><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>

	Tags: <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 />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=k_zXl2_AoI0:PtQojC4-Fls:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/zend-framework-debug-bar/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Использование Zend_Application</title>
		<link>http://lobach.info/develop/zf/using-zend-application/</link>
		<comments>http://lobach.info/develop/zf/using-zend-application/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 17:01:55 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[incubator]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[review]]></category>

		<category><![CDATA[Rob Allen]]></category>

		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=122</guid>
		<description><![CDATA[Роб Аллен опубликовал статью с описанием применения нового &#171;пакета&#187; Zend_Application. Этот &#171;пакет&#187; представляет собой набор классов для упрощения и облегчения  создания загрузчика приложения (bootstrap file). Zend_Application сейчас находится в инкубаторе и его активно дорабатывают. Выпуск намечен в релизе 1.8.
Роб описывает два варианта использования Zend_Application: воспользоваться системой плагинов, каждый из которых отвечает за инициализацую своей части [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/uApJq5QK_Bp8lOEwIVKoHJH24Gw/0/da"><img src="http://feedads.g.doubleclick.net/~a/uApJq5QK_Bp8lOEwIVKoHJH24Gw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/uApJq5QK_Bp8lOEwIVKoHJH24Gw/1/da"><img src="http://feedads.g.doubleclick.net/~a/uApJq5QK_Bp8lOEwIVKoHJH24Gw/1/di" border="0" ismap="true"></img></a></p><p><a title="Блог Роба Аллена" href="http://akrabat.com/">Роб Аллен</a> опубликовал статью с описанием применения нового &laquo;пакета&raquo; Zend_Application. Этот &laquo;пакет&raquo; представляет собой набор классов для упрощения и облегчения  создания загрузчика приложения (bootstrap file). Zend_Application сейчас находится в инкубаторе и его активно дорабатывают. Выпуск намечен в релизе 1.8.</p>
<p>Роб описывает два варианта использования Zend_Application: воспользоваться системой плагинов, каждый из которых отвечает за инициализацую своей части приложения (БД, представление, фронт-контроллер, и т.д.), или реализовать инициализацию в методах специального класса.</p>
<p>На мой взгляд это будет достаточно полезный класс и если у кого-то возникло желание познакомится с ним поближе&nbsp;&mdash; предлагаю начать с чтения статьи &laquo;<a href="http://akrabat.com/2009/03/25/initial-notes-on-zend_application/">Initial notes on Zend_Application</a>&raquo;</p>

	Tags: <a href="http://lobach.info/tag/incubator/" title="incubator" rel="tag">incubator</a>, <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/review/" title="review" rel="tag">review</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><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/lobach?a=cxTIrMTR8hU:y51kfWdMjPY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/lobach?d=yIl2AUoC8zA" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/using-zend-application/feed/</wfw:commentRss>
		</item>
		<item>
		<title>PHPUnit: Тестирование контроллеров Zend Framework</title>
		<link>http://lobach.info/develop/zf/phpunit-testing-zend-framework-controllers/</link>
		<comments>http://lobach.info/develop/zf/phpunit-testing-zend-framework-controllers/#comments</comments>
		<pubDate>Fri, 06 Feb 2009 10:47:11 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[action controller]]></category>

		<category><![CDATA[phpunit]]></category>

		<category><![CDATA[unit test]]></category>

		<category><![CDATA[zend framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=120</guid>
		<description><![CDATA[Сегодня я хочу предложить вам перевод статьи Federico Cargnelutti PHPUnit: Testing Zend Framework Controllers, посвященной первым шагам в модульном тестировании контроллеров действий Zend Framework.
Тестирование Веб-приложений&#160;&#8212; это комплексная задача, потому что веб-приложение создается из нескольких логических слоев. Модульное тестирование контроллера Zend Framework может быть весьма трудной задачей, особенно для тех, кто слабо знаком с Zend Framework.

Вы [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/Ljz_cNbUBwpOrdEcg9GQ-2KawpI/0/da"><img src="http://feedads.g.doubleclick.net/~a/Ljz_cNbUBwpOrdEcg9GQ-2KawpI/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Ljz_cNbUBwpOrdEcg9GQ-2KawpI/1/da"><img src="http://feedads.g.doubleclick.net/~a/Ljz_cNbUBwpOrdEcg9GQ-2KawpI/1/di" border="0" ismap="true"></img></a></p><p><em>Сегодня я хочу предложить вам перевод статьи <a href="http://phpimpact.wordpress.com/">Federico Cargnelutti</a> <a href="http://phpimpact.wordpress.com/2008/12/27/phpunit-testing-zend-framework-controllers/">PHPUnit: Testing Zend Framework Controllers</a>, посвященной первым шагам в модульном тестировании контроллеров действий Zend Framework.</em></p>
<p>Тестирование Веб-приложений&nbsp;&mdash; это комплексная задача, потому что веб-приложение создается из нескольких логических слоев. Модульное тестирование контроллера Zend Framework может быть весьма трудной задачей, особенно для тех, кто слабо знаком с Zend Framework.</p>
<p><span id="more-120"></span></p>
<p>Вы можете тестировать свои контроллеры действий использую <a href="http://framework.zend.com/manual/en/zend.test.html">Zend_Test</a> и/или <a href="http://www.phpunit.de/">PHPUnit</a>. Zend_Test позволяет вам имитировать запросы, передавать тестовые данные, контролировать вывод вашего приложения и в целом убедиться в том, что ваш код делает именно то, что должен делать. Вам решать, какой из них использовать. Если вы не можете выбрать один из них, то можете использовать оба. Если вы только знакомитесь с тестированием с помощью Zend_Test, то <a href="http://weierophinney.net/matthew/archives/190-Setting-up-your-Zend_Test-test-suites.html">эта статья</a> будет лучшим местом старта.</p>
<p>Фреймворк PHPUnit может показаться очень знакомым тем разработчикам, которые пришли из Java. Разработчики PHPUnit черпали вдохновение из JUnit&nbsp;&mdash; тестовом фреймворке для платформы Java, поэтому вы будете чувствовать себя как дома при использовании PHPUnit если вам уже приходилось сталкиваться с JUnit или одним из его клонов.</p>
<p>Конечно, никто не запрещает вам использовать системы бок о бок (даже в одном и том же приложении). В конце концов, большинство проектов так и будет использовать.</p>
<h3>Использование PHPUnit</h3>
<p>Во-первых, вам необходимо создать структуру каталогов:</p>
<pre>app/
    config/
    controllers/
        ExampleController.php
    models/
    views/
lib/
    Zend/
public/
tests/
    controllers/
        AllTests.php
        ExampleControllerTest.php
    lib/
    AllTests.php
    bootstrap.php</pre>
<p>Тестовый набор нуждается в некоторой информации об окружении, и обычно эта информация находится в файле bootstrap.php. Самым большим отличием этого файла от одного из из используемых в вашем приложении является то, что Фронт-контроллер не выполняет диспетчеризацию объекта запроса:</p>
<p><strong>tests/bootstrap.php</strong> [ <a href="http://phpimpact.codepad.org/3XY6HY1b" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
/* Start output buffering */
ob_start();

/* Report all errors directly to the screen for simple diagnostics in the dev environment */
error_reporting( E_ALL | E_STRICT );
ini_set('display_startup_errors', 1);
ini_set('display_errors', 1);
date_default_timezone_set('Europe/London');

/* Determine the root and library directories of the application */
$appRoot = dirname(__FILE__) . '/..';
$libDir = "$appRoot/lib";
$path = array($libDir, get_include_path());
set_include_path(implode(PATH_SEPARATOR, $path));

define('APPLICATION_PATH', $appRoot . '/app');
define('APPLICATION_ENVIRONMENT', 'dev');

require_once "Zend/Loader.php";
Zend_Loader::registerAutoload();

$front = Zend_Controller_Front::getInstance();
$front-&gt;throwExceptions(true);
$front-&gt;setParam('noViewRenderer', true);
$front-&gt;setParam('env', APPLICATION_ENVIRONMENT);
$front-&gt;setRequest(new Zend_Controller_Request_Http());
$front-&gt;returnResponse(true);

$router = $front-&gt;getRouter();
include APPLICATION_PATH . '/config/routes.php';
$router-&gt;addRoutes($routes);
$router-&gt;setParams($front-&gt;getParams());

$dispatcher = $front-&gt;getDispatcher();
$dispatcher-&gt;setParams($front-&gt;getParams());
$dispatcher-&gt;setResponse($front-&gt;getResponse());
$router-&gt;route($front-&gt;getRequest());</code></pre>
<p>Обратите внимание! Отключение помощника ViewRenderer является не обязательным. Однако, вам должно быть известно, что использование класса Zend_Controller_Action_Helper_ViewRenderer может привести к снижению производительности. Подробнее об этом можно прочесть <a href="http://phpimpact.wordpress.com/2008/09/16/zend-framework-controller-22-drop-in-responsiveness/">здесь</a>.</p>
<p>Класс PHPUnit_Framework_TestSuite фреймворка PHPUnit позволяет вам организовать тесты в иерархические наборы тестов:</p>
<p><strong>tests/AllTests.php</strong> [ <a href="http://phpimpact.codepad.org/8EQspGqq" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
require_once dirname(__FILE__) . '/bootstrap.php';
require_once dirname(__FILE__) . '/controllers/AllTests.php';

class AllTests
{
    public static function main()
    {
        $parameters = array();
        PHPUnit_TextUI_TestRunner::run(self::suite(), $parameters);
    }

    public static function suite()
    {
        $suite = new PHPUnit_Framework_TestSuite('My Application');
        $suite-&gt;addTest(ControllersAllTests::suite());
        return $suite;
    }
}
AllTests::main();</code></pre>
<p><strong>tests/controllers/AllTests.php</strong> [ <a href="http://phpimpact.codepad.org/iDFGH0nf" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
require_once dirname(__FILE__) . '/ExampleControllerTest.php';

class ControllersAllTests
{
    public static function main()
    {
        PHPUnit_TextUI_TestRunner::run(self::suite());
    }
    public static function suite()
    {
        $suite = new PHPUnit_Framework_TestSuite('My Application - Controllers');
        $suite-&gt;addTestSuite('ExampleControllerTestCase');
        return $suite;
    }
}</code></pre>
<h3>Написание модульных тестов</h3>
<p>Из-за довольно <a href="http://sebastian-bergmann.de/archives/779-PHP-Has-No-Culture-of-Testing.html">странных причин</a> эта часть не описана в документации. Вот что вам нужно сделать до написания теста:</p>
<ol>
<li>Подключить контроллер, который вы собираетесь тестировать.</li>
<li>Расширить контроллер действий (унаследовавшись от него).</li>
<li>Сбросить состояние экземпляра фронт-контроллера.</li>
<li>Указать путь к тестируемому контроллеру действий.</li>
<li>Установить объекты Запроса и Ответа.</li>
<li>Создать экземпляр тестируемого объекта.</li>
</ol>
<p>Пример:</p>
<p><strong>tests/controllers/ExampleControllerTest.php</strong> [ <a href="http://phpimpact.codepad.org/LgS7T5ly" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">&lt;?php
require_once APPLICATION_PATH . '/controllers/ExampleController.php';

class ExampleControllerTest extends ExampleController
{
    public function __construct($url = null)
    {
        $front = Zend_Controller_Front::getInstance();
        $front-&gt;resetInstance();
        $front-&gt;setControllerDirectory(APPLICATION_PATH . '/controllers');
        $front-&gt;setRequest(new Zend_Controller_Request_Http($url));
        $front-&gt;setResponse(new Zend_Controller_Response_Http());
        parent::__construct($front-&gt;getRequest(), $front-&gt;getResponse());
    }
}</code></pre>
<p>Вся магия происходит внутри класса ExampleControllerTest. Он делает так, что контроллер действий думает, что был вызван фронт-контроллером в цикле диспетчеризации. Единственный путь сделать это&nbsp;&mdash; создание экземпляра контроллера действий без диспетчеризации запроса. Получение экземпляра контроллера действий дает вам больше контроля и гибкости, особенно при тестировании веб-сервисов.</p>
<p>А теперь пришло время создать наш первый тестовый набор. Тестовый набор это класс, наследуемый от PHPUnit_Framework_TestCase, содержащий тестовые методы, определяемые по префиксу “test” в названии метода.</p>
<p>[ <a href="http://phpimpact.codepad.org/4Ldq4ORj" target="_blank">Открыть в Codepad</a> ]</p>
<pre><code class="php">require_once APPLICATION_PATH . '/controllers/ExampleController.php';

class ExampleControllerTest extends ExampleController
{
    ...
}

class ExampleControllerTestCase extends PHPUnit_Framework_TestCase
{
    public function testDefaultAction()
    {
        $controller = new ExampleControllerTest();
        $isDispatched = $controller-&gt;indexAction();

        $this-&gt;assertTrue($isDispatched);
    }

    public function testFirstAction()
    {
        $url = 'http://localhost/example/first';
        $controller = new ExampleControllerTest($url);
        $controller-&gt;firstAction();
        $errorMsg = $controller-&gt;getRequest()-&gt;getParam('error_message', null);

        $this-&gt;assertEquals(null, $errorMsg);
    }

    public function testGetParameterName()
    {
        $url = 'http://localhost/example/first/fed';
        $controller = new ExampleControllerTest($url);
        $name = $controller-&gt;getRequest()-&gt;getParam('name', null);

        $this-&gt;assertEquals('fed', $name);
    }

    public function testGetNameMethod()
    {
        $url = 'http://localhost/example/first/fed';
        $controller = new ExampleControllerTest($url);
        $name = $controller-&gt;getName();
        $this-&gt;assertEquals('fed', $name);
    }
}</code></pre>
<h3>Запуск тестов</h3>
<pre>federico@tests$ phpunit AllTests
PHPUnit 3.3.8 by Sebastian Bergmann.
.....
Time: 0 seconds
OK (4 tests, 4 assertions)</pre>
<p>Если тестирование завершится неудачно, то вы увидите подробную информацию о проваленном тесте. По желанию, вы можете <a href="http://hudson.gotdns.com/wiki/display/HUDSON/Phing+Plugin" target="_blank">подключить Phing в Hudson</a> и автоматизировать выполнение этой задачи. Если есть вопросы&nbsp;&mdash; обращайтесь.</p>

	Tags: <a href="http://lobach.info/tag/action-controller/" title="action controller" rel="tag">action controller</a>, <a href="http://lobach.info/tag/phpunit/" title="phpunit" rel="tag">phpunit</a>, <a href="http://lobach.info/tag/unit-test/" title="unit test" rel="tag">unit test</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=U0ZhkNap"><img src="http://feeds.feedburner.com/~f/lobach?d=41" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/phpunit-testing-zend-framework-controllers/feed/</wfw:commentRss>
		</item>
		<item>
		<title>С Новым Годом!</title>
		<link>http://lobach.info/some/happy-new-year-2009/</link>
		<comments>http://lobach.info/some/happy-new-year-2009/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 12:10:43 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=117</guid>
		<description><![CDATA[В последний день 2008 года хочу поздравить читателей этого блога с наступающим новым 2009 годом!
Осталось совсем немного времени до полуночи, поэтому буду краток :)
Желаю вам в новом году успехов в профессиональной сфере, роста мастерства, развития ваших проектов и достижения всех поставленных целей! Счастья вам!
С НОВЫМ ГОДОМ!
PS: Оставайтесь, будет интересно ;)
Этот пост без меток.]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/sjFpyHTEpCCHyWyY0_FDu3NpHeE/0/da"><img src="http://feedads.g.doubleclick.net/~a/sjFpyHTEpCCHyWyY0_FDu3NpHeE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/sjFpyHTEpCCHyWyY0_FDu3NpHeE/1/da"><img src="http://feedads.g.doubleclick.net/~a/sjFpyHTEpCCHyWyY0_FDu3NpHeE/1/di" border="0" ismap="true"></img></a></p><p>В последний день 2008 года хочу поздравить читателей этого блога с наступающим новым 2009 годом!</p>
<p>Осталось совсем немного времени до полуночи, поэтому буду краток :)</p>
<p>Желаю вам в новом году успехов в профессиональной сфере, роста мастерства, развития ваших проектов и достижения всех поставленных целей! Счастья вам!</p>
<p><strong>С НОВЫМ ГОДОМ!</strong></p>
<p>PS: Оставайтесь, будет интересно ;)</p>
Этот пост без меток.<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=IP6xRTyL"><img src="http://feeds.feedburner.com/~f/lobach?d=41" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/some/happy-new-year-2009/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Использование компонентов ZendFramework для поддержки нескольких языков</title>
		<link>http://lobach.info/develop/zf/using-zend-framework-language-component/</link>
		<comments>http://lobach.info/develop/zf/using-zend-framework-language-component/#comments</comments>
		<pubDate>Thu, 25 Dec 2008 06:10:31 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=112</guid>
		<description><![CDATA[Недавно на DevZone появился анонс статьи о создании многоязычных сайтов средствами ZendFramework&#160;&#8212; &#171;using Zend Framework Language component. Вопреки сложившейся в последнее время традиции, я не стал переводить заинтересовавшую меня статью. Вместо этого я решил развить реализацию, предложенную автором.

Вначале очень краткий ликбез. Механизм поддержки различных языков в ZendFramework реализована в виде компонента Zend_Translate. Он поддерживает массу [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/fOamgkrGqjY5QmJRsX4RuJUEHQ0/0/da"><img src="http://feedads.g.doubleclick.net/~a/fOamgkrGqjY5QmJRsX4RuJUEHQ0/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/fOamgkrGqjY5QmJRsX4RuJUEHQ0/1/da"><img src="http://feedads.g.doubleclick.net/~a/fOamgkrGqjY5QmJRsX4RuJUEHQ0/1/di" border="0" ismap="true"></img></a></p><p>Недавно на <a href="http://devzone.zend.com/">DevZone</a> появился анонс статьи о создании многоязычных сайтов средствами <a href="http://framework.zend.com/">ZendFramework</a>&nbsp;&mdash; &laquo;<a href="http://www.gsdesign.ro/blog/using-zend-framework-language-component/">using Zend Framework Language component</a>. Вопреки сложившейся в последнее время традиции, я не стал переводить заинтересовавшую меня статью. Вместо этого я решил развить реализацию, предложенную автором.</p>
<p><span id="more-112"></span></p>
<p>Вначале очень краткий ликбез. Механизм поддержки различных языков в <a href="http://framework.zend.com/">ZendFramework</a> реализована в виде компонента <a href="http://framework.zend.com/manual/en/zend.translate.html">Zend_Translate</a>. Он поддерживает массу различных форматов хранения переводов: array, csv, gettext, ini, tbx, tmx, qt, xliff, xmltm. За описаниями особенностей форматов я отправлю в руководство разработчике&nbsp;&mdash; <a href="http://framework.zend.com/manual/en/zend.translate.adapter.html">Adapters for Zend_Translate</a>. Настройка <a href="http://framework.zend.com/manual/en/zend.translate.html">Zend_Translate</a> на тот или иной формат выполняется с помощью подключения соответствующего адаптера. На этом, думаю, с вводной частью я закончу и покажу, как использовать <a href="http://framework.zend.com/manual/en/zend.translate.html">Zend_Translate</a>.</p>
<p>Простейший способ использования компонента заключается в создании экземпляра этого класса в загрузочном файле:</p>
<pre><code name="php">&lt;?php

$translate = new Zend_Translate('gettext',
                                '/path/to/translate.mo',
                                'en');
Zend_Registry::set('Zend_Translate', $translate);</code></pre>
<p>Такое действие даст вам возможность в любом месте приложения получить из реестра экземпляр переводчика и с его помощью получить текст на нужном языке</p>
<p>Теперь давайте посмотрим, что предлагает автор статьи, указанной в начале этой заметки. А он предлагает вместо настройки Zend_Translate в загрузочном файле сделать это с помощью <a href="http://framework.zend.com/manual/en/zend.controller.plugins.html">плагина контроллера</a>. Его вариант я приводить не буду (интересующиеся могут пройти по ссылке и посмотреть самостоятельно), укажу лишь на то, что настройка компонента зашивается намертво в код плагина. Если вы всегда и везде используете одни и те же параметры, то такой вариант вполне вам может подойти. Если же настройки меняются от приложения к приложению, либо если хочется воспользоваться более универсальным решением, то предлагаю посмотреть на мой вариант.</p>
<p>Код плагина приводить не буду&nbsp;&mdash; он доступен по ссылке в конце статьи. Опишу лишь отличия и покажу пример использования.</p>
<p>В отличии от предыдущего варианта, мой вариант достаточно гибко настраивается: плагин может регистрировать в приложении как уже существующий экземпляр Zend_Translate, так и создавать новый экземпляр по переданным в плагин параметрам. Так же можно не регистрировать экземпляр переводчика в реестре, и при этом доступ к нему сохранится через методы плагина. Текущий язык приложения определяется через параметр запроса. По-умолчанию параметр называется <em>lang</em>, но его можно поменять при инициализации плагина</p>
<p>Спецификация конструктора следующая:</p>
<pre><code name="php">public function __construct(array $options = array(), Zend_Translate $translate = null, Zend_Locale $locale = null, $skipRegistry = false)</code></pre>
<p>&lt;</p>
<p>p>Входные параметры:</p>
<ul>
<li>$options&nbsp;&mdash; массив параметров для инициализации экземпляра Zend_Translate. Элементы массива идентичны параметрам конструктора Zend_Translate:
<ul>
<li>adapter&nbsp;&mdash; используемый адаптер</li>
<li>data&nbsp;&mdash; данные для адаптера</li>
<li>locale&nbsp;&mdash; используемая локаль</li>
<li>options&nbsp;&mdash; параметры конфигурации Zend_Translate</li>
<li>langKey&nbsp;&mdash; этот параметр относится уже непосредственно к плагину и определяет название параметра запроса, содержащего указание на запрашиваемый язык</li>
</ul>
</li>
<li>$translate&nbsp;&mdash; экземпляр класса Zend_Translate</li>
<li>$locale&nbsp;&mdash; экземпляр класса Zend_Locale (может потребоваться если нужно указать язык, отличный от указанного в запросе)</li>
</ul>
<p>Вот один из вариантов использования. Допустим, что параметры настройки переводчика хранятся в файле конфигурации приложения:</p>
<pre><code name="php">&lt;?php

$config = new Zend_Config_Ini('/path/to/config.ini');
Zend_Controller_Front::getInstance()-&gt;registerPlugin(new Zeus_Controller_Plugin_Language($config-&gt;translate));</code></pre>
<p>Вот и все! Локаль настроена, переводчик инициализирован и готов к употреблению</p>
<p>Остановлюсь на еще одном моменте. Плагин в результате работы регистрирует экземпляр локали и переводчика в реестре использую стандартные ключи: Zend_Locale и Zend_Translate соответственно. Такое решение, помимо доступности объектов в любом месте приложения, позволяет воспользоваться стандартными помощниками вида и помощниками действий:</p>
<pre><code name="php">$this-&gt;view-&gt;title = $this-&gt;view-&gt;translate('default-register-index-title');</code></pre>
<pre><code name="php">&lt;?php echo $this-&gt;translate('default-register-index-title'); ?&gt;</code></pre>
<p>Код плагина можно взять тут:</p>
<ul>
<li><a href="http://lobach.info/wp-content/uploads/2008/12/zeus.zip">Zeus_Controller_Plugin_Language</a></li>
<li><a href="http://websvn.lobach.info/filedetails.php?repname=PublicCode&#038;path=%2Fblog%2Ftrunk%2FZeus%2FController%2FPlugin%2FLanguage.php">SVN</a></li>
</ul>
<p>Постараюсь ответить на все вопросы и оказать посильную помощь. Поэтому не стесняйтесь и оставляйте свои комментарии. Предложения по усовершенствованию также приветствуются...</p>
<p>P.S.: Вчера вышел ZendFramework 1.7.2. Посмотреть исправления можно по адресу <a href="http://framework.zend.com/issues/secure/views/IssueNavigator.jspa?requestId=10923">http://framework.zend.com/issues/secure/views/IssueNavigator.jspa?requestId=10923</a>. Последний релиз, как всегда, берем <a href="http://framework.zend.com/download/latest/">http://framework.zend.com/download/latest/</a>.</p>
<p>P.P.S.: Хочу порекомендовать блог Романа Настенко &laquo;<a href="http://www.perfectomania.com/">Перфектомания</a>&raquo;. Роман пишет на темы, связанные с разработкой сайтов: юзабилити, проектирование, SMO. Читаю его давно и с интересом.</p>
Этот пост без меток.<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=fnkcHrLl"><img src="http://feeds.feedburner.com/~f/lobach?d=41" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/using-zend-framework-language-component/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Вышел ZendFramework 1.7.1</title>
		<link>http://lobach.info/develop/zf/release-zf-1_7_1/</link>
		<comments>http://lobach.info/develop/zf/release-zf-1_7_1/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 21:08:50 +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=107</guid>
		<description><![CDATA[Не могу не написать о выпуске новой версии ZF. Этот релиз исключительно багфиксовый, посему рекомендуется обновиться.
P.S.: ну и пользуясь случаем, хочу выполнить обещание и порекомендовать обратить внимание на каталог ссылок по теме Zend Framework&#160;&#8212; стоит пробежаться по собранным там ресурсам, можно найти кое-что интересное.

	Tags: news, zend framework
]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/E-ljf_26CotETlhxXcKQpGLPB4g/0/da"><img src="http://feedads.g.doubleclick.net/~a/E-ljf_26CotETlhxXcKQpGLPB4g/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/E-ljf_26CotETlhxXcKQpGLPB4g/1/da"><img src="http://feedads.g.doubleclick.net/~a/E-ljf_26CotETlhxXcKQpGLPB4g/1/di" border="0" ismap="true"></img></a></p><p>Не могу не написать о выпуске новой версии ZF. Этот релиз исключительно багфиксовый, посему рекомендуется обновиться.</p>
<p>P.S.: ну и пользуясь случаем, хочу выполнить обещание и порекомендовать обратить внимание на <a href="http://zendframework.ru/links">каталог ссылок по теме Zend Framework</a>&nbsp;&mdash; стоит пробежаться по собранным там ресурсам, можно найти кое-что интересное.</p>

	Tags: <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 />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=2LX50ix3"><img src="http://feeds.feedburner.com/~f/lobach?d=41" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/release-zf-1_7_1/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Загрузка файлов с Zend_Form_Element_File</title>
		<link>http://lobach.info/develop/zf/file-uploads-with-zend_form_element_file/</link>
		<comments>http://lobach.info/develop/zf/file-uploads-with-zend_form_element_file/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 18:57:47 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[Zend Framework]]></category>

		<category><![CDATA[zend framework]]></category>

		<category><![CDATA[перевод]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=104</guid>
		<description><![CDATA[Роб Ален опубликовал новую заметку в своем блоге&#160;&#8212; File uploads with Zend_Form_Element_File. Пост хоть и не большой, но для новичков полезный. Предлагаю мой перевод этой заметки. Рекомендую обратить особое внимание на первый абзац заключения.

Теперь, когда выпущен Zend Framework 1.7, я решил, что стоит взглянуть на встроенный элемент загрузки файлов&#160;&#8212; Zend_Form_Element_File, и посмотреть как можно его [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/qev9B0tib28lV2TwIMYhOrin51A/0/da"><img src="http://feedads.g.doubleclick.net/~a/qev9B0tib28lV2TwIMYhOrin51A/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/qev9B0tib28lV2TwIMYhOrin51A/1/da"><img src="http://feedads.g.doubleclick.net/~a/qev9B0tib28lV2TwIMYhOrin51A/1/di" border="0" ismap="true"></img></a></p><p><em>Роб Ален опубликовал новую заметку в своем блоге&nbsp;&mdash; <a href="http://akrabat.com/2008/11/29/file-uploads-with-zend_form_element_file/">File uploads with Zend_Form_Element_File</a>. Пост хоть и не большой, но для новичков полезный. Предлагаю мой перевод этой заметки. Рекомендую обратить особое внимание на первый абзац заключения.</em></p>
<p><span id="more-104"></span></p>
<p>Теперь, когда выпущен Zend Framework 1.7, я решил, что стоит взглянуть на встроенный элемент загрузки файлов&nbsp;&mdash; Zend_Form_Element_File, и посмотреть как можно его использовать. Предлагаю пример на базе простейшей формы.</p>
<p>Я решил использовать тот же набор элементов формы, что и <a href="http://akrabat.com/2008/04/07/simple-zend_form-file-upload-example/">ранее</a> с целью демонстрации упрощения разработки.</p>
<p><a href="http://lobach.info/wp-content/uploads/2008/12/zend-form-element-file-example.png"><img src="http://lobach.info/wp-content/uploads/2008/12/zend-form-element-file-example-300x189.png" alt="" title="zend-form-element-file-example" width="300" height="189" class="aligncenter size-medium wp-image-105" /></a></p>
<p>Итак, приступим:</p>
<h3>Форма</h3>
<p>Мы расширим Zend_Form и сохраним полученный класс forms_UploadForm в каталоге application/forms:</p>
<pre><code class="php">&lt;?php

class forms_UploadForm extends Zend_Form
{
    public function __construct($options = null)
    {
        parent::__construct($options);
        $this-&gt;setName('upload');
        $this-&gt;setAttrib('enctype', 'multipart/form-data');

        $description = new Zend_Form_Element_Text('description');
        $description-&gt;setLabel('Description')
                  -&gt;setRequired(true)
                  -&gt;addValidator('NotEmpty');

        $file = new Zend_Form_Element_File('file');
        $file-&gt;setLabel('File')
            -&gt;setDestination(BASE_PATH . '/data/uploads')
            -&gt;setRequired(true);

        $submit = new Zend_Form_Element_Submit('submit');
        $submit-&gt;setLabel('Upload');

        $this-&gt;addElements(array($description, $file, $submit));
    }
}</code></pre>
<p>Как и ранее (<em>прим. пер.: в предыдущей заметке, ссылка на которую была выше</em>), мы задаем имя формы и атрибут enctype для включения механизма загрузки файлов. Сама форма имеет два поля: текстовое поле, названное &laquo;Описание&raquo;, и поле для загрузки файла, названное &laquo;Файл&raquo;, наряду с кнопкой &laquo;Отправить&raquo;. Здесь ничего особо сложного нет.</p>
<p>Элемент Zend_Form_Element_File имеет метод setDestination (), который используется для указания нижележащему (<em>прим. пер.: имеется в виду с точки зрения абстракции</em>) Zend_File_Transfer_Adapter_Http где мы хотим сохранить загруженные файлы. В данном примере мы выбрали каталог data/uploads.</p>
<h3>Контроллер и представление</h3>
<p>Контроллер так же весьма стандартный:</p>
<pre><code class="php">&lt;?php

class IndexController extends Zend_Controller_Action
{
    public function indexAction()
    {
        $this-&gt;view-&gt;headTitle('Home');
        $this-&gt;view-&gt;title = 'Zend_Form_Element_File Example';
        $this-&gt;view-&gt;bodyCopy = "&lt;p&gt;Please fill out this form.&lt;/p&gt;";

        $form = new forms_UploadForm();

        if ($this-&gt;_request-&gt;isPost()) {
            $formData = $this-&gt;_request-&gt;getPost();
            if ($form-&gt;isValid($formData)) {

                // success - do something with the uploaded file
                $uploadedData = $form-&gt;getValues();
                $fullFilePath = $form-&gt;file-&gt;getFileName();

                Zend_Debug::dump($uploadedData, '$uploadedData');
                Zend_Debug::dump($fullFilePath, '$fullFilePath');

                echo "done";
                exit;

            } else {
                $form-&gt;populate($formData);
            }
        }

        $this-&gt;view-&gt;form = $form;
    }
}</code></pre>
<p>Представление views/scripts/index.phtml абсолютно тривиально:</p>
<pre><code class="php">&lt;h1&gt;&lt;?= $this-&gt;title; ?&gt;&lt;/h1&gt;
&lt;?= $this-&gt;bodyCopy; ?&gt;
&lt;?= $this-&gt;form; ?&gt;</code></pre>
<p>Если форма успешно прошла валидацию, массив $uploadedData будет содержать значения полей формы вместе с именем загруженного файла. Обратите внимание, что имя файла не полное. Если вам нужен весь путь к файлу, то используйте метод getFileName () файлового элемента.</p>
<h3>Заключение</h3>
<p>Это все, что нужно для построения простейшей формы загрузки файлов. Однако есть еще несколько настолько важных ошибок в компоненте, что имеет смысл дождаться версии 1.7.2. К примеру, валидатор Count не всегда работает так, как от него ожидаешь, а getValues () и receive () все еще не достаточно умны, чтобы вызывать move_uploaded_file () только один раз.</p>
<p>Как обычно, вот zip-файл проекта, созданный мной для тестирования: <a href="http://akrabat.com/wp-content/uploads/2008/Zend_Form_Element_File_Example.zip">Zend_Form_Element_File_Example.zip</a> (включает Zend Framework (снепшот ветки release-1.7)&nbsp;&mdash; именно поэтому он более 3,9Мб).</p>

	Tags: <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=Sgv6OdEF"><img src="http://feeds.feedburner.com/~f/lobach?d=41" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/file-uploads-with-zend_form_element_file/feed/</wfw:commentRss>
		</item>
		<item>
		<title>В закладки #1</title>
		<link>http://lobach.info/some/bookmarks-1/</link>
		<comments>http://lobach.info/some/bookmarks-1/#comments</comments>
		<pubDate>Thu, 13 Nov 2008 19:40:30 +0000</pubDate>
		<dc:creator>Лобач Олег</dc:creator>
		
		<category><![CDATA[разное]]></category>

		<guid isPermaLink="false">http://lobach.info/?p=96</guid>
		<description><![CDATA[Сегодня хочу порекомендовать к прочтению пару блогов.
Первым представлю &#171;Zend Framework по&#8211;русски&#187;&#160;&#8212; полностью посвященный замечательному php-фреймворку. Сергей Митрошин, автор этого блога, публикует 3-4 весьма интересных статьи в месяц. Из последнего рекомендую к прочтению:

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

Продолжая обсуждение помощников действий Zend Framework (мой перевод: Использование помощников действий,&#160;&#8212; прим. пер.), давайте поговорим о перехватчиках в них.
Перехватчики – это особенность помощников действий, которая позволяет вам выполнить некий код в определенных точках цикла диспетчеризации. Собственно, для помощников действий [...]]]></description>
			<content:encoded><![CDATA[
<p><a href="http://feedads.g.doubleclick.net/~a/o5_bD58ogivQL2f2eNapr59ASbU/0/da"><img src="http://feedads.g.doubleclick.net/~a/o5_bD58ogivQL2f2eNapr59ASbU/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/o5_bD58ogivQL2f2eNapr59ASbU/1/da"><img src="http://feedads.g.doubleclick.net/~a/o5_bD58ogivQL2f2eNapr59ASbU/1/di" border="0" ismap="true"></img></a></p><p><em>Вчера <a href="http://akrabat.com/">Роб Ален</a> опубликовал продолжение заметки про написание помощников действий в Zend Framework-е. Представляю перевод этой заметки.</em><br />
<span id="more-91"></span></p>
<p>Продолжая обсуждение <a href="http://akrabat.com/2008/10/31/using-action-helpers-in-zend-framework/">помощников действий Zend Framework</a> (мой перевод: <a href="http://lobach.info/develop/zf/using-action-helpers/">Использование помощников действий</a>,&nbsp;&mdash; прим. пер.), давайте поговорим о перехватчиках в них.</p>
<p>Перехватчики – это особенность помощников действий, которая позволяет вам выполнить некий код в определенных точках цикла диспетчеризации. Собственно, для помощников действий доступно всего два типа перехватчиков:</p>
<ul>
<li>preDispatch (): вызывается перед запуском действия</li>
<li>postDispatch (): вызывается после завершения работы действия</li>
</ul>
<p>Это позволяет вам быть уверенным в том, что некоторая функциональность всегда будет выполнена при каждом запросе. Рассмотрим простой пример вывода случайной цитаты в «подвале» сайта.</p>
<p>Мы начнем с помощника действия в нашем каталоге <strong>controllers/helpers</strong>, названного <em>Quote</em>:</p>
<pre><code class="php">&lt;?php

class Zend_Controller_Action_Helper_Quote extends Zend_Controller_Action_Helper_Abstract
{
    function preDispatch()
    {
        $view = $this-&gt;getActionController()-&gt;view;
        $view-&gt;footerQuote = $this-&gt;getQuote();
    }
    function getQuote()
    {
        $quotes[] = 'I want to run, I want to hide, I want to tear down the walls';
        $quotes[] = 'One man come in the name of love, One man come and go';
        return $quotes[rand(0, count($quotes)-1)];
    }
}</code></pre>
<p>Метод <strong><code>preDispatch()</code></strong> получает объект представления из контроллера действия и присваивает случайную цитату свойству footerQuote этого объекта.</p>
<p>Мы должны сказать брокеру помощников, что мы хотим активировать этот перехватчик. Для этого в дополнение к вызову <strong><code>addPath()</code></strong>, наш загрузочный файл нужно дополнить вызовом <strong><code>addHelper()</code></strong>. После этого загрузчик станет содержать код:</p>
<pre><code class="php">// Action Helpers
    Zend_Controller_Action_HelperBroker::addPath(
        APPLICATION_PATH .'/controllers/helpers');
    $hooks = Zend_Controller_Action_HelperBroker::getStaticHelper('Quote');
    Zend_Controller_Action_HelperBroker::addHelper($hooks);</code></pre>
<p>Пока мы используем <strong><code>addPath()</code></strong> для указания брокеру помощников где искать помощники действий, мы можем использовать <strong><code>getStaticHelper()</code></strong> в качестве простого способа инстанцирования класса без <strong><code>require()</code></strong> и последующего вызова <strong><code>new</code></strong>. Затем мы можем зарегистрировать его с помощью помощника брокера использовав <strong><code>addHelper()</code></strong>.</p>
<p>Так как цитата отображается в подвале сайта, требуется внести изменения в HTML-код в <strong><code>layout.phtml</code></strong>:</p>
<pre><code class="php">&lt;div id=&quot;footer&quot;&gt;
    &lt;div id=&quot;quote&quot;&gt;
        &lt;?php echo $this-&gt;footerQuote; ?&gt;
    &lt;/div&gt;
&lt;/div&gt;</code></pre>
<p>Вот и все&nbsp;&mdash; не сложно, правда?</p>

	Tags: <a href="http://lobach.info/tag/php/" title="php" rel="tag">php</a>, <a href="http://lobach.info/tag/zend-framework/" title="zend framework" rel="tag">zend framework</a>, <a href="http://lobach.info/tag/perevod/" title="перевод" rel="tag">перевод</a><br />
<div class="feedflare">
<a href="http://feeds.feedburner.com/~f/lobach?a=b30SNsol"><img src="http://feeds.feedburner.com/~f/lobach?d=41" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://lobach.info/develop/zf/hooks-in-action-helpers/feed/</wfw:commentRss>
		</item>
	</channel>
</rss><!-- Dynamic page generated in 2.081 seconds. --><!-- Cached page generated by WP-Super-Cache on 2009-07-10 09:41:18 -->
