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

<channel>
	<title>hudson@work &#187; howto</title>
	<atom:link href="http://hudson.su/tag/howto/feed/" rel="self" type="application/rss+xml" />
	<link>http://hudson.su</link>
	<description>статьи о web-разработке, менеджменте IT проектов и контроле качества</description>
	<lastBuildDate>Fri, 20 Jan 2012 13:15:39 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Random MySQL date</title>
		<link>http://hudson.su/2011/08/31/random-mysql-date/</link>
		<comments>http://hudson.su/2011/08/31/random-mysql-date/#comments</comments>
		<pubDate>Wed, 31 Aug 2011 07:00:44 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1953</guid>
		<description><![CDATA[В этой статье рассмотрим несколько вариантов получения случайной даты в MySQL. Для чего это нужно? Ну к примеру для генерации фикстур и прочих тестовых данных, чтобы были похожи на реальные. Самый простой вариант &#8211; совершенно случайная дата: mysql&#62; SELECT FROM_UNIXTIME&#40;RAND&#40;&#41; * 2147483647&#41; AS `rand`; +---------------------+ &#124; rand &#124; +---------------------+ &#124; 1998-04-01 21:42:48 &#124; +---------------------+ 1 [...]]]></description>
			<content:encoded><![CDATA[<p>В этой статье рассмотрим несколько вариантов получения случайной даты в MySQL. Для чего это нужно? Ну к примеру для генерации фикстур и прочих тестовых данных, чтобы были похожи на реальные.</p>
<p><span id="more-1953"></span><br />
Самый простой вариант &#8211; совершенно случайная дата:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> FROM_UNIXTIME<span style="color: #66cc66;">&#40;</span>RAND<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">2147483647</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`rand`</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> rand                <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">1998</span><span style="color: #66cc66;">-</span>04<span style="color: #66cc66;">-</span>01 <span style="color: #cc66cc;">21</span>:<span style="color: #cc66cc;">42</span>:<span style="color: #cc66cc;">48</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Попробуем ещё раз?</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> FROM_UNIXTIME<span style="color: #66cc66;">&#40;</span>RAND<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #cc66cc;">2147483647</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`rand`</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> rand                <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">2028</span><span style="color: #66cc66;">-</span>03<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">21</span> <span style="color: #cc66cc;">22</span>:<span style="color: #cc66cc;">44</span>:<span style="color: #cc66cc;">43</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Окей, зачем умножать на 2147483647? (ещё не догадались?! <img src='http://hudson.su/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Ну тут всё просто, как 2 копейки: 2147483647 это самый большой SIGNED INT32 и по совместительству <del>писарчук</del> самый последний распоследний таймштамп. Проверяется это так (ежели не верите):</p>
<p>Так ещё работает:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> FROM_UNIXTIME<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2147483647</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`rand`</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> rand                <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">2038</span><span style="color: #66cc66;">-</span>01<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">18</span> <span style="color: #cc66cc;">19</span>:<span style="color: #cc66cc;">14</span>:07 <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>А если добавим хоть секундочку (214748364<strong>8</strong>) &#8211; уже работать не будет:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> FROM_UNIXTIME<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">2147483648</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`rand`</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------+</span>
<span style="color: #66cc66;">|</span> rand <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------+</span>
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.01</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Таким образом, функция <code>RAND()</code> даёт нам случайное значение в диапазоне от 0 до 1 и умножая его на максимально возможный таймштамп мы получим случайную дату в диапазоне от 1969 до 2038 гг. Но что же нам делать, если требуется дата в некотором строго определённом периоде?</p>
<h3>Случайная дата 2011го года</h3>
<p>Получается вот так:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> FROM_UNIXTIME<span style="color: #66cc66;">&#40;</span>RAND<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1325275200</span> <span style="color: #66cc66;">-</span> <span style="color: #cc66cc;">1293825600</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1293825600</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`the_date`</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> the_date            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">2011</span><span style="color: #66cc66;">-</span>04<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">27</span> 05:01:04 <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<p>Так круто, что хочется попробовать ещё раз <img src='http://hudson.su/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span> FROM_UNIXTIME<span style="color: #66cc66;">&#40;</span>RAND<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1325275200</span> <span style="color: #66cc66;">-</span> <span style="color: #cc66cc;">1293825600</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span> <span style="color: #cc66cc;">1293825600</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #ff0000;">`the_date`</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> the_date            <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">2011</span><span style="color: #66cc66;">-</span>08<span style="color: #66cc66;">-</span><span style="color: #cc66cc;">15</span> <span style="color: #cc66cc;">12</span>:<span style="color: #cc66cc;">54</span>:<span style="color: #cc66cc;">51</span> <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">---------------------+</span>
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.01</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<h3>А чо энто было то?</h3>
<p>Когда нам нужно зафиксировать диапазон, между <code>start</code> и <code>end</code> датами, и мы имеем случайное значение от 0 до 1 &#8211; требуется вычесть из конечного таймштампа начальный <code>end - start</code>, что даст искомый интервал в секундах и &#8220;двинуть&#8221; интервал в начало периода. Т.о. наша супер-формула выглядит вот так: </p>
<p><code>(end - start) * RAND + start</code></p>
<p>Ну и для того чтобы высвободить вам побольше времени для Angry Birds (или чего-то подобного), а также не морщить лоб, пытаясь в уме переводить DATETIME в TIMESTAMP &#8211; мы воспользуемся функцией UNIX_TIMESTAMP:</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;">mysql<span style="color: #66cc66;">&gt;</span> <span style="color: #993333; font-weight: bold;">SELECT</span>
    <span style="color: #66cc66;">-&gt;</span> UNIX_TIMESTAMP<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'2011-01-01'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">START</span><span style="color: #66cc66;">,</span>
    <span style="color: #66cc66;">-&gt;</span> UNIX_TIMESTAMP<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'2011-12-31'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> <span style="color: #993333; font-weight: bold;">END</span>;
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------------+------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">START</span>      <span style="color: #66cc66;">|</span> <span style="color: #993333; font-weight: bold;">END</span>        <span style="color: #66cc66;">|</span>
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------------+------------+</span>
<span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">1293825600</span> <span style="color: #66cc66;">|</span> <span style="color: #cc66cc;">1325275200</span> <span style="color: #66cc66;">|</span> 	
<span style="color: #66cc66;">+</span><span style="color: #808080; font-style: italic;">------------+------------+</span>
<span style="color: #cc66cc;">1</span> <span style="color: #993333; font-weight: bold;">ROW</span> <span style="color: #993333; font-weight: bold;">IN</span> <span style="color: #993333; font-weight: bold;">SET</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0.00</span> sec<span style="color: #66cc66;">&#41;</span></pre></div></div>

<blockquote><p>Оригинал для перевода взял тут: <a href="http://www.phpied.com/random-mysql-date/" target="_blank">http://www.phpied.com/random-mysql-date/</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/08/31/random-mysql-date/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Silex &#8211; просто добавь воды?!</title>
		<link>http://hudson.su/2011/08/30/silex-prosto-dobav-vody/</link>
		<comments>http://hudson.su/2011/08/30/silex-prosto-dobav-vody/#comments</comments>
		<pubDate>Tue, 30 Aug 2011 14:41:02 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[Silex]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[Symfony2 components]]></category>
		<category><![CDATA[Twig]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=2040</guid>
		<description><![CDATA[Мимоходом потребовалось портировать один &#8220;оглобельный&#8221; сайт на новую платформу. В принципе самое важное там было &#8211; это смена дизайна. HTML + SSI? Но сайт мультиязычный, зараза. Немного скрипта таки придется применить. В качестве эксперимента портируем 5ти язычный сайт на Silex (который суть есть обезжиренный Symfony2). Note: english version of this article published on the SymfonyGuru [...]]]></description>
			<content:encoded><![CDATA[<p>Мимоходом потребовалось портировать один &#8220;оглобельный&#8221; сайт на новую платформу. В принципе самое важное там было &#8211; это смена дизайна. HTML + SSI? Но сайт мультиязычный, зараза. Немного скрипта таки придется применить.</p>
<p>В качестве эксперимента портируем 5ти язычный сайт на <a title="silex" href="http://silex-project.org/" target="_blank">Silex</a> (который суть есть обезжиренный Symfony2).</p>
<p><strong>Note: english version of this article <a href="http://symfony-gu.ru/blog/en/silex-just-add-water/" target="_blank">published on the SymfonyGuru site</a>.</strong></p>
<p><span id="more-2040"></span>Silex представляет собой PHAR архив. Более подробно можете почитать на оф. сайте проекта или же покурить мануал на php.net.</p>
<p>Мы же перво-наперво создаем .htaccess:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;"># .htaccess
&nbsp;
    Options -MultiViews
    RewriteEngine On
    #RewriteBase /path/to/app
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^(.*)$ index.php [QSA,L]</pre></div></div>

<p>Адепты оптимизации могут сразу внести данные директивы в конфигурацию виртуального хоста (и установить AllowOverride в None).</p>
<p>Потом создадим мультиконтроллер index.php (здесь и далее всё располагается внутри docroot вебсервера):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// index.php</span>
<span style="color: #009933; font-style: italic;">/**
 *
 * @package
 * @author Dmitry Bykadorov &lt;dmitry.bykadorov@gmail.com&gt;
 * @version SVN: $Id: $
 */</span>
&nbsp;
<span style="color: #b1b100;">require_once</span> <span style="color: #0000ff;">'lib/silex.phar'</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Init</span>
<span style="color: #000088;">$app</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Silex\Application<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Debug</span>
<span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'debug'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// ... код приложения будет где-то здесь</span>
&nbsp;
<span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">run</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Дальше начинается самое весёлое. В качестве шаблонов будем использовать <a title="twig" href="http://twig-project.org/" target="_blank">Twig</a>. В качестве базиса для поддержки мультиязычности будем использовать <a href="http://silex-project.org/doc/extensions/translation.html" target="_blank">Translation component</a> из Symfony2. И то и другое позиционируется как расширения Silex, однако же подключаются они по разному.</p>
<p>Инициализацию компонент будем производить в before методе (судя по всему аналог preExecute модуля symfony 1.4). Сначала twig:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// index.php</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Before action
 */</span>
<span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">before</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$app</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// Registering Twig</span>
    <span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">register</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Silex\Extension\TwigExtension<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'twig.path'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/resources/views'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// шаблоны будут располагаться в /resources/views (относительно docroot)</span>
        <span style="color: #0000ff;">'twig.class_path'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/lib/vendor/twig/lib'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// сам Twig будет располагаться тут (относительно docroot): /lib/vendor/twig/lib</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Действия (actions) как и before будут сплошь замыкания (closures). Прикольно, да? )</p>
<p>Ну да, Twig инициализировали, но будьте также добры первый раз добавить &#8220;воды&#8221; в наш <del>yupi</del> silex: развернуть Twig в /lib/vendor/twig (можно скачать прямо с сайта). Получится что-то такое:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/lib
    /vendor
        /twig
            /lib
                /Twig
                    /Error
                    /Extension
                    /...</pre></div></div>

<p>Теперь можно сделать индекс-контроллер, а также его шаблон.</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// index.php</span>
<span style="color: #009933; font-style: italic;">/**
 * Root
 */</span>
<span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$app</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/en/about&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// если / - по умолчанию открываем /en/about</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/{locale}'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$app</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$locale</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'locale'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/<span style="color: #006699; font-weight: bold;">{$locale}</span>/about&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// если /{locale} - по умолчанию открываем /{locale}/about</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/{locale}/'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$app</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$locale</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'locale'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;/<span style="color: #006699; font-weight: bold;">{$locale}</span>/about&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// если /{locale}/ - по умолчанию открываем /{locale}/about</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'homepage'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>У нашего сайта homepage по сути это about &#8211; отсюда эти три действия. Метод $app-&gt;get(&#8216;/&#8217; &#8230; ) &#8211; обслуживает GET / и так далее. В итоге все редиректится на about (которого у нас еще нет). Но пожалуй нам нужно сначала инициализировать Translation extension &#8211; возвращаемся в метод $app-&gt;before().</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// index.php</span>
<span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">before</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$app</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// ... инициализация Twig</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Определяем локаль</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$locale</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'locale'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'locale'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$locale</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'locale'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'en'</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Регистрируем Translation</span>
    <span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">register</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Silex\Extension\TranslationExtension<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'locale'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$locale</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// локаль</span>
        <span style="color: #0000ff;">'locale_fallback'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'en'</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// локаль по умолчанию</span>
        <span style="color: #0000ff;">'translation.class_path'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/lib/vendor/symfony/src'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #666666; font-style: italic;">// где искать классы компонента</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Файлы переводов (будут в YAML формате)</span>
    <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'translator.messages'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'en'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/resources/locales/en.yml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'de'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/resources/locales/de.yml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'hu'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/resources/locales/hu.yml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'ru'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/resources/locales/ru.yml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'sk'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">realpath</span><span style="color: #009900;">&#40;</span>__DIR__<span style="color: #339933;">.</span><span style="color: #0000ff;">'/resources/locales/sk.yml'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// Так как выбрали YAML то и лоадер не забудьте инициализировать</span>
    <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'translator.loader'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Symfony\Component\Translation\Loader\YamlFileLoader<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// Ну и напоследок инициализируем Twig translation extension (таг {% trans %} и фильтр | trans)</span>
    <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'twig'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">addExtension</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> Symfony\Bridge\Twig\Extension\TranslationExtension<span style="color: #009900;">&#40;</span><span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'translator'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Инициализировали? Фигушки. Теперь надо не просто добавить воды&#8230; а лить её как из ведра. Собственно создатели рекомендуют тупо скопировать библиотеки Symfony2 из стандартной дистрибьюции к нам в проект (нефигово так &#8220;воды налить&#8221;, да?!). На самом деле компонент для задачи больше пока не нужно, поэтому в конце я скажу что именно из Symfony2 можно будет оставить, остальное можно смело удалять. Пока же получится что-то типа:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/lib
    /vendor
        /symfony
            /src
                /Symfony
                    /Bridge
                        / ...
                    /Bundle
                        / ...
                    /Component
                        / ...</pre></div></div>

<p>Добавляем about действие:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// index.php</span>
<span style="color: #009933; font-style: italic;">/**
 * About
 */</span>
<span style="color: #000088;">$app</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/{locale}/about'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">use</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$app</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'twig'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'about.twig'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'locale'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$app</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'request'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'locale'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
    <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">bind</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'about'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>В соответствии с нашими настройками, действие about рендерит шаблон /resources/views/about.twig. Но для начала, пожалуй, создадим layout. Он может выглядеть как-то так:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;!--</span> <span style="color: #339933;">/</span>resources<span style="color: #339933;">/</span>views<span style="color: #339933;">/</span>layout<span style="color: #339933;">.</span>twig <span style="color: #339933;">--&gt;</span>
<span style="color: #009900;">&#123;</span><span style="color: #339933;">%</span> block content <span style="color: #339933;">%</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#123;</span><span style="color: #339933;">%</span> endblock <span style="color: #339933;">%</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Ну и какой-то /resources/views/about.twig, который экстендит layout:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #339933;">&lt;!--</span> <span style="color: #339933;">/</span>resources<span style="color: #339933;">/</span>views<span style="color: #339933;">/</span>about<span style="color: #339933;">.</span>twig <span style="color: #339933;">--&gt;</span>
<span style="color: #009900;">&#123;</span><span style="color: #339933;">%</span> <span style="color: #000000; font-weight: bold;">extends</span> <span style="color: #0000ff;">&quot;layout.twig&quot;</span> <span style="color: #339933;">%</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#123;</span><span style="color: #339933;">%</span> block pageTitle <span style="color: #339933;">%</span><span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">'page.about.title'</span> <span style="color: #339933;">|</span> trans <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span><span style="color: #339933;">%</span> endblock <span style="color: #339933;">%</span><span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#123;</span><span style="color: #339933;">%</span> block content <span style="color: #339933;">%</span><span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#123;</span> <span style="color: #0000ff;">'page.about.title'</span> <span style="color: #339933;">|</span> trans <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#123;</span><span style="color: #339933;">%</span> endblock <span style="color: #339933;">%</span><span style="color: #009900;">&#125;</span></pre></div></div>

<p>Обратите внимание, что здесь у нас уже используется и Twig и Translation &#8211; собственно у нас появилась первая фраза для файла с переводами, поэтому создадим его для языка по-умолчанию (fallback locale дает нам возможность сначала заполнить файл для базового языка и после скопировать его и перевести на другие языки):</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;"># /resources/locales/en.yml
page.about.title: About Us</pre></div></div>

<p>Дальше уже дело техники. Создаем изменяемый контент для различных языков или берём его из базы данных (для этого надо будет дополнительно подключить Doctrine2), заполняем файлы переводов токенами, пишем нужные GET/POST методы (а также любые другие &#8211; Silex их поддерживает)&#8230;</p>
<p>Напоследок, как обещал, сообщаю структуру Symfony-директории в моем случае:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">/Symfony
    /Bridge
        /Twig
    /Bundle
        /TwigBundle
    /Component
        /Config
        /Translation
        /Yaml</pre></div></div>

<p>Это минимально необходимый набор (кроме Twig и Swiftmailer (опционально)) для комфортного создания небольшого сайтика без работы с базой данных.</p>
<blockquote><p><strong>Заключение</strong>: собственно зачем эта статья &#8211; немного обобщить мой опыт, полученный в ходе создания маленького, но с небольшими наворотами (5 языковых версий) сайта, который на чистом HTML делать геморно (много copy/paste, SSI с мультиязычностью слабо помог) а на чистом PHP &#8220;некошерно&#8221;. Опыт показал, что Silex для подобных работ использовать вполне можно, но вот метод &#8220;<em>добавь воды (<strong>Twig</strong>), ещё воды (<strong>Swiftmailer</strong>), а потом и вовсе весь <strong>Symfony2</strong> загрузи в Vendor</em>&#8221; не совсем удобен, да и маленький сайтик по объему ресурсов и кода вполне себе быстро расползается как тесто на дрожжах. <em>И чем же Silex удобнее Symfony2?</em> &#8211; спросите вы. На мой взгляд он удобнее прежде всего конфигурированием (вернее отсутствием множества конфигурационных файлов Symfony2) &#8211; добавляем Twig и у нас в руках уже неплохой инструмент для создания сайта с layout, шаблонами, без copy/paste (ага, размечтался&#8230;). В теории вся мощь <del>солнца</del> симфони2 у нас в руках (возможно даже пакеты-bundles). Кроме того в Silex встроена возможность <a href="http://silex-project.org/doc/usage.html#reusing-applications" target="_blank">повторного использования кода приложений</a>, да и чем чёрт не шутит &#8211; портировать потом на Symfony2 будет проще ))</p></blockquote>
<blockquote><p><strong>Домашнее задание</strong>: подключить расширение Twig для маршрутизатора и использовать хелпер path() совместно с named routes )</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/08/30/silex-prosto-dobav-vody/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Скрипт для бэкапа mysql баз</title>
		<link>http://hudson.su/2011/03/03/mysql-backup-script/</link>
		<comments>http://hudson.su/2011/03/03/mysql-backup-script/#comments</comments>
		<pubDate>Thu, 03 Mar 2011 16:14:43 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[backup]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1821</guid>
		<description><![CDATA[Написал для себя простенький скрипт (linux bash) для бэкапа всех баз на одном сервере. Его отличительные особенности: Наличие списка исключений (т.е. бэкапим все кроме&#8230;) Получение списка всех БД из MySQL (не надо добавлять вновь созданные базы к бекапу) Создание директории под бэкап вида &#8220;&#8230;/YYYY/mm/dd/HH-MM/&#8221; Бэкап каждой базы в отдельный файл вида &#8220;YYYY-mm-dd.HH-MM.databasename.backup.sql&#8221; (mysqldump бэкапит все [...]]]></description>
			<content:encoded><![CDATA[<p>Написал для себя простенький скрипт (linux bash) для бэкапа всех баз на одном сервере. Его отличительные особенности:</p>
<ul>
<li>Наличие списка исключений (т.е. бэкапим все кроме&#8230;)</li>
<li>Получение списка всех БД из MySQL (не надо добавлять вновь созданные базы к бекапу)</li>
<li>Создание директории под бэкап вида &#8220;&#8230;/YYYY/mm/dd/HH-MM/&#8221;</li>
<li>Бэкап каждой базы в отдельный файл вида &#8220;YYYY-mm-dd.HH-MM.databasename.backup.sql&#8221; (mysqldump бэкапит все в один файл)</li>
<li>Архивирование бэкапа в тарбол</li>
<li>Зачистка .sql</li>
</ul>
<p>Собственно к написанию скрипта меня сподвигло именно то что mysqldump бэкапит все что ему сказано в один файл (если требуется восстановить одну базу, то попробуй ее выцарапай из общего дампа&#8230;), а создавать отдельную строку для бэкапа всякой новой БД геморно (об этом как минимум надо вспомнить!).</p>
<p>В общем если интересно &#8211; прошу под кат:</p>
<p><span id="more-1821"></span><br />
Собственно сам скрипт</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #666666; font-style: italic;">##</span>
<span style="color: #666666; font-style: italic;"># MySQL backup utility</span>
<span style="color: #666666; font-style: italic;"># @author dmitry.bykadorov@gmail.com</span>
<span style="color: #666666; font-style: italic;">##</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># current date</span>
<span style="color: #007800;">DATE</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>Y-<span style="color: #000000; font-weight: bold;">%</span>M-<span style="color: #000000; font-weight: bold;">%</span>d<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># y/m/d/h/m separately</span>
<span style="color: #007800;">YEAR</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>Y<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">MONTH</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>m<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">DAY</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>d<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">HOURS</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>H<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">MINUTES</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">date</span> +<span style="color: #000000; font-weight: bold;">%</span>M<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># database credentials</span>
<span style="color: #007800;">DBUSER</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">DBPASS</span>=<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #007800;">DBHOST</span>=<span style="color: #ff0000;">&quot;&quot;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># create list of databases</span>
mysql <span style="color: #660033;">-h</span> <span style="color: #007800;">$DBHOST</span> <span style="color: #660033;">-u</span> <span style="color: #007800;">$DBUSER</span> -p<span style="color: #007800;">$DBPASS</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;show databases;&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list
&nbsp;
<span style="color: #666666; font-style: italic;"># create backup dir (e.g. ../2011/01/01/04-00)</span>
<span style="color: #007800;">BACKUP_DIR</span>=<span style="color: #000000; font-weight: bold;">/</span>home<span style="color: #000000; font-weight: bold;">/</span>backups<span style="color: #000000; font-weight: bold;">/</span>mysql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$YEAR</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$MONTH</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$DAY</span><span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HOURS</span>-<span style="color: #007800;">$MINUTES</span>
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">--parents</span> <span style="color: #660033;">--verbose</span> <span style="color: #007800;">$BACKUP_DIR</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># excludes list (Database is a part of SHOW DATABASES output)</span>
<span style="color: #007800;">EXCLUDES</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #ff0000;">'Database'</span> <span style="color: #ff0000;">'information_schema'</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #007800;">NUM_EXCLUDES</span>=<span style="color: #800000;">${#EXCLUDES[@]}</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> database <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #007800;">skip</span>=<span style="color: #000000;">0</span>
&nbsp;
  <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">count</span>=<span style="color: #000000;">0</span>
  <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$count</span> <span style="color: #660033;">-lt</span> <span style="color: #007800;">$NUM_EXCLUDES</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #666666; font-style: italic;"># check if this name in excludes list</span>
    <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$database</span>&quot;</span> = <span style="color: #800000;">${EXCLUDES[$count]}</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
      <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">skip</span>=<span style="color: #000000;">1</span>
    <span style="color: #000000; font-weight: bold;">fi</span>
    <span style="color: #7a0874; font-weight: bold;">let</span> <span style="color: #007800;">count</span>=<span style="color: #007800;">$count</span>+<span style="color: #000000;">1</span>
  <span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$skip</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> ; <span style="color: #000000; font-weight: bold;">then</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;++ <span style="color: #007800;">$database</span>&quot;</span>
    <span style="color: #666666; font-style: italic;"># now we can backup current database</span>
    <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #007800;">$BACKUP_DIR</span>
    <span style="color: #007800;">backup_name</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$YEAR</span>-<span style="color: #007800;">$MONTH</span>-<span style="color: #007800;">$DAY</span>.<span style="color: #007800;">$HOURS</span>-<span style="color: #007800;">$MINUTES</span>.<span style="color: #007800;">$database</span>.backup.sql&quot;</span>
    <span style="color: #007800;">backup_tarball_name</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>.tar.gz&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>mysqldump <span style="color: #660033;">-h</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBHOST</span>&quot;</span> <span style="color: #660033;">--databases</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$database</span>&quot;</span> <span style="color: #660033;">-u</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBUSER</span>&quot;</span> <span style="color: #660033;">--password</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$DBPASS</span>&quot;</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   backup <span style="color: #007800;">$backup_name</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-zcf</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_tarball_name</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   compress <span style="color: #007800;">$backup_tarball_name</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$backup_name</span>&quot;</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;   cleanup <span style="color: #007800;">$backup_name</span>&quot;</span>
  <span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">`/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>databases.list<span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;done!&quot;</span></pre></div></div>

<p>Можете его свободно:</p>
<ul>
<li>использовать (никаких гарантий я вам конечно же не даю &#8211; на свой страх и риск )))</li>
<li>модифицировать (например добавить выгрузку бэкапа на другой сервер или на Amazon S3 )))</li>
<li>критиковать ))</li>
</ul>
<p>P.S. Если таки будете использовать &#8211; не забудьте подставить ваши mysql credentials ))</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2011/03/03/mysql-backup-script/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Symfony: прячем фильтры в админ-генераторе</title>
		<link>http://hudson.su/2010/09/09/symfony-hide-filters-in-admin-generator/</link>
		<comments>http://hudson.su/2010/09/09/symfony-hide-filters-in-admin-generator/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 12:08:55 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[hints]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1602</guid>
		<description><![CDATA[Фильтры в админ-генераторе штука хорошая, но всегда думаешь куда бы их пристроить на странице. Если полей в модели больше чем 3-5 это становится проблемой. Предлагаю вашему вниманию небольшой трюк по этому поводу. Нам потребуется JQuery, любимый редактор и немного терпения: Для начала посмотрим как выглядит DOM для блока админ-генератора: И он же &#8220;вживую&#8221;: Что мы [...]]]></description>
			<content:encoded><![CDATA[<p>Фильтры в админ-генераторе штука хорошая, но всегда думаешь куда бы их пристроить на странице. Если полей в модели больше чем 3-5 это становится проблемой. Предлагаю вашему вниманию небольшой трюк по этому поводу. Нам потребуется JQuery, любимый редактор и немного терпения:</p>
<p><span id="more-1602"></span></p>
<p>Для начала посмотрим как выглядит DOM для блока админ-генератора:</p>
<p><a rel="lightbox" href="http://hudson.su/files/2010/09/admingeneratorarticle.png"><img class="alignnone size-medium wp-image-1603" src="http://hudson.su/files/2010/09/admingeneratorarticle-300x73.png" alt="" width="300" height="73" /></a></p>
<p>И он же &#8220;вживую&#8221;:</p>
<p><a rel="lightbox" href="http://hudson.su/files/2010/09/admingeneratorarticle02.png"><img class="alignnone size-medium wp-image-1607" src="http://hudson.su/files/2010/09/admingeneratorarticle02-300x112.png" alt="" width="300" height="112" /></a></p>
<p>Что мы хотим с этим сделать?</p>
<ul>
<li>Спрятать фильтры для этого и всех остальных админ-генераторов.</li>
<li>Для отображения заиметь ссылку или кнопку.</li>
<li>Потратить как можно меньше времени на это.</li>
</ul>
<p>Как мы это будем делать? Для начала скачаем и подключим к проекту JQuery. Я это сделаю при помощи плагина sfJqueryReloadedPlugin. Вы же можете поступать как вам нравится.</p>
<p>Далее создадим ссылку, кликая на которую можно будет показать/скрыть фильтры:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// прячем/показываем фильтры</span>
  <span style="color: #003366; font-weight: bold;">var</span> filter_show_hide <span style="color: #339933;">=</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;a&gt;'</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// создаем DOM элемент</span>
    .<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'href'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'#'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">attr</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'id'</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'filter-show-hide'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'toggle filters ∇'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'fontWeight'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'bold'</span><span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// немного стиля</span>
    .<span style="color: #660066;">css</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'margin'</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">'5px'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">click</span><span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
      $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#sf_admin_bar'</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">toggle</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span> $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#filter-show-hide&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #3366CC;">'toggle filters ∇'</span> <span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// изменяем текст ссылки</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#filter-show-hide&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'toggle filters Δ'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">else</span>
        $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;#filter-show-hide&quot;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">html</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;toggle filters ∇&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Обратите внимание на то что мы меняем html тело ссылки &#8211; дельта (свернуть) , набла (развернуть). Можно использовать картинки, стрелочки и все что вам нравится.</p>
<p>После этого нам остается добавить нашу кнопку-ссылку над фильтрами и скрыть фильтр по умолчанию:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">jQuery<span style="color: #009900;">&#40;</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #006600; font-style: italic;">// ...</span>
  $<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'#sf_admin_bar'</span><span style="color: #009900;">&#41;</span>
    .<span style="color: #660066;">before</span><span style="color: #009900;">&#40;</span>filter_show_hide<span style="color: #009900;">&#41;</span> <span style="color: #006600; font-style: italic;">// размещаем ссылку перед фильтром</span>
    .<span style="color: #660066;">hide</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #006600; font-style: italic;">// скрываем фильтры</span>
<span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>И добавить несколько стилей:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">&lt;style type<span style="color: #00AA00;">=</span><span style="color: #ff0000;">&quot;text/css&quot;</span><span style="color: #00AA00;">&gt;</span>
  <span style="color: #cc00cc;">#sf_admin_bar</span> <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span><span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* чтобы блок не плавал справа - теперь он располагается над списком */</span>
    <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* прячем фильтры средствами CSS - в принципе скриптом при загрузке можно и не прятать - это паранойя */</span>
  <span style="color: #00AA00;">&#125;</span>
  <span style="color: #cc00cc;">#sf_admin_bar</span> <span style="color: #6666ff;">.sf_admin_filter</span> form table <span style="color: #00AA00;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">width</span><span style="color: #00AA00;">:</span> <span style="color: #933;">700px</span><span style="color: #00AA00;">;</span> <span style="color: #808080; font-style: italic;">/* делаем немного пошире таблицу с фильтрами */</span>
  <span style="color: #00AA00;">&#125;</span>
&lt;/style<span style="color: #00AA00;">&gt;</span></pre></div></div>

<p>И вуаля:</p>
<p><a rel="lightbox" href="http://hudson.su/files/2010/09/admingeneratorarticle03.png"><img class="alignnone size-medium wp-image-1612" src="http://hudson.su/files/2010/09/admingeneratorarticle03-300x162.png" alt="" width="300" height="162" /><br />
</a></p>
<p>Быстро, просто, не геморно. ))</p>
<p>Code with fun!</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/09/09/symfony-hide-filters-in-admin-generator/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Сниппет: загружаем переменные app.yml из CLI task в symfony</title>
		<link>http://hudson.su/2010/06/03/snippet-loads-app-yml-in-cli-task-in-symfony/</link>
		<comments>http://hudson.su/2010/06/03/snippet-loads-app-yml-in-cli-task-in-symfony/#comments</comments>
		<pubDate>Thu, 03 Jun 2010 06:58:32 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[symfony]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1541</guid>
		<description><![CDATA[В ходе обсуждения в русскоязычном чате пользователей symfony возник вопрос о загрузке конфигурационных констант из app.yml в контексте CLI таска. Как правило, с теми классами, которые работают из-под приложения (frontend, backend или что там у вас), проблем не возникает. Не зависимо от того на каком уровне расположен app.yml, к нему можно получить доступ стандартными средствами [...]]]></description>
			<content:encoded><![CDATA[<p>В ходе обсуждения в русскоязычном чате пользователей symfony возник вопрос о загрузке конфигурационных констант из app.yml в контексте CLI таска. Как правило, с теми классами, которые работают из-под приложения (frontend, backend или что там у вас), проблем не возникает. Не зависимо от того на каком уровне расположен app.yml, к нему можно получить доступ стандартными средствами через <code>sfConfig::get()</code>.</p>
<p>В тасках же конфигурация уровня приложения не инициализируется, поэтому <code>sfConfig::get('app_some_param')</code> будет возвращать NULL. Немного покопавшись в API родился такой сниппет-скелетон таска:<span id="more-1541"></span></p>
<pre>&lt;?php
/**
 * @package
 * @subpackage task
 * @author     dmitry.bykadorov@gmail.com
 * @version    SVN: $Id:  $
 */
class TestTask extends sfBaseTask
{
  protected function configure()
  {
    $this-&gt;namespace = 'sf';
    $this-&gt;name = 'test';
    $this-&gt;briefDescription = 'TODO';

    $this-&gt;detailedDescription = &lt;&lt;&lt;EOF
TODO
EOF;
  }

  protected function execute($arguments = array(), $options = array())
  {
    $configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'prod', true);
    var_dump( sfConfig::get( "app_some_param" ) );
  }
}
</pre>
<p>Протестировано на <code>sf_root_dir/config/app.yml</code></p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/06/03/snippet-loads-app-yml-in-cli-task-in-symfony/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Устанавливаем Git на CentOS</title>
		<link>http://hudson.su/2010/05/11/install-git-on-centos/</link>
		<comments>http://hudson.su/2010/05/11/install-git-on-centos/#comments</comments>
		<pubDate>Tue, 11 May 2010 07:17:27 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[centos]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1484</guid>
		<description><![CDATA[Поскольку в официальном руководстве на GitHub описана установка только для Ubuntu (через Synaptic и apt-get), на коей как водится свет клином не сошелся, предлагаю вашему вниманию небольшой очерк на тему &#8220;как установить GIT&#8221; на Redhat-совместимом дистрибутиве CentOS при помощи нескольких простых команд: Устанавливаем зависимости: yum install gettext-devel expat-devel curl-devel zlib-devel openssl-devel Мне также еще потребовалось [...]]]></description>
			<content:encoded><![CDATA[<p>Поскольку в официальном руководстве на GitHub описана установка только для Ubuntu (через Synaptic и apt-get), на коей как водится свет клином не сошелся, предлагаю вашему вниманию небольшой очерк на тему &#8220;как установить GIT&#8221; на Redhat-совместимом дистрибутиве CentOS при помощи нескольких простых команд:</p>
<p><span id="more-1484"></span></p>
<p>Устанавливаем зависимости:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">yum <span style="color: #c20cb9; font-weight: bold;">install</span> gettext-devel expat-devel curl-devel  zlib-devel openssl-devel</pre></div></div>

<p>Мне также еще потребовалось установить GCC:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">yum <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">gcc</span></pre></div></div>

<p>Загружаем исходники и разархивируем их:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">wget</span>  http:<span style="color: #000000; font-weight: bold;">//</span>kernel.org<span style="color: #000000; font-weight: bold;">/</span>pub<span style="color: #000000; font-weight: bold;">/</span>software<span style="color: #000000; font-weight: bold;">/</span>scm<span style="color: #000000; font-weight: bold;">/</span>git<span style="color: #000000; font-weight: bold;">/</span>git-1.6.1.tar.gz
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">tar</span> xvfz git-1.6.1.tar.gz</pre></div></div>

<p>Устанавливаем:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> git-1.6.1
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span> all
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">local</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></div></div>

<p>Вуаля! )</p>
<p>Оригинал <a href="http://www.how-to-linux.com/2009/01/install-git-161-on-centos-52/" target="_blank">тут</a>. Проверено также на CentOS 5.4 32bit.</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/05/11/install-git-on-centos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Добавляем 2 и более IP в CentOS 5 (RHEL, Fedora)</title>
		<link>http://hudson.su/2010/04/09/add-two-or-more-ips-in-centos/</link>
		<comments>http://hudson.su/2010/04/09/add-two-or-more-ips-in-centos/#comments</comments>
		<pubDate>Fri, 09 Apr 2010 04:54:47 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[networking]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1323</guid>
		<description><![CDATA[В основном в своей практике я сталкивался с необходимостью использования двух IP на разных сетевых интерфейсах. Как правило это eth0 и eth1. Но вот потребовалось &#8220;навесить&#8221; на один интерфейс сначала два, а потом и четыре IP. Сделать это оказалось не сложно, но ранее я такой прием не использовал: Итак, у нас есть один IP на [...]]]></description>
			<content:encoded><![CDATA[<p>В основном в своей практике я сталкивался с необходимостью использования двух IP на разных сетевых интерфейсах. Как правило это <code>eth0</code> и <code>eth1</code>. Но вот потребовалось &#8220;навесить&#8221; на один интерфейс сначала два, а потом и четыре IP. Сделать это оказалось не сложно, но ранее я такой прием не использовал:</p>
<p><span id="more-1323"></span></p>
<p>Итак, у нас есть один IP на интерфейсе eth0:</p>
<pre>eth0 Link encap:Ethernet HWaddr 00:26:B9:2A:B9:13
inet addr:192.168.0.1 Bcast:192.168.0.255 Mask:255.255.255.0
</pre>
<p>Нам нужен еще один IP на том же сетевом интерфейсе (пусть для определенности это будет 192.168.0.200). Для этого нужно создать в директории <code>/etc/sysconfig/network-scripts/</code> файл <code>ifcfg-eth0:0</code></p>
<pre>DEVICE=eth0:0
ONBOOT=yes
BOOTPROTO=static
IPADDR=192.168.0.200
NETMASK=255.255.255.255
</pre>
<p>После этого нужно перезапустить сетевые службы:</p>
<pre>service network restart</pre>
<p>Выполняем ifconfig и видим, что появился &#8220;алиас&#8221; eth0:0</p>
<pre>eth0:0 Link encap:Ethernet HWaddr 00:26:B9:2A:B9:13
inet addr:192.168.0.200 Bcast:192.168.0.11 Mask:255.255.255.255
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
Interrupt:185 Base address:0xa000
</pre>
<p>Если потребуется добавить еще несколько IP, то добавляем соответственно файлы <code>ifcfg-eth0:X</code>, где X &#8211; 1,2,3 и так далее. Выглядит не очень оптимально, так? Действительно, если требуется &#8220;навесить&#8221; на сетевой интерфейс последовательность из IP-адресов (допустим такой вот диапазон: 192.168.0.200-220), то можно воспользоваться следующей конфигурацией. Создаем файл <code>/etc/sysconfig/network-scripts/ifcfg-eth0-range0</code>:</p>
<pre>IPADDR_START=192.168.0.200
IPADDR_END=192.168.0.220
NETMASK=255.255.255.255
CLONENUM_START=1
NO_ALIASROUTING=yes
</pre>
<p>Опять перезапускаем сетевые службы:</p>
<pre>service network restart</pre>
<p>В результате появятся 20 алиасов eth0:1 &#8211; eth0:20, c нужными адресами.</p>
<p>Кроме того, добавлять, изменять и удалять ip-адреса можно с  помощью  команд ip и ifconfig, например если нужно временно поднять   дополнительный адрес:</p>
<pre>ifconfig eth0:0 inet 192.168.0.200/32
</pre>
<p>Естественно, после перезагрузки адрес пропадет. Чтобы убрать временный адрес:</p>
<pre>ifconfig eth0:0 down
</pre>
<p>Have fun! ))</p>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/04/09/add-two-or-more-ips-in-centos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony 2.0 – быстрый тур – архитектура/the architecture (часть 5)</title>
		<link>http://hudson.su/2010/04/04/symfony-2-0-quick-tour-part-5/</link>
		<comments>http://hudson.su/2010/04/04/symfony-2-0-quick-tour-part-5/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 17:08:55 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[bird’s eye view]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[Symfony2 quick tour]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1321</guid>
		<description><![CDATA[Symfony 2.0 – быстрый тур – общая картинка (часть 1) Symfony 2.0 – быстрый тур – вид/the view (часть 2) Symfony 2.0 – быстрый тур – контроллер/the controller (часть 3) Symfony 2.0 – быстрый тур – пакеты/the bundles (часть 4) Первые 4 части этого руководства позволили составить обще представление о Symfony 2.0. Но они не [...]]]></description>
			<content:encoded><![CDATA[<ul>
<li><a href="http://hudson.su/?p=1032" target="_blank">Symfony 2.0 – быстрый тур – общая картинка (часть 1)</a></li>
<li><a href="http://hudson.su/?p=1094" target="_blank">Symfony 2.0 – быстрый тур – вид/the view (часть 2)</a></li>
<li><a href="http://hudson.su/?p=1174" target="_blank">Symfony 2.0 – быстрый тур – контроллер/the controller (часть 3)</a></li>
<li><a href="http://hudson.su/?p=1235" target="_blank">Symfony  2.0 – быстрый тур – пакеты/the bundles  (часть  4)</a></li>
</ul>
<p>Первые 4 части этого руководства позволили составить обще представление о Symfony 2.0. Но они не останавливаются на структуре директорий проекта. Поскольку это одна из отличительных особенностей Symfony, давайте-ка остановимся на этом подробнее.</p>
<p><span id="more-1321"></span>Структура директорий приложения Symfony очень гибкая. Это руководство описывает рекомендуемую структуру, но, как вы скоро поймете, все можно изменять.</p>
<h2>Структура директорий / The Directory Structure</h2>
<p>Структура директорий песочницы отражает типовую и рекомендованную структуру приложения Symfony:</p>
<ul>
<li><code>hello/</code>: Эта директория, названная по имени вашего приложения, содержит конфигурационные файлы;</li>
<li><code>src/</code>: Весь PHP код находится в этой директории;</li>
<li><code>web/</code>: Это директория web root.</li>
</ul>
<h3>Директория web / The Web Directory</h3>
<p>Корень веб &#8211; это домашняя директория для всех публичных и статических файлов типа изображений, стилей и javascript-файлов. Она также содержит боевой фронт-контроллер:</p>
<pre># web/index.php
&lt;?php

require_once __DIR__.'/../hello/HelloKernel.php';

$kernel = new HelloKernel('prod', false);
$kernel-&gt;run();</pre>
<p>Как и любой другой фронт-контроллер, <code>index.php</code> использует Kernel  Class, <code>HelloKernel</code>, для инициализации и запуска приложения.</p>
<h3>Директория приложения / The Application Directory</h3>
<p><code>Класс </code><code>HelloKernel</code> это главная точка входа  в настройки приложения и он хранится в директории <code>hello/</code>.</p>
<p>Этот класс должен реализовывать 5 методов:</p>
<ul>
<li><code>registerRootDir()</code>: Возвращает корневую директорию;</li>
<li><code>registerBundles()</code>: Возвращает массив всех пакетов (бандлов) нобходимых для запуска приложения (обратите внимание на <code>ApplicationHelloBundleBundle</code>);</li>
<li><code>registerBundleDirs()</code>: Возвращает массив ассоциаций пространств имен и их домашних директорий;</li>
<li><code>registerContainerConfiguration()</code>: Возвращает главный конфигурационный объект (об этом подробнее ниже);</li>
<li><code>registerRoutes()</code>: Возвращает конфигурацию маршрутизатора.</li>
</ul>
<p>Обратите внимание на дефолтную реализацию этих методов для того чтобы лучше понять гибкость фреймворка. В начале этого руководства вы открывали файл <code>hello/config/routing.yml</code>. Этот путь был сконфигурирован в методе <code>registerRoutes()</code>:</p>
<pre>public function registerRoutes()
{
  $loader = new RoutingLoader($this-&gt;getBundleDirs());

  return $loader-&gt;load(__DIR__.'/config/routing.yml');
}</pre>
<p>Также в этом месте вы можете переключиться между использованием конфигурационных файлов в YAML формате на XML или плоский PHP код, если вам так будет удобнее.</p>
<p>Для того чтобы это все работало, ядро подключает два файла из директории <code>src/</code>:</p>
<pre># hello/HelloKernel.php
require_once __DIR__.'/../src/autoload.php';
require_once __DIR__.'/../src/vendor/symfony/src/Symfony/Foundation/bootstrap.php';</pre>
<h3>Директория исходных кодов / The Source Directory</h3>
<p>Файл <code>src/autoload.php</code> отвечает за автозагрузку всех файлов из директории <code>src/</code>:</p>
<pre># src/autoload.php
require_once __DIR__.'/vendor/symfony/src/Symfony/Foundation/UniversalClassLoader.php';

use SymfonyFoundationUniversalClassLoader;

$loader = new UniversalClassLoader();
$loader-&gt;registerNamespaces(array(
  'Symfony'     =&gt; __DIR__.'/vendor/symfony/src',
  'Application' =&gt; __DIR__,
  'Bundle'      =&gt; __DIR__,
  'Doctrine'    =&gt; __DIR__.'/vendor/doctrine/lib',
));
$loader-&gt;registerPrefixes(array(
  'Swift_' =&gt; __DIR__.'/vendor/swiftmailer/lib/classes',
  'Zend_'  =&gt; __DIR__.'/vendor/zend/library',
));
$loader-&gt;register();

// for Zend Framework &amp; SwiftMailer
set_include_path(__DIR__.'/vendor/zend/library'.PATH_SEPARATOR.__DIR__.'/vendor/swiftmailer/lib'.PATH_SEPARATOR.get_include_path());</pre>
<p>Класс <code>UniversalClassLoader</code> используется для автозагрузки файлов, которые удовлетворяют либо техническому стандарту для пространств имен в PHP 5.3 или же соглашению о наименовании классов PEAR. Как вы можете видеть, все зависимости хранятся в директории <code>vendor/</code>, но, это всего-лишь соглашение. Вы можете хранить их где вам удобно, глобально на сервере или локально в вашем проекте.</p>
<h2>Еще немного о пакетах / More about Bundles</h2>
<p>Как мы могли видеть в предыдущей части, приложение состоит из пакетов, определенных в методе <code>registerBundles()</code>:</p>
<pre># hello/HelloKernel.php
public function registerBundles()
{
  return array(
    new SymfonyFoundationBundleKernelBundle(),
    new SymfonyFrameworkWebBundleBundle(),
    new SymfonyFrameworkDoctrineBundleBundle(),
    new SymfonyFrameworkSwiftmailerBundleBundle(),
    new SymfonyFrameworkZendBundleBundle(),
    new ApplicationHelloBundleBundle(),
  );
}</pre>
<p>Но как же Symfony понимает где искать пакеты? Symfony очень гибок в этом отношении. Метод <code>registerBundleDirs()</code> должен возвращать ассоциативный массив, который ставит в соответствие пространству имен некоторую валидную директорию (локальную или глобальную):</p>
<pre>public function registerBundleDirs()
{
  return array(
    'Application'        =&gt; __DIR__.'/../src/Application',
    'Bundle'             =&gt; __DIR__.'/../src/Bundle',
    'Symfony\Framework' =&gt; __DIR__.'/../src/vendor/symfony/src/Symfony/Framework',
  );
}</pre>
<p>Итак, когда вы ссылаетесь на <code>HelloBundle</code> в имени контроллера или в имени шаблона, Symfony будет искать его в указанных директориях.</p>
<p>Ну как, вы поняли почему Symfony такой гибкий? Используйте ваши пакеты в различных приложениях, храните их локально или глобально на ваш выбор.</p>
<h2>Вендоры / Vendors</h2>
<p>Часто ваше приложение будет зависеть от сторонних библиотек. Они должны храниться в директории <code>src/vendor/</code>. Она уже содержит библиотеки Symfony &#8211; SwiftMailer, Doctrine ORM, и избранное из классов Zend Framework.</p>
<h2>Кэш и логи / Cache and Logs</h2>
<p>Symfony это один из самых быстрых фреймворков. Но как он может быть таким быстрым, если он постоянно должен парсить и интерпретировать десятки YAML и XML файлов? Частично это обязанность системы кеширования. Конфигурация приложения парсится только для первого запроса и после этого компилируется в обычный PHP код, который хранится в директории приложения <code>cache/</code>. В девелоперском окружении Symfony сбрасывает кэш когда вы изменяете файл, но в продуктовом окружении это уже ваша обязанность чистить кэш, когда вы обновляете ваш код или конфигурацию.</p>
<p>Во время разработки web-приложения что-то может пойти не так в любой момент. Файлы логов в директории приложения <code>logs/</code> могут рассказать вам подробности о запросах и помочь разобраться в проблеме, не затратив много времени.</p>
<h2>Интерфейс командной строки / The Command Line Interface</h2>
<p>Каждое приложение идет комплекте с инструментом командной строки (консоль), который помогает обслуживать приложение. Консоль предоставляет команды, которые увеличивают вашу продуктивность, автоматизируя часты и повторяющиеся задачи.</p>
<p>Запустите консоль без агрументов, для того чтобы получить представление о ее возможностях:</p>
<pre>$ php hello/console</pre>
<p>Опция <code>--help</code> поможет вам уточнить способ использования любой команды:</p>
<pre>$ php hello/console router:debug --help</pre>
<h2>Последний рывок / Final Thoughts</h2>
<p>Назовите меня чокнутым, но после прочтения этой части, вы должны уметь заставить работать Symfony на вас быстро и комфортно. Так что, перемещайте директории как вам угодно, не стесняйтесь.</p>
<p>Вы уже всего лишь в шаге от того чтобы стать мастером Symfony. Это действительно так, после прочтения следующей главы о том, как расширять фреймворк, вы сможете разрабатывать востребованные приложения с Symfony.</p>
<blockquote><p>Источник: <a href="http://symfony-reloaded.org/quick-tour-part-5" target="_blank">http://symfony-reloaded.org/quick-tour-part-5</a></p>
<p>P.S. На текущий момент, увы, на официальном сайте проекта следующей главы, на которую ссылается автор, пока нет. Так что пока повременим становиться мастерами симфонии (ваш hudson).</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/04/04/symfony-2-0-quick-tour-part-5/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Symfony 2.0 – быстрый тур – пакеты/the bundles (часть 4)</title>
		<link>http://hudson.su/2010/03/31/symfony-2-0-quick-tour-part-4/</link>
		<comments>http://hudson.su/2010/03/31/symfony-2-0-quick-tour-part-4/#comments</comments>
		<pubDate>Wed, 31 Mar 2010 17:32:10 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[bird’s eye view]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Symfony2]]></category>
		<category><![CDATA[Symfony2 quick tour]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1235</guid>
		<description><![CDATA[А вот и вы, мой герой ) Ну кто бы мог подумать, что вы все еще будете с нами после первых трех частей ) Однако же, ваши усилия скоро будут щедро вознаграждены. В этой части мы коснемся пожалуй самой мощной функции Symfony &#8211; системы пакетов (bundles). Symfony 2.0 – быстрый тур – общая картинка (часть [...]]]></description>
			<content:encoded><![CDATA[<p>А вот и вы, мой герой ) Ну кто бы мог подумать, что вы все еще будете с нами после первых трех частей ) Однако же, ваши усилия скоро будут щедро вознаграждены. В этой части мы коснемся пожалуй самой мощной функции Symfony &#8211; системы пакетов (bundles).</p>
<p><span id="more-1235"></span></p>
<ul>
<li><a href="http://hudson.su/?p=1032" target="_blank">Symfony 2.0 – быстрый тур – общая картинка (часть 1)</a></li>
<li><a href="http://hudson.su/?p=1094" target="_blank">Symfony 2.0 – быстрый тур – вид/the view (часть 2)</a></li>
<li><a href="http://hudson.su/?p=1174" target="_blank">Symfony 2.0 – быстрый тур – контроллер/the controller (часть 3)</a></li>
<li><a href="http://hudson.su/?p=1321" target="_blank">Symfony 2.0 – быстрый тур – архитектура/the architecture (часть 5)</a></li>
</ul>
<h2>Система пакетов / The Bundle System</h2>
<p>Пакеты в Symfony можно сравнить с модулями расширений (плагинами) в прочем программном обеспечении. Но почему же тогда мы <span style="text-decoration: line-through">кошку называем кошкой</span> пакет называем пакетом а не плагином? А потому что в Symfony все есть пакет: начиная от ядра фремворка и заканчивая кодом, который вы пишите для своего приложения. Пакеты &#8211; это граждане первейшего сорта. Они дают вам гибкость в использовании возможностей сторонних пакетов или же распространении своих собственных пакетов. Т.о. вы можете легко выбирать какие возможности будут доступны вашему приложению и оптимизировать его требуемым вам способом.</p>
<p>Приложение состоит из пакетов, определенных в методе <code>registerBundles()</code> класса <code>HelloKernel</code>:</p>
<pre># hello/HelloKernel.php
public function registerBundles()
{
  return array(
    new SymfonyFoundationBundleKernelBundle(),
    new SymfonyFrameworkWebBundleBundle(),
    new SymfonyFrameworkDoctrineBundleBundle(),
    new SymfonyFrameworkSwiftmailerBundleBundle(),
    new SymfonyFrameworkZendBundleBundle(),
    new ApplicationHelloBundleBundle(),
  );
}</pre>
<p>Обратите внимание, что наряду с <code>HelloBundle</code>, ядро подключает <code>KernelBundle</code>, <code>WebBundle</code>, <code>DoctrineBundle</code>, <code>SwiftmailerBundle </code>и <code>ZendBundle</code>. Все эти пакеты являются частью ядра фреймворка.</p>
<p>Каждый пакет может быть настроен через конфигурационные файлы, написанные на YAML или XML. Давайте взглянем на конфигурацию по-умолчанию:</p>
<pre># hello/config/config.yml
kernel.config: ~
web.web: ~
web.templating: ~</pre>
<p>Каждый параметр, например kernel.config определяет конфигурацию пакета. Некоторые пакеты могут иметь много настроек если вы используете много возможностей, например <code>WebBundle</code> имеет две настройки: <code>web.web</code> и <code>web.templating</code>.</p>
<p>Каждое окружение может переопределять конфигурацию по-умолчанию через отдельные конфигурационные файлы:</p>
<pre># hello/config/config_dev.yml
imports:
  - { resource: config.yml }

web.debug:
  exception: %kernel.debug%
  toolbar:   %kernel.debug%

zend.logger:
  priority: info
  path:     %kernel.root_dir%/logs/%kernel.environment%.log</pre>
<p>Теперь вы знаете как подключать пакеты и как конфигурировать их. Давайте теперь посмотрим что для нас могут сделать встроенные пакеты.</p>
<h2>Пользователь / The User</h2>
<p>Не смотря на то что протокол HTTP не сохраняет состояния между запросами, Symfony предоставляет отличный объект user, который представляет клиента (будь то реальный человек через интернет-обозреватель, бот или же вебсервис). Между двумя запросами Symfony сохраняет атрибуты в cookie с использованием нативных сессий PHP.</p>
<p>Эта возможность предоставляется <code>WebBundle</code> и может быть подключена при помощи следующей строки в <code>config.yml</code>:</p>
<pre># hello/config/config.yml
web:user: ~</pre>
<p>Сохранение и получение информации о пользователе осуществляется следующим образом:</p>
<pre>// store an attribute for reuse during a later user request
$this-&gt;getUser()-&gt;setAttribute('foo', 'bar');

// in another controller for another request
$this-&gt;getUser()-&gt;getAttribute('foo');

// get/set the user culture
$this-&gt;getUser()-&gt;setCulture('fr');</pre>
<p>Вы также можете хранить небольшие сообщения, которые будут доступны только для следующего запроса:</p>
<pre>$this-&gt;getUser()-&gt;setFlash('notice', 'Congratulations, your action succeeded!')</pre>
<h2>Работа с БД / Accessing the Database</h2>
<p>Если ваш проект взаимодействует с базой данных тем или иным образом, вы свободны в выборе любого удобного вам инструмента. Вы можете использовать ORM, например Doctrine или Propel, если хотите высокого уровня абстракции от БД. Но в этой секции мы не будем усложнять примеры и воспользуемся Doctrine DBAL, который представляет собой &#8220;тонкий слой&#8221; поверх PDO, для подключения к базе данных.</p>
<p>Подключим DoctrineBundle и сконфигурируем наше подключение в config.yml:</p>
<pre># hello/config/config.yml
doctrine.dbal:
  driver:   PDOMySql # can be any of OCI8, PDOMsSql, PDOMySql, PDOOracle, PDOPgSql, or PDOSqlite
  dbname:   your_db_name
  user:     root
  password: your_password # or null if there is none</pre>
<p>Вот и все. Теперь вы можете использовать объект соединения для взаимодействия с БД из любого действия:</p>
<pre>public function showAction($id)
{
  $stmt = $this-&gt;getDatabaseConnection()-&gt;execute('SELECT * FROM product WHERE id = ?', array($id));

  if (!$product = $stmt-&gt;fetch())
  {
    throw new NotFoundHttpException('The product does not exist.');
  }

  return $this-&gt;render(...);
}</pre>
<p>Выражение <code>$this-&gt;getDatabaseConnection()</code> возвращает объект, с которым можно работать как и с PDO.</p>
<h2>Отправка email / Sending Emails</h2>
<p>Отправить email в Symfony также просто как и щелкнуть пальцами. Во-первых, нужно подключить <code>SwiftmailerBundle</code> и сконфигурировать его:</p>
<pre># hello/config/config.yml
swift.mailer:
  transport: gmail # can be any of smtp, mail, sendmail, or gmail
  username:  your_gmail_username
  password:  your_gmail_password</pre>
<p>После этого вы можете использовать мэйлер в любом действии:</p>
<pre>public function indexAction($name)
{
  // get the mailer first (mandatory to initialize Swift Mailer)
  $mailer = $this-&gt;getMailer();

  $message = Swift_Message::newInstance()
    -&gt;setSubject('Hello Email')
    -&gt;setFrom('send@example.com')
    -&gt;setTo('recipient@example.com')
    -&gt;setBody($this-&gt;renderView('HelloBundle:Hello:email', array('name' =&gt; $name)))
  ;
  $mailer-&gt;send($message);

  return $this-&gt;render(...);
}</pre>
<p>Тело письма хранится в шаблоне, который рендерится при помощи метода <code>renderView()</code>.</p>
<h2>Последний рывок / Final Thoughts</h2>
<p>В этой части мы рассмотрели основные особенности Symfony. Играйтесь с Symfony, разрабатывайте небольшие приложения и, когда почувствуете себя готовыми, завершите наш небольшой тур по Symfony чтением следующей части, где мы поговорим немного более подробно о том как Symfony работает и как его можно настроить под свои нужды.</p>
<blockquote><p>Оригинал: <a href="http://symfony-reloaded.org/quick-tour-part-4" target="_blank">http://symfony-reloaded.org/quick-tour-part-4</a></p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/03/31/symfony-2-0-quick-tour-part-4/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Symfony snippet: partial для постраничной навигации (pagination)</title>
		<link>http://hudson.su/2010/03/25/symfony-snippet-partial-for-pagination/</link>
		<comments>http://hudson.su/2010/03/25/symfony-snippet-partial-for-pagination/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 05:45:29 +0000</pubDate>
		<dc:creator>hudson</dc:creator>
				<category><![CDATA[Профессиональное]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[howto]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[web разработка]]></category>

		<guid isPermaLink="false">http://hudson.su/?p=1241</guid>
		<description><![CDATA[Предлагаю вашему вниманию небольшой сниппет для повседневного применения в symfony 1.3 &#8211; 1.4. Сниппет предназначен для отображения постраничной навигации по записям. Задача: выводить список страниц для типового набора записей (новости, каталог и т.п.) Решение: Поскольку пейджер в большинстве типовых проектов требуется однотипный, то и решение для него должно быть простым и универсальным. Для бОльшей наглядости [...]]]></description>
			<content:encoded><![CDATA[<p>Предлагаю вашему вниманию небольшой сниппет для повседневного применения в symfony 1.3 &#8211; 1.4.</p>
<p>Сниппет предназначен для отображения постраничной навигации по записям.</p>
<p><span id="more-1241"></span></p>
<h2>Задача:</h2>
<p>выводить список страниц для типового набора записей (новости, каталог и т.п.)</p>
<h2>Решение:</h2>
<p>Поскольку пейджер в большинстве типовых проектов требуется однотипный, то и решение для него должно быть простым и универсальным. Для бОльшей наглядости предположим что у нас есть модель NewsItem &#8211; новости сайта.</p>
<h3>Подготовительные операции:</h3>
<p>Схема:</p>

<div class="wp_syntax"><div class="code"><pre class="text" style="font-family:monospace;">NewsItem:
  options:
    type: INNODB
    collate: utf8_general_ci
    charset: utf8
  actAs:
    Timestampable:
  connection: doctrine
  tableName: news_item
  columns:
    id:
      type: integer(4)
      fixed: false
      unsigned: false
      primary: true
      autoincrement: true
    title:
      type: string(255)
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    abstract:
      type: string()
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    description:
      type: string()
      fixed: false
      unsigned: false
      primary: false
      notnull: true
      autoincrement: false
    is_published:
      type: boolean
      fixed: false
      unsigned: false
      primary: false
      default: '0'
      notnull: true
      autoincrement: false</pre></div></div>

<p>Метод получения пейджера в NewsItemTable.class.php:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Где-то в lib/model/doctrine/NewsItemTable.class.php</span>
<span style="color: #009933; font-style: italic;">/**
 * Что-то с постраничным выводом
 * @param &lt;int&gt; $page
 * @return &lt;Doctrine_Pager&gt;
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> getNewsPager<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$page</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$query</span> <span style="color: #339933;">=</span> Doctrine_Query<span style="color: #339933;">::</span><span style="color: #004000;">create</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">select</span>    <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;*&quot;</span> <span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span>      <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;NewsItem n&quot;</span> <span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span>     <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;n.is_published = 1&quot;</span> <span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">orderBy</span>   <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;n.created_at DESC&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">new</span> Doctrine_Pager<span style="color: #009900;">&#40;</span> <span style="color: #000088;">$query</span><span style="color: #339933;">,</span> <span style="color: #000088;">$page</span><span style="color: #339933;">,</span> sfConfig<span style="color: #339933;">::</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;app_pager_perpage&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">10</span> <span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Настройку app_pager_perpage добавляем в app.yml:</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;"># apps/frontend/config/app.yml
all:
  pager:
    perpage: 10</pre></div></div>

<p>В действии:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// apps/frontend/modules/news/actions/actions.class.php</span>
<span style="color: #009933; font-style: italic;">/**
 * Архив новостей
 * @param  $request
 */</span>
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeArchive<span style="color: #009900;">&#40;</span>sfWebRequest <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">news_pager</span> <span style="color: #339933;">=</span> NewsItemTable<span style="color: #339933;">::</span><span style="color: #004000;">getNewsPager</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getParameter</span><span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;page&quot;</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">news</span>       <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">news_pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Теперь создаем партиал пейджера (в каком-нибудь общем модуле, shared или commons):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">// apps/frontend/modules/commons/templates/_pager.php
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Типовой пейджер
 *
 * @param &lt;Doctrine_Pager&gt; $pager - объект пейджера
 * @param &lt;string&gt; $route - маршрут для построения ссылок пейджера
 *
 * @package     commons
 * @subpackage  templates
 * @author      Dmitry.Bykadorov@gmail.com
 * @version     SVN: $Id: _pager.php dmitry.bykadorov $
 *
 */</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">haveToPaginate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;div class=&quot;pager&quot;&gt;
&nbsp;
  &lt;ul&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirstPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;li&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> url_for<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$route</span>?page=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getFirstPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; title=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Первая страница'</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;&lt;&lt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> url_for<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$route</span>?page=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPreviousPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; title=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Назад'</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;&lt;&lt;/a&gt;&lt;/li&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">2</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">3</span><span style="color: #339933;">;</span> <span style="color: #000088;">$i</span><span style="color: #339933;">++</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
      <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$p</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$i</span> <span style="color: #009900;">&#41;</span> <span style="color: #339933;">&gt;</span> <span style="color: #cc66cc;">0</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$p</span> <span style="color: #339933;">&lt;=</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLastPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
        <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #000088;">$active</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">0</span> <span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">&quot;active&quot;</span> <span style="color: #339933;">:</span> <span style="color: #0000ff;">&quot;&quot;</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
        &lt;li&gt;&lt;a class=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$active</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> url_for<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$route</span>?page=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$p</span> <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; title=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Страница '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$p</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #000088;">$p</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/a&gt;&lt;/li&gt;
      <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endfor</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLastPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;li&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> url_for<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$route</span>?page=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNextPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; title=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Вперед'</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;&gt;&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> url_for<span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$route</span>?page=&quot;</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$pager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getLastPage</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; title=&quot;<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'Последняя страница'</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot;&gt;&gt;&gt;&lt;/a&gt;&lt;/li&gt;
    <span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
  &lt;/ul&gt;
&nbsp;
&lt;/div&gt;
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Ну и все что нам осталось, разместить в шаблоне архива постраничную навигацию:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">// apps/frontend/modules/news/templates/archiveSuccess.php
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
include_partial<span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">&quot;commons/pager&quot;</span><span style="color: #339933;">,</span>
  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">&quot;pager&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$news_pager</span><span style="color: #339933;">,</span>
    <span style="color: #0000ff;">&quot;route&quot;</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">&quot;@news_archive&quot;</span>
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<blockquote><p>Вот и все. Можно пользоваться.</p>
<p>Пожелания, предложения и багрепорты оставляйте в комментариях )</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://hudson.su/2010/03/25/symfony-snippet-partial-for-pagination/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

