<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
<channel>
<title>Блог обыкновенный</title>
<link>http://www.ramirezcobos.com/</link>
<description><![CDATA[RSS лента блога resurtm.kz
]]></description>
<language>ru-ru</language>
<pubDate>Tue, 21 Feb 2012 20:36:16 +0600</pubDate>
<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/resurtm" /><feedburner:info uri="resurtm" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
<title>
Правильный символ тенге в вебе</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/fjgqinjXVco/tenge-symbol</link>
<pubDate>
Tue, 21 Feb 2012 20:36:16 +0600</pubDate>
<description>&lt;h2&gt;Введение&lt;/h2&gt;
	&lt;p&gt;
		Часто бывает так, что при верстке нам нужен
		&lt;a href="http://www.symbol-tenge.kz/introduction/recommendations#invalid-symbol-tenge"&gt;правильный символ тенге&lt;/a&gt;.
		Хорошо, когда разработчик или владелец сайта понимает, что символ «╤» — это символ
		псевдографики, а не символ тенге, потому как получить его в тексте (без помощи inline элемента &lt;tt&gt;&amp;lt;img&amp;gt;&lt;/tt&gt;) можно
		довольно просто и быстро. Для этого нам понадобится:
	&lt;/p&gt;
	&lt;ul&gt;
		&lt;li&gt;
			Шрифт в формате TrueType для которого мы хотим сделать символ тенге;
		&lt;/li&gt;
		&lt;li&gt;
			Набор символов тенге для разных шрифтов,
			&lt;a href="http://www.symbol-tenge.kz/about/serifs/"&gt;подготовленных&lt;/a&gt;
			&lt;a href="http://www.karasov.ru/"&gt;Анатолием Карасовым&lt;/a&gt;
			и &lt;a href="https://twitter.com/#!/ysdshev"&gt;Ярославом Седышевым&lt;/a&gt; в формате OpenType. Скачать его можно тут:
			&lt;a href="http://www.symbol-tenge.kz/fonts/tenge.zip"&gt;tenge.zip&lt;/a&gt;;
		&lt;/li&gt;
		&lt;li&gt;
			Редактор шрифтов (напр. FontLab Studio пятой версии).
		&lt;/li&gt;
	&lt;/ul&gt;
	&lt;p&gt;
		Для примера мы возьмем обычный Times New Roman с засечками. Приступим.
	&lt;/p&gt;
	&lt;h2&gt;Подготовка шрифта&lt;/h2&gt;
	&lt;p&gt;
		1. Открываем times.ttf и tenge.otf в FontLab Studio:
	&lt;/p&gt;
	&lt;p&gt;&lt;img src="/content/tenge/fontlab-studio-5.png" alt="" /&gt;&lt;/p&gt;
	&lt;p&gt;
		2. В times.ttf ищем глифы кириллической «г» в нижнем регистре
		(&lt;a href="http://www.fileformat.info/info/unicode/char/0433/index.htm"&gt;U+0433&lt;/a&gt;, Cyrillic Small Letter Ghe)
		и точки (&lt;a href="http://www.fileformat.info/info/unicode/char/002e/index.htm"&gt;U+002E&lt;/a&gt;, Full Stop).
	&lt;/p&gt;
	&lt;p&gt;&lt;img src="/content/tenge/cyrillic-small-letter-ghe.png" alt="" /&gt;&lt;/p&gt;
	&lt;p&gt;&lt;img src="/content/tenge/full-stop.png" alt="" /&gt;&lt;/p&gt;
	&lt;p&gt;
		3. Удаляем все кривые в обоих глифах и устанавливаем толщину каждому из них в ноль.
		Зачем это нужно — будет показано дальше.
	&lt;/p&gt;
	&lt;p&gt;&lt;img src="/content/tenge/cyrillic-small-letter-ghe-empty.png" alt="" /&gt;&lt;/p&gt;
	&lt;p&gt;&lt;img src="/content/tenge/full-stop-empty.png" alt="" /&gt;&lt;/p&gt;
	&lt;p&gt;
		4. Теперь ищем глиф символа тенге в tenge.otf для Times New Roman. Судя по tenge.txt внутри
		&lt;a href="http://www.symbol-tenge.kz/fonts/tenge.zip"&gt;tenge.zip&lt;/a&gt;, tenge.otf — это глиф с номером
		&lt;a href="http://www.fileformat.info/info/unicode/char/0070/index.htm"&gt;U+0050&lt;/a&gt; (Latin Small Letter P).
		Копируем этот глиф в буфер обмена операционной системы.
	&lt;/p&gt;
	&lt;p&gt;&lt;img src="/content/tenge/times-new-roman-tenge.png" alt="" /&gt;&lt;/p&gt;
	&lt;p&gt;
		5. Возвращаемся к times.ttf и ищем малую кириллическую «т»
		(&lt;a href="http://www.fileformat.info/info/unicode/char/0442/index.htm"&gt;U+0442&lt;/a&gt;, Cyrillic Small Letter Te).
		Ее заменяем на тот глиф, что находится сейчас у нас в буфере обмена. Результат операции:
	&lt;/p&gt;
	&lt;p&gt;&lt;img src="/content/tenge/cyrillic-small-letter-te-replaced.png" alt="" /&gt;&lt;/p&gt;
	&lt;p&gt;
		6. Сам шрифт почти готов. Осталось скомпилировать его в новый шрифт формата TrueType и
		можно приступать к верстке. Компилируем и сохраняем его как times-tenge.ttf.
	&lt;/p&gt;
	
	&lt;h2&gt;Верстка&lt;/h2&gt;
	&lt;p&gt;Ничего сложного и необычного в верстке нет. Каскадные стили:&lt;/p&gt;
	&lt;pre&gt;
@font-face{
	font-family:Times New Roman Tenge;
	/* для нормального начертания, не жирное и не курсивное */
	font-style:normal;
	font-weight:normal;
	src:url(/fonts/times-tenge.eot);
	src:url(/fonts/times-tenge.eot?iefix) format('☺'),
		url(/fonts/times-tenge.woff) format('woff'),
		url(/fonts/times-tenge.ttf) format('truetype'),
		url(/fonts/times-tenge.svg#times-tenge) format('svg');
}
p{
	font-family:Times New Roman;
	font-size:24px;
}
p span.tenge{
	font-family:Times New Roman Tenge;
}
	&lt;/pre&gt;
	
	&lt;p&gt;Разметка:&lt;/p&gt;
	&lt;pre&gt;
&amp;lt;p&amp;gt;Красивые женские сапоги. Цена 16 000 &amp;lt;span class=&amp;quot;tenge&amp;quot;&amp;gt;тг.&amp;lt;/span&amp;gt;, размеры 36, 37, 38, 39.&amp;lt;/p&amp;gt;
	&lt;/pre&gt;
	
	&lt;p&gt;Результат:&lt;/p&gt;
	&lt;style type="text/css"&gt;
	@font-face{
		font-family:TNRTenge;
		/* для нормального начертания, не жирное и не курсивное */
		font-style:normal;
		font-weight:normal;
		src:url(/content/tenge/times-tenge.eot);
		src:url(/content/tenge/times-tenge.eot?iefix) format('☺'),
			url(/content/tenge/times-tenge.woff) format('woff'),
			url(/content/tenge/times-tenge.ttf) format('truetype'),
			url(/content/tenge/times-tenge.svg#times-tenge) format('svg');
	}
	.result p{
		font-family:Times New Roman;
		font-size:24px;
	}
	.result p span.tenge{
		font-family:TNRTenge;
	}
&lt;/style&gt;
&lt;div class="result"&gt;
	&lt;p&gt;Красивые женские сапоги. Цена 16 000 &lt;span class="tenge"&gt;тг.&lt;/span&gt;, размеры 36, 37, 38, 39.&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;
	Сконвертировать наш шрифт из формата TrueType в Embedded OpenType, WOFF и SVG можно
	&lt;a href="http://onlinefontconverter.com"&gt;много&lt;/a&gt;
	&lt;a href="http://www.freefontconverter.com/"&gt;где&lt;/a&gt;
	&lt;a href="http://www.font2web.com/"&gt;в сети&lt;/a&gt;.
&lt;/p&gt;

&lt;p&gt;
	Почему мы удалили глифы точки и малой кириллической «т»? Это нужно для того, чтобы текст с
	символом тенге отображался корректно в тех браузерах, где поддержки встраиваемых шрифтов нет.
	Второй причиной является то, что используя такой прием пользователь может копировать
	текст с символом тенге без задних мыслей и получать нормальный текст при вставке его куда-либо.
&lt;/p&gt;
&lt;p&gt;&lt;img src="/content/tenge/copy-paste.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;
	Данный способ работает во всех браузерах, которые поддерживают встраиваемые шрифты, а в их
	число входит и Microsoft Internet Explorer шестой версии. Хотя, конечно, для него приходится
	конвертировать шрифт в формат Embedded OpenType. :-)
&lt;/p&gt;
&lt;p&gt;
	Дополнения и замечания по данному способу приветствуются.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/fjgqinjXVco" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
1f0e3dad99908345f7439f8ffabdffc4b3f0c7f6bb763af1be91d9e74eabfeb199dc1f1f</guid>
<feedburner:origLink>http://resurtm.kz/tenge-symbol</feedburner:origLink></item>
<item>
<title>
Правильная интеграция KFM (Kae’s File Manager) с Yii</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/Tqtnaf37Gqo/yii-kfm-authentication</link>
<pubDate>
Wed, 28 Sep 2011 03:55:49 +0600</pubDate>
<description>&lt;p&gt;Правильная интеграция KFM (Kae’s File Manager) с Yii&lt;/p&gt;

&lt;p&gt;Для того, чтобы файловым менеджером &lt;a href="http://kfm.verens.com/"&gt;KFM&lt;/a&gt;, который предназначен только для администраторского раздела сайта, не могли воспользоваться любые случайные посетители сайта, его нужно каким-либо образом привязать к аутентификации из Yii. Если пользователь аутентифицирован в системе управления Yii-сайтом, то он может использовать KFM и производить манипуляции с файлами на сервере, а в противном случае — нет.&lt;/p&gt;

&lt;p&gt;Самым простым способом такой интеграции является способ, описанный в данной заметке.&lt;/p&gt;

&lt;p&gt;Для начала нужно создать новое действие &lt;code&gt;actionIsAuthenticated&lt;/code&gt; в основном контроллере приложения управления сайтом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;class&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;SiteController&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;extends&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;BackendController&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; фильтры контроллера&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;public&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;filters&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
        &lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
            &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;accessControl&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
            &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;postOnly + logout&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
 
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; настраиваем права доступа к действиям контроллера&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;public&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;accessRules&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
        &lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
            &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; isAuthenticated доступен всегда и всем&lt;/span&gt;
            &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;allow&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;actions&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;isAuthenticated&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;users&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;*&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
 
            &lt;/span&gt;&lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; страница логина доступна только не аутентифицированным пользователям&lt;/span&gt;
            &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;allow&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;actions&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;login&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;users&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;?&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
            &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;deny&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;actions&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;login&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;users&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;*&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
 
            &lt;/span&gt;&lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; остальные действия по умолчанию доступы только аутентифицированным пользователям&lt;/span&gt;
            &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;allow&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;users&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;@&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
            &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;deny&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;users&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;*&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
 
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; главная страница системы управления&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;public&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;actionIndex&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
        &lt;span class="php-hl-var"&gt;$this&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;render&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;index&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
 
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; ...&lt;/span&gt;
 
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; выход из системы управления сайтом&lt;/span&gt;
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; доступен только по HTTP POST&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;public&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;actionLogout&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
        &lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;user&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;logout&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
        &lt;/span&gt;&lt;span class="php-hl-var"&gt;$this&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;render&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;logout&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
 
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; возвращает статус аутентификации пользователя&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;public&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;actionIsAuthenticated&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
        &lt;span class="php-hl-var"&gt;$this&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;layout&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
        &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;user&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;isGuest&lt;/span&gt;&lt;span class="php-hl-code"&gt; ? &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;no&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; : &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;yes&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Теперь открываем и редактируем конфигурационный файл KFM &lt;code&gt;configuration.php&lt;/code&gt;. Нужно добавить следующий код в самом начале этого файла:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$curl&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;curl_init&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;curl_setopt&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$curl&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CURLOPT_URL&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;http://&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-var"&gt;$_SERVER&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;HTTP_HOST&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;/backend/site/isAuthenticated&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;curl_setopt&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$curl&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CURLOPT_RETURNTRANSFER&lt;/span&gt;&lt;span class="php-hl-code"&gt; , &lt;/span&gt;&lt;span class="php-hl-number"&gt;1&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;curl_setopt&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$curl&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CURLOPT_COOKIE&lt;/span&gt;&lt;span class="php-hl-code"&gt; , &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;PHPSESSID=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-var"&gt;$_COOKIE&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;PHPSESSID&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-var"&gt;$status&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;curl_exec&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$curl&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;if&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;curl_errno&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$curl&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-var"&gt;$status&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;curl_close&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$curl&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;if&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$status&lt;/span&gt;&lt;span class="php-hl-code"&gt;!=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;yes&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;die&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Основная идея заключается в том, что мы запрашиваем статус аутентификации пользователя передавая серверу посредством CURL его идентификатор сессии.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/Tqtnaf37Gqo" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
70efdf2ec9b086079795c442636b55fb0716d9708d321ffb6a00818614779e779925365c</guid>
<feedburner:origLink>http://resurtm.kz/yii-kfm-authentication</feedburner:origLink></item>
<item>
<title>
Реестр в Yii</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/btjaLHxYIJw/registry-in-yii</link>
<pubDate>
Tue, 27 Sep 2011 21:32:36 +0600</pubDate>
<description>&lt;h2&gt;Введение&lt;/h2&gt;

&lt;p&gt;Это вольный перевод вики-статьи &lt;a href="http://yiiframework.com/wiki/242/yii-registry-how-to-use-it-is-it-exists-at-all/"&gt;Yii registry, how to use it, is it exists at all&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Время от времени люди интересуются использованием реестра в том или ином фреймворке. Если вы использовали ранее, например, Zend Framework, то более чем вероятно, что пользовались кодом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Zend_Registry&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;get&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;paramName&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Zend_Registry&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;set&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;paramName&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;Реестр в Yii&lt;/h2&gt;

&lt;p&gt;В Yii тоже существует своя реализация реестра. Изменить существующее или задать новое значение реестра можно так:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;paramName&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;paramValue&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Получить значение из реестра можно следующим образом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;paramName&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Получение всех значений реестра:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;getParams&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Можно использовать удобный класс &lt;a href="http://yiiframework.com/doc/api/CVarDumper"&gt;CVarDumper&lt;/a&gt;:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;CVarDumper&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;dump&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;getParams&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-number"&gt;10&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Если вы используете &lt;code&gt;CVarDumper&lt;/code&gt;, то вывод будет выглядеть примерно так:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;CAttributeCollection&lt;/span&gt;&lt;span class="php-hl-comment"&gt;#&lt;/span&gt;&lt;span class="php-hl-comment"&gt;1&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;caseSensitive&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CMap&lt;/span&gt;&lt;span class="php-hl-code"&gt;:&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;_d&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;abc&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-number"&gt;123&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;a&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-number"&gt;123&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;c&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-number"&gt;1316855672&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;d&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CMap&lt;/span&gt;&lt;span class="php-hl-code"&gt;:&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;_r&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;false&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CComponent&lt;/span&gt;&lt;span class="php-hl-code"&gt;:&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;_e&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;null&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CComponent&lt;/span&gt;&lt;span class="php-hl-code"&gt;:&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;_m&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;null&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Возможно и массовое присваивание значений посредством массива:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;setParams&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;a&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-number"&gt;123&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;c&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;time&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;d&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Для удаления можно воспользоваться стандартной функцией unset:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;unset&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;abc&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;CMap&lt;/h2&gt;

&lt;p&gt;Т.к. атрибут &lt;code&gt;params&lt;/code&gt; является экземляром класса &lt;a href="http://yiiframework.com/doc/api/CMap"&gt;CMap&lt;/a&gt;, то мы имеем в наличии множество методов, которые упрощают нам работу в целом.&lt;/p&gt;

&lt;p&gt;Общее количество установленных значений (для примера выше распечатает значение 4):&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;getCount&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Код выше делает тоже самое, что и примеры ниже.&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;count&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;count&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Можно получить только перечень ключей реестра:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;keys&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Вызов выше возвратит массив со следующим содержимым:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;0&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;abc&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;
&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;1&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;a&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;
&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;2&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;c&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;
&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;3&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt; &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;d&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Функция &lt;code&gt;unset&lt;/code&gt; уже была упомянута выше, но тем не менее удалять значения можно и так:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;remove&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;abc&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Удаление вообще всех значений в реестре:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;params&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;clear&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;Совет №1&lt;/h2&gt;

&lt;p&gt;Получение значения атрибута вызовом &lt;code&gt;-&amp;gt;params&lt;/code&gt; является тем же самым, что и вызов метода &lt;code&gt;-&amp;gt;getParams()&lt;/code&gt;.
Присваивание значения атрибуту в виде &lt;code&gt;params['sdf']=$val&lt;/code&gt; является тем же самым, что и вызов метода &lt;code&gt;setParams('sdf', $val)&lt;/code&gt;. Это правило действует и для всего фреймворка в целом: магический метод выполняет всю магию сам. Просто добавьте к классу, который был унаследован от CComponent, метод &lt;code&gt;getSomething&lt;/code&gt; и вы сможете использовать одноименный атрибут &lt;code&gt;something&lt;/code&gt;, получать и присваивать значения которого можно так:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$object&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;something&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-number"&gt;100&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-var"&gt;$object&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;something&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;Совет №2&lt;/h2&gt;

&lt;p&gt;Для многих это тривиально и просто, но начальные значения реестра задаются в конфигурационном файле приложения (обычно им является &lt;code&gt;config/main.php&lt;/code&gt;):&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; ...&lt;/span&gt;
    &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;params&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;abc&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-number"&gt;123&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; ...&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Начальные параметры можно выделить в отдельный конфигурационный файл &lt;code&gt;params.php&lt;/code&gt;, а затем можно просто подключить его из основного конфигурационного файла. Для PHP версии 5.3 или выше:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;params&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;require&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;__DIR__&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;/params.php&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Для PHP версии ниже 5.3:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;params&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;require&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;dirname&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;__FILE__&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;/params.php&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Файл &lt;code&gt;config/params.php&lt;/code&gt; будет содержать следующий код:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;abc&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; =&amp;gt;&lt;/span&gt;&lt;span class="php-hl-number"&gt;123&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/btjaLHxYIJw" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
c74d97b01eae257e44aa9d5bade97baf1574bddb75c78a6fd2251d61e2993b5146201319</guid>
<feedburner:origLink>http://resurtm.kz/registry-in-yii</feedburner:origLink></item>
<item>
<title>
Как отображать статичные страницы в Yii?</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/fRANsj_HZm4/yii-static-pages</link>
<pubDate>
Mon, 15 Aug 2011 13:54:37 +0600</pubDate>
<description>&lt;p&gt;Данная заметка является вольным переводом вики-статьи &lt;a href="http://yiiframework.com/wiki/22/how-to-display-static-pages-in-yii"&gt;How to display static pages in Yii&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;В веб приложениях нам часто нужно создавать такие страницы, как «Об этом сайте» или «Правовая информация», содержимое которых по большей части статичное. Существует несколько подходов.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Можно хранить такие страницы в виде простых отдельных HTML файлов. Веб сервер будет отправлять такие страницы напрямую конечным пользователям минуя PHP. Недостаток данного подхода заключается в том, что в этом случае поддержка общего шаблона и кода между такими статичными и другими динамическими страницами сайта очень сильно усложняется.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Другим способом решения проблемы является написание новых экшнов контроллера, соответствующих каждой новой странице. Это решает проблему с общим шаблоном, однако процесс сводится к рутине: каждый раз мы должны писать новый экшн для каждой страницы, который ничего, кроме вывода шаблона и не делает (противоречие принципу DRY).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Мы можем воспользоваться стандартным классом фреймворка &lt;a href="http://yiiframework.com/doc/api/CViewAction"&gt;CViewAction&lt;/a&gt; для создания таких страниц. Данная заметка описывает именно этот подход.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Для начала в контроллере по умолчанию &lt;code&gt;SiteController&lt;/code&gt; (или в любом другом контроллере, который вам нужен) переопределите метод &lt;code&gt;actions()&lt;/code&gt;:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;public&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;actions&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;page&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
            &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;class&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;CViewAction&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Код выше определяет внешний экшн &lt;code&gt;page&lt;/code&gt; у текущего контроллера, классом которого является &lt;a href="http://yiiframework.com/doc/api/CViewAction"&gt;CViewAction&lt;/a&gt;. Добавление внешних экшнов контроллеров описано &lt;a href="http://yiiframework.com/doc/guide/basics.controller"&gt;в руководстве&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Затем создайте директорию &lt;code&gt;protected/views/site/pages&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Ну и наконец создайте для каждой статической страницы PHP файл в этой директории. Например, страницу «Об этом сайте» мы можем сохранить как &lt;code&gt;about.php&lt;/code&gt;. Имейте ввиду, что такие страницы будут использовать шаблон по умолчанию самого приложения. Поэтому в каждом файле нужно сохранять только основное содержимое страницы.&lt;/p&gt;

&lt;p&gt;Мы закончили! Наша страница &lt;code&gt;about&lt;/code&gt; должна быть доступна данной ссылке:&lt;/p&gt;

&lt;pre&gt;http://www.example.com/index.php?r=site/page&amp;amp;view=about
&lt;/pre&gt;

&lt;p&gt;Для того, чтобы украсить ссылку можно воспользоваться подходом, описанным &lt;a href="http://yiiframework.com/doc/guide/topics.url"&gt;в руководстве&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Если у нас имеется множество страниц, то мы можем разместить их в под-директориях в &lt;code&gt;protected/views/site/pages&lt;/code&gt;. Страница, которая расположена на диске в директории &lt;code&gt;protected/views/site/pages/help/contact.php&lt;/code&gt; будет доступна по ссылке:&lt;/p&gt;

&lt;pre&gt;http://www.example.com/index.php?r=site/page&amp;amp;view=help.contact
&lt;/pre&gt;

&lt;p&gt;Если CViewAction работает не так, как вам нужно, то его поведение можно изменить. Более подробно класс &lt;a href="http://yiiframework.com/doc/api/CViewAction"&gt;CViewAction&lt;/a&gt; описан в документации по API фреймворка.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/fRANsj_HZm4" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
9bf31c7ff062936a96d3c8bd1f8f2ff3f1abd670358e036c31296e66b3b66c382ac00812</guid>
<feedburner:origLink>http://resurtm.kz/yii-static-pages</feedburner:origLink></item>
<item>
<title>
Расширяемая структура директорий в Yii</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/rYJCSBVhklA/extensible-yii-directory-structure</link>
<pubDate>
Sat, 13 Aug 2011 17:51:44 +0600</pubDate>
<description>&lt;p&gt;Это адаптированный вольный перевод вики-статьи &lt;a href="http://yiiframework.com/wiki/155/the-directory-structure-of-the-yii-project-site/"&gt;The directory structure of the Yii project site&lt;/a&gt;. Дополнения и багфиксы приветствуются.&lt;/p&gt;

&lt;p&gt;В этой статье мы опишем структуру директорий, которая используется официальным сайтом &lt;a href="http://yiiframework.com/"&gt;фреймворка Yii&lt;/a&gt;. Возможно, данная структура директорий выглядит сложно для маленьких проектов или неоптимально в каких-то иных случаях, однако мы точно уверены в том, что она хорошо подходит для средних и крупных проектов с участием нескольких разработчиков. Более того мы успешно используем такую структуру в нескольких других крупных проектах.&lt;/p&gt;

&lt;h2&gt;Общая структура&lt;/h2&gt;

&lt;p&gt;Ниже приведена полная структура директорий, которую мы будем использовать:&lt;/p&gt;

&lt;pre&gt;/
    backend/
    common/
        components/
        config/
            params.php
            params-local.php *
        lib/
            Pear/
            yii/
            Zend/
        migrations/
        models/
            Comment.php
            Extension.php
            ...
    console/
        commands/
            SitemapCommand.php
            ...
        config/
            main.php
            main-local.php *
            params.php
            params-local.php *
        runtime/
        yiic.php *
    frontend/
        components/
        config/
            main.php
            main-local.php *
            params.php
            params-local.php *
        controllers/
            SiteController.php
            ...
        lib/
        models/ 
            ContactForm.php
            SearchForm.php      
        runtime/
        views/
            layouts/
            site/
        www/
            assets/
            css/
            js/
            index.php *
    yiic
    yiic.bat
&lt;/pre&gt;

&lt;p&gt;В командной разработке мы должны использовать какую-либо систему контроля версий (git, Subversion, Mercurial и т.д.) для кода разрабатываемого проекта. Файлы, помеченные звездочками в структуре директорий выше, не должны находиться в репозитории системы контроля версий (почему, поясняется ниже).&lt;/p&gt;

&lt;h2&gt;Директории верхнего уровня&lt;/h2&gt;

&lt;p&gt;На верхнем уровне мы имеем 4 директории:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;backend&lt;/code&gt;: приложение-бэкэнд предназначенное для управления и администрирования всей системы;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;frontend&lt;/code&gt;: приложение-фронтенд, которое содержит в себе основной функционал системы для конечных пользователей;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;console&lt;/code&gt;: консольное приложение с консольными командами;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;common&lt;/code&gt;: директория, содержащая все те вещи, которые используются в более чем одном приложении системы.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Мы делим всю систему на три приложения: &lt;code&gt;backend&lt;/code&gt;, &lt;code&gt;frontend&lt;/code&gt; и &lt;code&gt;console&lt;/code&gt;. Если появится необходимость в добавлении нового приложения (например, приложение &lt;code&gt;api&lt;/code&gt;, которое будет предоставлять API сайта в виде веб-сервиса), то нужно просто добавить новую директорию верхнего уровня с нужной внутренней структурой директорий. Директорию &lt;code&gt;common&lt;/code&gt; мы используем для хранения файлов, которые будут использоваться в нескольких приложениях проекта.&lt;/p&gt;

&lt;h3&gt;Директории приложений&lt;/h3&gt;

&lt;p&gt;Структуры директорий всех приложений схожи. Приложения &lt;code&gt;frontend&lt;/code&gt; и &lt;code&gt;backend&lt;/code&gt; имеют следующие директории:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;components&lt;/code&gt;: содержит компоненты (хелперы и виджеты) которые используются только в данном приложении;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;config&lt;/code&gt;: настройки приложения;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;controllers&lt;/code&gt;: тут находятся контроллеры приложения;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lib&lt;/code&gt;: здесь размещаются сторонние библиотеки, используемые только в данном приложении;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;models&lt;/code&gt;: содержит в себе модели классов, специфичные для данного приложения;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;runtime&lt;/code&gt;: хранит динамически генерируемые файлы во время выполнения приложения;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;views&lt;/code&gt;: тут находятся шаблоны действий контроллеров;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;www&lt;/code&gt;: корневая директория хоста веб-сервера данного приложения.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Структура директорий консольного приложения &lt;code&gt;console&lt;/code&gt; выглядит иначе, потому как это приложение не нуждается в контроллерах, шаблонах и директории хоста веб-сервера (&lt;code&gt;controllers&lt;/code&gt;, &lt;code&gt;views&lt;/code&gt; и &lt;code&gt;www&lt;/code&gt; соответственно). В отличие от других приложений консольное приложение содержит директорию &lt;code&gt;commands&lt;/code&gt; в которой находятся файлы классов консольных команд.&lt;/p&gt;

&lt;h3&gt;Общая директория&lt;/h3&gt;

&lt;p&gt;Общая директория &lt;code&gt;common&lt;/code&gt; содержит файлы, которые используются в нескольких приложениях. Например, каждому приложению требуется доступ к базе данных посредством ActiveRecord. Потому, мы должны хранить классы ActiveRecord моделей в общей директории &lt;code&gt;common&lt;/code&gt;. Аналогичным образом дело обстоит и с хелперами и виджетами, которые используются более чем в одном приложении. Они тоже должны быть помещены в директорию &lt;code&gt;common&lt;/code&gt; для того, чтобы избежать ненужного дублирования кода.&lt;/p&gt;

&lt;p&gt;Чтобы упростить поддержку кода, организация структуры директорий в &lt;code&gt;common&lt;/code&gt; примерно такая же, как и в приложениях. Например, вполне возможно, что там будут такие директории, как &lt;code&gt;components&lt;/code&gt;, &lt;code&gt;models&lt;/code&gt;, &lt;code&gt;lib&lt;/code&gt; и прочие.&lt;/p&gt;

&lt;p&gt;Чуть ниже будет рассказано о том, что приложения могут разделять между собой и конфигурации. Следовательно, мы должны хранить общие настройки в директории &lt;code&gt;common&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Во время создания крупных проектов с длинным циклом разработки нам периодически приходится менять структуру базы данных. Потому мы используем функционал миграций базы данных для того, чтобы следить за изменениями в ней. Мы храним все эти миграции базы данных в директории &lt;code&gt;migrations&lt;/code&gt; внутри общей директории &lt;code&gt;common&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Конфигурации приложений&lt;/h2&gt;

&lt;p&gt;Приложения одной системы обычно разделяют некоторые общие настройки, такие, как параметры соединения с базой данных, параметры-переменные приложения и прочие. Для того, чтобы предовратить повторение кода, мы должны вычленить эти общие настройки из приложений и начать хранить их в одном общем месте. В нашем случае мы будем хранить их в директории &lt;code&gt;config&lt;/code&gt; внутри &lt;code&gt;common&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Разные разработчики одного проекта могут иметь разные рабочие окружения (операционные системы, настройки соединения с базой данных, директория проекта могут быть разными). Среда боевого сервера также отлична от сред разработчиков. Для того, чтобы разработчики не мешали друг другу особенностями своих сред, мы разделяем конфигурацию каждого приложения на две части: базовая конфигурация (например, &lt;code&gt;main.php&lt;/code&gt; и &lt;code&gt;params.php&lt;/code&gt;) и локальная конфигурация (например, &lt;code&gt;main-local.php&lt;/code&gt; и &lt;code&gt;params-local.php&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Базовая конфигурация должна храниться в системе контроля версий кода таким же образом, как и обычный файл исходного кода. Базовая конфигурация должна быть разделена между всеми разработчиками.&lt;/p&gt;

&lt;p&gt;Локальная конфигурация не должна помещаться в систему контроля версий кода и может существовать только в рабочей директории каждого разработчика. Разработчик имеет полную свободу действий в его локальном конфигурационном файле.&lt;/p&gt;

&lt;p&gt;Для слияния базовой и локальной конфигураций в бутстрап-скрипте &lt;code&gt;index.php&lt;/code&gt; мы можем воспользоваться следующим кодом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;require&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;path/to/yii.php&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-var"&gt;$local&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;require&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;path/to/main-local.php&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-var"&gt;$base&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;require&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;path/to/main.php&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-var"&gt;$config&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;CMap&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;mergeArray&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$base&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$local&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;createApplication&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$config&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;run&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2&gt;Алиасы путей&lt;/h2&gt;

&lt;p&gt;Для того, чтобы облегчить обращение к файлам других приложений мы можем создать корневой алиас пути &lt;code&gt;site&lt;/code&gt; который указывает на корневую директорию всей системы с 4 приложениями в ней. В результате мы можем использовать алиас &lt;code&gt;site.frontend.models.ContactForm&lt;/code&gt; для того, чтобы указать на класс &lt;code&gt;ContactForm&lt;/code&gt; который был объявлен в приложении &lt;code&gt;frontend&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;Развертывание&lt;/h2&gt;

&lt;p&gt;В процессе разработки или после завершения проекта нам приходится разворачивать его на боевом сервере. Вместо того, чтобы просто закачивать файлы посредством FTP или другого сетевого протокола мы можем воспользоваться системой контроля версий для более удобного развертывания системы.&lt;/p&gt;

&lt;p&gt;Боевой сервер можно рассматривать как отдельного разработчика, средой разработки которого и является сам сервер.&lt;/p&gt;

&lt;p&gt;Для начала мы чекаутим новую или обновляем уже существующую рабочую копию из системы контроля версий в нужное место на боевом сервере.&lt;/p&gt;

&lt;p&gt;Затем мы создаем или изменяем локальную конфигурацию, специфичную для боевого сервера (задатем параметры соединения с базой данных, например). Также возможно нам понадобится установить значение константы &lt;code&gt;YII_DEBUG&lt;/code&gt; в ложное значение в бутстрап-файле &lt;code&gt;index.php&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Потому как каждое приложение мы держим в отдельных директориях то, при необходимости все приложения можно развернуть на разных физических серверах.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/rYJCSBVhklA" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
6512bd43d9caa6e02c990b0a82652dca17ba0791499db908433b80f37c5fbc89b870084b</guid>
<feedburner:origLink>http://resurtm.kz/extensible-yii-directory-structure</feedburner:origLink></item>
<item>
<title>
Возможный способ ускорения работы PHPUnit тестов</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/hwASwDoVRLQ/phpunit-performance</link>
<pubDate>
Sat, 13 Aug 2011 17:49:46 +0600</pubDate>
<description>&lt;p&gt;Если в файле &lt;code&gt;phpunit.xml&lt;/code&gt; директории для тестирования (XPath: /phpunit/filter) указывать через whitelist, а не через blacklist путем запрета тестирования определенных директорий, то можно хорошо ускорить процесс тестирования приложения.&lt;/p&gt;

&lt;p&gt;Например вот так будет довольно медленно:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="xml-hl-main"&gt;&lt;pre&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;xml&lt;/span&gt; &lt;span class="xml-hl-var"&gt;version&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;1.0&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt; &lt;span class="xml-hl-var"&gt;encoding&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;UTF-8&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;?&amp;gt;&lt;/span&gt;
&lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;phpunit&lt;/span&gt; &lt;span class="xml-hl-var"&gt;bootstrap&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;bootstrap.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt; &lt;span class="xml-hl-var"&gt;colors&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;false&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt; &lt;span class="xml-hl-var"&gt;convertErrorsToExceptions&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;true&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt; &lt;span class="xml-hl-var"&gt;convertNoticesToExceptions&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;true&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;
        &lt;span class="xml-hl-var"&gt;convertWarningsToExceptions&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;true&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt; &lt;span class="xml-hl-var"&gt;stopOnFailure&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;false&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;selenium&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;browser&lt;/span&gt; &lt;span class="xml-hl-var"&gt;name&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;Firefox&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt; &lt;span class="xml-hl-var"&gt;browser&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;*firefox&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="xml-hl-comment"&gt;&amp;lt;!--&lt;/span&gt;&lt;span class="xml-hl-comment"&gt;&amp;lt;browser name=&amp;quot;Internet Explorer&amp;quot; browser=&amp;quot;*iexplore&amp;quot;/&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-comment"&gt;--&amp;gt;&lt;/span&gt;
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;selenium&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
 
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;filter&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;blacklist&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt; &lt;span class="xml-hl-var"&gt;suffix&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-code"&gt;C:/php&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt; &lt;span class="xml-hl-var"&gt;suffix&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-code"&gt;../../common&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt; &lt;span class="xml-hl-var"&gt;suffix&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-code"&gt;../../framework&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt; &lt;span class="xml-hl-var"&gt;suffix&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-code"&gt;../forms&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt; &lt;span class="xml-hl-var"&gt;suffix&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-code"&gt;../tests&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;blacklist&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;filter&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
 
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;logging&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;log&lt;/span&gt; &lt;span class="xml-hl-var"&gt;type&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;coverage-html&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt; &lt;span class="xml-hl-var"&gt;target&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;./report&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;logging&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;phpunit&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Вывод Ant:&lt;/p&gt;

&lt;pre&gt;Buildfile: C:\_work\eclipse\anotherproject.kz\build.xml
props:
unit-tests:
     [echo] Running unit tests.
     [exec] PHPUnit 3.5.13 by Sebastian Bergmann.
     [exec] ................................................................. 65 / 82 ( 79%)
     [exec] .................
     [exec] Time: 21 seconds, Memory: 20.75Mb
     [exec] OK (82 tests, 2998 assertions)
     [exec] Generating code coverage report, this may take a moment.
BUILD SUCCESSFUL
Total time: 33 seconds
&lt;/pre&gt;

&lt;p&gt;А вот так уже гораздо быстрее:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="xml-hl-main"&gt;&lt;pre&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;filter&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;whitelist&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt; &lt;span class="xml-hl-var"&gt;suffix&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-code"&gt;../models&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="xml-hl-brackets"&gt;&amp;lt;&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt; &lt;span class="xml-hl-var"&gt;suffix&lt;/span&gt;&lt;span class="xml-hl-code"&gt;=&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-string"&gt;.php&lt;/span&gt;&lt;span class="xml-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;span class="xml-hl-code"&gt;../components&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;directory&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;whitelist&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="xml-hl-brackets"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="xml-hl-reserved"&gt;filter&lt;/span&gt;&lt;span class="xml-hl-brackets"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Вывод Ant:&lt;/p&gt;

&lt;pre&gt;     [exec] Generating code coverage report, this may take a moment.
BUILD SUCCESSFUL
Total time: 21 seconds
&lt;/pre&gt;

&lt;p&gt;Суть проблемы заключается в том, что в MS Windows PHPUnit сравнительно долго парсит богатые на PHP файлы директории, указанные в blacklist (в моем случае там было указано все, что находилось в include_path, а внутри было много тяжелого). blacklist стоит избегать.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/hwASwDoVRLQ" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
aab3238922bcc25a6f606eb525ffdc56fa35e192121eabf3dabf9f5ea6abdbcbc107ac3b</guid>
<feedburner:origLink>http://resurtm.kz/phpunit-performance</feedburner:origLink></item>
<item>
<title>
Yii 1.1 Application Development Cookbook</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/8zk3_Mp5y0k/yii-cookbook</link>
<pubDate>
Sat, 13 Aug 2011 15:45:20 +0600</pubDate>
<description>&lt;p&gt;Прикупил примерно месяц назад электронный RAW вариант книги &lt;a href="http://yiicookbook.org/"&gt;Yii 1.1 Application Development Cookbook&lt;/a&gt;. Очень хороший сборник рецептов для тех, кому интересны именно наборы tips'n'tricks'ов и улучшение навыков через готовые хорошие примеры.&lt;/p&gt;

&lt;p&gt;Начинающим пользователям Yii книжка вряд ли подойдет, а вот тем, кто уже сделал пару проектов на нем — в самый раз.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://yiicookbook.org/"&gt;&lt;img src="/content/images/yii-cookbook/yii-cookbook.jpg" alt="Yii 1.1 Application Development Cookbook"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ждем финального релиза в сентябре. Рекомендую всем Yii'стам. :-)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPD:&lt;/strong&gt; &lt;a href="http://yiicookbook.org/"&gt;Книга&lt;/a&gt; &lt;a href="http://rmcreative.ru/blog/post/yii-1.1-application-development-cookbook--finalnaja-versija"&gt;наконец&lt;/a&gt; &lt;a href="http://habrahabr.ru/blogs/yii/127106/"&gt;релизнулась&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/8zk3_Mp5y0k" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
c20ad4d76fe97759aa27a0c99bff67107b52009b64fd0a2a49e6d8a939753077792b0554</guid>
<feedburner:origLink>http://resurtm.kz/yii-cookbook</feedburner:origLink></item>
<item>
<title>
Работа с кукисами в Yii</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/nn3QNSkaRmA/working-with-cookies-in-yii</link>
<pubDate>
Thu, 11 Aug 2011 20:36:53 +0600</pubDate>
<description>&lt;p&gt;Это адаптированный перевод wiki-страницы &lt;a href="http://www.yiiframework.com/wiki/152/cookie-management-in-yii/"&gt;Cookie management in Yii&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Работать с кукисами в Yii достаточно просто, но этот процесс может показаться не таким простым людям, которые только начали изучать этот фреймворк. Данная заметка предназначена для того, чтобы развеять все сомнения по поводу кукисов.&lt;/p&gt;

&lt;h2&gt;Работа с кукисами&lt;/h2&gt;

&lt;h3&gt;Чтение кукисов&lt;/h3&gt;

&lt;p&gt;Чтобы прочитать одно значение из кукисов воспользуйтесь следующим кодом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;value&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3&gt;Запись кукисов&lt;/h3&gt;

&lt;p&gt;Записать одно значение в кукисы можно следующим образом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;new&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;CHttpCookie&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$value&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Имейте ввиду, что название значения используется дважды. Один раз в конструкторе класса CHttpCookie и во второй раз в ассоциативном массиве cookies.&lt;/p&gt;

&lt;h3&gt;Удаление кукисов&lt;/h3&gt;

&lt;p&gt;Значение в кукисах можно удалить так:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;unset&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Удалить вообще все значения в кукисах можно так:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;clear&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Имейте ввиду, что кукисы не будут удалены до следующей перезагрузки страницы вашего сайта.&lt;/p&gt;

&lt;h2&gt;Что нужно помнить?&lt;/h2&gt;

&lt;h3&gt;Значения кукисов — это объекты&lt;/h3&gt;

&lt;p&gt;Значения кукисов в Yii хранятся в объектах класса CHttpCookie. Для того, чтобы получить реальное значение из кукисов нужно воспользоваться атрибутом value класса CHttpCookie. Если вы не сделаете этого, то получите ошибку или предупреждение о том, что объект класса CHttpCookie не может быть сконвертирован в строку.&lt;/p&gt;

&lt;h3&gt;Безопасное чтение&lt;/h3&gt;

&lt;p&gt;Так как уже было сказано о том, что кукисы в Yii — это объекты класса CHttpCookie, то в том случае, если нужного значения в кукисах не существует, то и соответствующий объект не будет создан. При попытке получить значение атрибута null-объекта произойдет ошибка Trying to get property of non-object. Чтобы обойти это всегда рекомендуется использовать тернарный оператор для чтения:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;isset&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;value&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt; ?
    &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;value&lt;/span&gt;&lt;span class="php-hl-code"&gt; : &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Таким образом вы получите или нужное значение, или, в крайнем случае, просто пустую строку.&lt;/p&gt;

&lt;p&gt;Код ниже показывает основной способ проверки того, существует ли определенное значение кукисов:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$is_cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt; = !&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;isset&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;value&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3&gt;Перезагрузка страницы&lt;/h3&gt;

&lt;p&gt;Помните, что в действительности сервер ничего сам не делает с кукисами. Он только информирует браузер (в HTTP ответе) о том, что кукисы каким-то образом изменились. Браузер отвечает за большую часть работы с кукисами.&lt;/p&gt;

&lt;p&gt;Поэтому значение кукисов изменится только после следующей загрузки страницы. Если вы установите значение кукисов в каком-то месте в коде, а потом попытаетесь получить его несколькими линиями ниже, то вы получите или пустое значение, или ошибку.&lt;/p&gt;

&lt;p&gt;Это, разумеется, касается и модификации, и удаления значений кукисов, которые также требуют перезагрузки страницы для успешного завершения. Распространенная ошибка заключается в том, что когда, например, происходит разработка корзины в интернет-магазине многие пытаются удалить кукисы, а затем после этого делать проверку на существование значения. Это не будет работать: значение кукисов не удалится до следующей перезагрузки страницы.&lt;/p&gt;

&lt;h3&gt;Проблема истечения кукисов&lt;/h3&gt;

&lt;p&gt;Если вы установите кукисы так, как показано в примерах выше, то они будут автоматически удалены как только вы закроете браузер (или не удалите значение кукисов вручную). Еще раз — это работа браузера, а не сервера. Вы должны закрыть все окна браузера, потому как только тогда все кукисы будут удалены.&lt;/p&gt;

&lt;p&gt;Для того, чтобы предовратить удаление кукисов после закрытия окна браузера (примерно так, как это сделано в форме логина сайта Yii, после аутентификации в которой кукисы сохраняются на следующие 30 дней) вы должны установить их срок истечения. Пример:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-var"&gt;$cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;new&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;CHttpCookie&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$value&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-var"&gt;$cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;expire&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;time&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;+&lt;/span&gt;&lt;span class="php-hl-number"&gt;60&lt;/span&gt;&lt;span class="php-hl-code"&gt;*&lt;/span&gt;&lt;span class="php-hl-number"&gt;60&lt;/span&gt;&lt;span class="php-hl-code"&gt;*&lt;/span&gt;&lt;span class="php-hl-number"&gt;24&lt;/span&gt;&lt;span class="php-hl-code"&gt;*&lt;/span&gt;&lt;span class="php-hl-number"&gt;180&lt;/span&gt;&lt;span class="php-hl-code"&gt;; 
&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;request&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookies&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;[&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;cookie_name&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;]&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-var"&gt;$cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Как видите мы устанавливаем дату истечения относительно текущего времени (первый подводный камень) и в виде UNIX timestamp, а не в виде форматированных даты и времени (второй подводный камень). Потому в примере выше мы используем PHP функцию time().&lt;/p&gt;

&lt;p&gt;Мы считаем время истечения только в секундах (третий подводный камень), потому в примере выше дата будет равняться текущему времени плюс 180 дней (15 552 000 секунд). Для программиста, разумеется, понятнее будет если мы запишем эти полгода в виде математического выражения, а не просто в виде одного числа.&lt;/p&gt;

&lt;p&gt;Количество секунд в разных, часто используемых, временных единицах:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;час: 3 600 секунд;&lt;/li&gt;
&lt;li&gt;день: 86 400 секунд;&lt;/li&gt;
&lt;li&gt;неделя: 6 048 000 секунд;&lt;/li&gt;
&lt;li&gt;месяц (30 дней): 2 592 000 секунд;&lt;/li&gt;
&lt;li&gt;полгода (6 месяцев по 30 дней): 15 552 000 секунд;&lt;/li&gt;
&lt;li&gt;год (12 месяцев по 30 дней): 31 104 000 секунд.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Кукисы в Javascript&lt;/h2&gt;

&lt;p&gt;Обычно, вы имеете доступ к вашим кукисам как из PHP кода, так и из Javascript кода. Так как Javascript выполняется в браузере, то и проблем с перезагрузкой страниц здесь нет.&lt;/p&gt;

&lt;h3&gt;httpOnly&lt;/h3&gt;

&lt;p&gt;Атрибут CHttpCookie.httpOnly определяет то, является ли значение кукисов доступным только в PHP коде. Значение по умолчанию «ложь» (false). При установке этого значения в «истину» (true) вы повышаете безопасность вашего приложения (это предовращает возможность получения значения кукисов посредством XSS), но ваши кукисы не будут доступны из Javascript.&lt;/p&gt;

&lt;h3&gt;jQuery&lt;/h3&gt;

&lt;p&gt;Если вы используете jQuery в своих проектах, то существует специальный плагин для работы с кукисами. Плагин jquery.cookie.js поставляется вместе с Yii и очень сильно упрощает работу с кукисами из Javascript. Пример установки значения кукисов:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-code"&gt;$.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;the_cookie&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;the_value&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Для того, чтобы получить значение из кукисов:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;var&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt; = $.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;the_cookie&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Удаление кукисов:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-code"&gt;$.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;the_cookie&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;null&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;В файле jquery.cookie.js содержится большее количество примеров и более подробная документация по его использованию.&lt;/p&gt;

&lt;h3&gt;Способ без использования jQuery&lt;/h3&gt;

&lt;p&gt;Если вы не используете jQuery в вашем приложении или по какой-то причине не хотите использовать специальный jQuery-плагин для работы с кукисами, то вы можете воспользоваться следующими двумя функциями:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;readCookie&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieName&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;var&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;theCookie&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;document&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;var&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;ind&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;theCookie&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;indexOf&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieName&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;var&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;ind1&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;theCookie&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;indexOf&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;ind&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;if&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;ind1&lt;/span&gt;&lt;span class="php-hl-code"&gt; == -&lt;/span&gt;&lt;span class="php-hl-number"&gt;1&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;ind1&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;theCookie&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;length&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
    &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;if&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;ind&lt;/span&gt;&lt;span class="php-hl-code"&gt; == -&lt;/span&gt;&lt;span class="php-hl-number"&gt;1&lt;/span&gt;&lt;span class="php-hl-code"&gt; || &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieName&lt;/span&gt;&lt;span class="php-hl-code"&gt; == &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
    &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;unescape&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;theCookie&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;substring&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;ind&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieName&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;length&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-number"&gt;1&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;ind1&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
 
&lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;setCookie&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieName&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieValue&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;nDays&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;var&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;today&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;new&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;Date&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;var&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;expire&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;new&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;Date&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
    &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;if&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;nDays&lt;/span&gt;&lt;span class="php-hl-code"&gt; == &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;null&lt;/span&gt;&lt;span class="php-hl-code"&gt; || &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;nDays&lt;/span&gt;&lt;span class="php-hl-code"&gt; == &lt;/span&gt;&lt;span class="php-hl-number"&gt;0&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;nDays&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-number"&gt;1&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
    &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;expire&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;setTime&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;today&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;getTime&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-number"&gt;3600000&lt;/span&gt;&lt;span class="php-hl-code"&gt; * &lt;/span&gt;&lt;span class="php-hl-number"&gt;24&lt;/span&gt;&lt;span class="php-hl-code"&gt; * &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;nDays&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
    &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;document&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookie&lt;/span&gt;&lt;span class="php-hl-code"&gt; = &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieName&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;escape&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;cookieValue&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;;expires=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; + &lt;/span&gt;&lt;span class="php-hl-identifier"&gt;expire&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;toGMTString&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Время в кукисах в Javascript задается в миллисекундах, потому не забываем домножать секунда на 1 000.&lt;/p&gt;

&lt;h2&gt;Дополнительная информация&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.yiiframework.com/doc/api/1.1/CHttpCookie/"&gt;документация класса&lt;/a&gt; CHttpCookie;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yiiframework.com/doc/api/1.1/CCookieCollection/"&gt;документация класса&lt;/a&gt; CCookieCollection;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.yiiframework.com/forum/index.php?/topic/15820-handling-cookies"&gt;ветка форума&lt;/a&gt; по работе с кукисами.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Дополнения, найденные неточности и ошибки в тексте приветствуются.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/nn3QNSkaRmA" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
d3d9446802a44259755d38e6d163e820b1d5781111d84f7b3fe45a0852e59758cd7a87e5</guid>
<feedburner:origLink>http://resurtm.kz/working-with-cookies-in-yii</feedburner:origLink></item>
<item>
<title>
Загружаем фикстуры в базу данных без тестирования в Yii</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/KoZ_sxYFSfg/yii-fixtures-without-testing</link>
<pubDate>
Mon, 01 Aug 2011 11:00:00 +0600</pubDate>
<description>&lt;h2&gt;Введение&lt;/h2&gt;

&lt;p&gt;Иногда, при работе над каким-нибудь Yii-проектом бывает необходимо по-быстрому загрузить &lt;a href="http://www.yiiframework.com/doc/guide/1.1/en/test.fixture"&gt;фикстуры&lt;/a&gt; без запуска тестов приложения. Тесты, например, могут быть очень тяжелыми и сложными, и, в следствие чего, выполняться будут сравнительно долго, а ждать не хочется. В стандартной поставке Yii возможности загрузить фикстуры без запуска тестов не предусмотрено, но можно самому себе упростить жизнь.&lt;/p&gt;

&lt;h2&gt;Подготовка&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/yii/downloads/list"&gt;скачиваем&lt;/a&gt; последнюю актуальную версию ветки 1.* фреймворка;&lt;/li&gt;
&lt;li&gt;создаем и настраиваем виртуальный хост приложения на локальном веб-сервере;&lt;/li&gt;
&lt;li&gt;распаковываем содержимое архива фреймворка в document root нового виртуального хоста;&lt;/li&gt;
&lt;li&gt;генерируем стандартное свежее Yii-приложение, выполнив команду &lt;code&gt;framework\yiic webapp .&lt;/code&gt; в document root директории;&lt;/li&gt;
&lt;li&gt;открываем в браузере наше свежее приложение по ссылке &lt;code&gt;http://domain.com/&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Теперь нужно создать таблицу, в которую мы будет загружать фикстуры:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;создайте в базе данных таблицу &lt;code&gt;tbl_post&lt;/code&gt; с тремя столбцами: &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;title&lt;/code&gt;, &lt;code&gt;content&lt;/code&gt;;&lt;/li&gt;
&lt;li&gt;установите правильные настройки соединения с базой данных в конфигурационных файлах &lt;code&gt;protected/config/main.php&lt;/code&gt; и &lt;code&gt;protected/config/console.php&lt;/code&gt; (компонент &lt;code&gt;db&lt;/code&gt; в разделе &lt;code&gt;components&lt;/code&gt;);&lt;/li&gt;
&lt;li&gt;включите в конфигурационном файле &lt;code&gt;protected/config/main.php&lt;/code&gt; кодогенератор &lt;code&gt;gii&lt;/code&gt; и установите пароль на доступ к нему;&lt;/li&gt;
&lt;li&gt;сгенерируйте модель для таблицы &lt;code&gt;tbl_post&lt;/code&gt; при помощи &lt;code&gt;gii&lt;/code&gt;, который находится по адресу &lt;code&gt;http://domain.com/index.php?r=gii&lt;/code&gt;, а внутри раздел &lt;code&gt;Model Generator&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Фикстуры и их загрузка&lt;/h2&gt;

&lt;p&gt;Создаем файл с фикстурами &lt;code&gt;tbl_post.php&lt;/code&gt; в директории &lt;code&gt;protected/tests/fixtures&lt;/code&gt; и пишем туда тестовые данные, которые мы хотим хранить в фикстурах и в будущем загружать в наши таблицы.&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-reserved"&gt;return&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;post1&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;id&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-number"&gt;1&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;title&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;First testing post&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;content&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;&amp;lt;p&amp;gt;Content&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;post2&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;id&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-number"&gt;2&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;title&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;Второй пост&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;content&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;&amp;lt;p&amp;gt;Контент&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;post3&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;id&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-number"&gt;3&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;title&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;3rd post&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;content&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;&amp;lt;p&amp;gt;Еще немного контента&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Не забываем добавить в конфигурационный файл консольного приложения настройки для менеджера фикстур базы данных &lt;code&gt;CDbFixtureManager&lt;/code&gt;. Атрибут &lt;code&gt;basePath&lt;/code&gt; компонента &lt;code&gt;CDbFixtureManager&lt;/code&gt; задает путь к директории, в которой хранятся фикстуры.&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;components&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
    &lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; другие компоненты&lt;/span&gt;
 
    &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;fixture&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;array&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;
        &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;class&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;system.test.CDbFixtureManager&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
        &lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;basePath&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;dirname&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;__FILE__&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;/../tests/fixtures&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,
&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Исходный код консольной команды для работы с базой данных и фикстурами выглядит следующим образом:&lt;/p&gt;

&lt;div class="hl-code"&gt;&lt;div class="php-hl-main"&gt;&lt;pre&gt;&lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; файл protected/commands/DbCommand.php&lt;/span&gt;
 
&lt;span class="php-hl-reserved"&gt;class&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;DbCommand&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;extends&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;CConsoleCommand&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
    &lt;span class="php-hl-reserved"&gt;public&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;function&lt;/span&gt; &lt;span class="php-hl-identifier"&gt;actionFixture&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$all&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$tables&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
    &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
        &lt;span class="php-hl-var"&gt;$fm&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;Yii&lt;/span&gt;&lt;span class="php-hl-code"&gt;::&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;app&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;fixture&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
        &lt;/span&gt;&lt;span class="php-hl-var"&gt;$fm&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;checkIntegrity&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;false&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
        &lt;/span&gt;&lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; читаем список таблиц из директории с фикстурами&lt;/span&gt;
        &lt;span class="php-hl-reserved"&gt;if&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$all&lt;/span&gt;&lt;span class="php-hl-code"&gt; &amp;amp;&amp;amp; !&lt;/span&gt;&lt;span class="php-hl-var"&gt;$tables&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
        &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
            &lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;Loading fixtures for all tables...&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="php-hl-special"&gt;\n&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
            &lt;/span&gt;&lt;span class="php-hl-var"&gt;$handle&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;opendir&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$fm&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;basePath&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
            &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;while&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$file&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;readdir&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$handle&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
            &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
                &lt;span class="php-hl-reserved"&gt;if&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$file&lt;/span&gt;&lt;span class="php-hl-code"&gt;==&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt; || &lt;/span&gt;&lt;span class="php-hl-var"&gt;$file&lt;/span&gt;&lt;span class="php-hl-code"&gt;==&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;..&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
                    &lt;span class="php-hl-reserved"&gt;continue&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
                &lt;/span&gt;&lt;span class="php-hl-var"&gt;$tables&lt;/span&gt;&lt;span class="php-hl-code"&gt;.=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;mb_substr&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$file&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-number"&gt;0&lt;/span&gt;&lt;span class="php-hl-code"&gt;, -&lt;/span&gt;&lt;span class="php-hl-number"&gt;4&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;,&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
            &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
            &lt;span class="php-hl-identifier"&gt;closedir&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$handle&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
            &lt;/span&gt;&lt;span class="php-hl-var"&gt;$tables&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;mb_substr&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$tables&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-number"&gt;0&lt;/span&gt;&lt;span class="php-hl-code"&gt;, -&lt;/span&gt;&lt;span class="php-hl-number"&gt;1&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
        &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
        &lt;span class="php-hl-reserved"&gt;else&lt;/span&gt;
            &lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;Loading fixtures for specified tables...&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="php-hl-special"&gt;\n&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
 
        &lt;/span&gt;&lt;span class="php-hl-comment"&gt;//&lt;/span&gt;&lt;span class="php-hl-comment"&gt; грузим данные в таблицы&lt;/span&gt;
        &lt;span class="php-hl-var"&gt;$tableNames&lt;/span&gt;&lt;span class="php-hl-code"&gt;=&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;explode&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;,&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;, &lt;/span&gt;&lt;span class="php-hl-var"&gt;$tables&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
        &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;foreach&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$tableNames&lt;/span&gt; &lt;span class="php-hl-reserved"&gt;as&lt;/span&gt; &lt;span class="php-hl-var"&gt;$tableName&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;
        &lt;span class="php-hl-brackets"&gt;{&lt;/span&gt;
            &lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-var"&gt;$tableName&lt;/span&gt;&lt;span class="php-hl-code"&gt;.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="php-hl-special"&gt;\n&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;&amp;quot;&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
            &lt;/span&gt;&lt;span class="php-hl-var"&gt;$fm&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;resetTable&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$tableName&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
            &lt;/span&gt;&lt;span class="php-hl-var"&gt;$fm&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;loadFixture&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-var"&gt;$tableName&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
        &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
 
        &lt;span class="php-hl-var"&gt;$fm&lt;/span&gt;&lt;span class="php-hl-code"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="php-hl-identifier"&gt;checkIntegrity&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;(&lt;/span&gt;&lt;span class="php-hl-reserved"&gt;true&lt;/span&gt;&lt;span class="php-hl-brackets"&gt;)&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
        &lt;/span&gt;&lt;span class="php-hl-reserved"&gt;echo&lt;/span&gt; &lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-string"&gt;Done.&lt;/span&gt;&lt;span class="php-hl-quotes"&gt;'&lt;/span&gt;&lt;span class="php-hl-code"&gt;;
    &lt;/span&gt;&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;
&lt;span class="php-hl-brackets"&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;Файл консольной команды должен находиться в директории &lt;code&gt;protected/commands&lt;/code&gt;. &lt;code&gt;DbCommand&lt;/code&gt; можно расширить на свой вкус различными плюшками. Например, можно добавить действие, которое очищает все или указанные таблицы в базе данных или действие, которое создает дамп всех таблиц базы данных в файл.&lt;/p&gt;

&lt;p&gt;Все, осталось только запустить нашу новую команду для работы с фикстурами:&lt;/p&gt;

&lt;pre&gt;C:\domain.com\www\protected&amp;gt;yiic db fixture
Loading fixtures for all tables...
tbl_post
Done.

C:\domain.com\www\protected&amp;gt;yiic db fixture --all
Loading fixtures for all tables...
tbl_post
Done.

C:\domain.com\www\protected&amp;gt;yiic db fixture --tables=tbl_post
Loading fixtures for specified tables...
tbl_post
Done.
&lt;/pre&gt;

&lt;p&gt;Полноценное приложение-пример со всем исходным кодом из рецепта можно &lt;a href="/content/files/yii-fixtures-without-testing/application.zip"&gt;скачать тут&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/KoZ_sxYFSfg" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
eccbc87e4b5ce2fe28308fd9f2a7baf377de68daecd823babbb58edb1c8e14d7106e83bb</guid>
<feedburner:origLink>http://resurtm.kz/yii-fixtures-without-testing</feedburner:origLink></item>
<item>
<title>
Much Ado About Traversal — траверс в Pyramid (перевод)</title>
<link>http://feedproxy.google.com/~r/resurtm/~3/cPuXU3diqmk/much-ado-about-traversal</link>
<pubDate>
Sun, 27 Mar 2011 11:00:00 +0600</pubDate>
<description>&lt;h2&gt;О переводе&lt;/h2&gt;

&lt;p&gt;
Это вольный перевод &lt;a href="http://blog.nonsequitarian.org/2010/much-ado-about-traversal/"&gt;полезной
статьи в&amp;nbsp;блоге Роба Миллера&lt;/a&gt; (Rob Miller) об&amp;nbsp;альтерантивном URL матчингу способе
обработки HTTP запросов в фреймворке Pyramid.
&lt;a href="http://docs.pylonsproject.org/projects/pyramid/1.0/narr/muchadoabouttraversal.html"&gt;Статья
также стала частью документации&lt;/a&gt; самого фреймворка. Читатель данной статьи должен обладать
определенным уровнем знаний и&amp;nbsp;иметь представления о&amp;nbsp;многих аспектах разработки.
&lt;/p&gt;

&lt;p&gt;
В&amp;nbsp;тексте используются более или менее устоявшиеся термины и&amp;nbsp;технические обороты. Если
вы&amp;nbsp;обнаружили неточность, логическую или еще какую-либо ошибку,
&lt;nobr&gt;то&amp;nbsp;&lt;a href="mailto:resurtm@gmail.com"&gt;автор перевода&lt;/a&gt;&lt;/nobr&gt; будет очень рад узнать
о&amp;nbsp;них. Дополнения и&amp;nbsp;конструктивная критика также приветствуются.
&lt;/p&gt;

&lt;h2&gt;Введение&lt;/h2&gt;

&lt;p&gt;
Обычно люди, которые долгое время работали с&amp;nbsp;Pylons или с&amp;nbsp;каким-либо другим фреймворком,
и&amp;nbsp;с&amp;nbsp;их роутингом URL немного удивляются тому, как устроена обработка и&amp;nbsp;роутинг HTTP
запросов в&amp;nbsp;Pyramid и таким понятиям, как траверс и&amp;nbsp;поиск представлений. Другие люди
считают, что траверс сложен для понимания. Кто-то думает, что траверс бесполезен, потому как они
успешно работали со&amp;nbsp;стандартным URL матчингом и&amp;nbsp;он&amp;nbsp;полностью подходил для
их&amp;nbsp;задач. Почему они должны переходить на&amp;nbsp;другой, более сложный, способ роутинга?
&lt;/p&gt;

&lt;p&gt;
Если вы&amp;nbsp;не&amp;nbsp;хотите понимать траверс, то&amp;nbsp;вы&amp;nbsp;можете обойтись без него. Можно без
проблем создавать Pyramid приложения и&amp;nbsp;без понимания этой концепции. Тем не&amp;nbsp;менее,
в&amp;nbsp;реальной разработке встречается множество задач, которые траверс решает изящнее и&amp;nbsp;лучше,
чем классический URL матчинг, основанный на&amp;nbsp;регулярных выражениях. Возможно,
вы&amp;nbsp;не&amp;nbsp;сталкивались с&amp;nbsp;такими ситуациями ранее, однако понимание их&amp;nbsp;может помочь
вам в&amp;nbsp;будущем. Траверс (traversal)&amp;nbsp;&amp;mdash; это, по&amp;nbsp;сути, метафора, легко понятная
тем, кто хорошо представляет себе суть директорий и&amp;nbsp;файлов в&amp;nbsp;них.
&lt;/p&gt;

&lt;h2&gt;URL диспетчер&lt;/h2&gt;

&lt;p&gt;
Вернемся к&amp;nbsp;классическому роутингу и&amp;nbsp;рассмотрим проблему, которую надо решить. HTTP запрос
с&amp;nbsp;адресом передается нашему приложению. Путь запроса повлечет за собой вызов специфичной
функции-представления внутри нашего приложения. Мы&amp;nbsp;пытаемся
определить, какую функцию-представление (если она существует) мы&amp;nbsp;должны вызвать для
текущего URL.
&lt;/p&gt;

&lt;p&gt;
Множество систем, в&amp;nbsp;том числе и&amp;nbsp;Pyramid, предлагают простое решение&amp;nbsp;&amp;mdash;
обычный URL матчинг. URL матчинг работает так, что парсит URL и&amp;nbsp;сравнивает результаты
с&amp;nbsp;множеством явно заданных шаблонов (элементов роутинга), заданных обычными регулярными
выражениями (или другим синтаксисом). Каждый такой шаблон (один элемент из&amp;nbsp;множества
правил роутера) связан с представлением. Если путь запроса соответствует какому-либо заданному
шаблону, то&amp;nbsp;вызывается связанная с&amp;nbsp;ним функция-представление. Если путь запроса
подходит сразу нескольким шаблонам, то&amp;nbsp;применяется несколько иная схема разрешения
конфликтов, обычно основанная на&amp;nbsp;том, что вызывается та&amp;nbsp;функция-представление,
которая совпала с&amp;nbsp;заданным путем запроса раньше и вызывается. Если из&amp;nbsp;всего множества
шаблонов, предопределенных разработчиком, не&amp;nbsp;подошел ни&amp;nbsp;один шаблон, то отдается
ответ &lt;tt&gt;404 Not Found&lt;/tt&gt;.
&lt;/p&gt;

&lt;p&gt;
В&amp;nbsp;Pyramid предлагается для использования реализация классического URL матчинга. Используя
синтаксис Pyramid мы&amp;nbsp;можем связать шаблон &lt;tt&gt;/{userid}/photos/{photoid}&lt;/tt&gt; с
функцией-представлением &lt;tt&gt;photo_view()&lt;/tt&gt;, которая определена в&amp;nbsp;коде. Запрос вида
&lt;tt&gt;/joeschmoe/photos/photo1&lt;/tt&gt; подойдет к&amp;nbsp;этому шаблону и&amp;nbsp;будет вызвана функция
&lt;tt&gt;photo_view()&lt;/tt&gt; для обработки запроса. Точно также шаблон
&lt;tt&gt;/{userid}/blog/{year}/{month}/{postid}&lt;/tt&gt; может быть привязан к&amp;nbsp;функции
&lt;tt&gt;blog_post_view()&lt;/tt&gt; и&amp;nbsp;запрос пути &lt;tt&gt;/joeschmoe/blog/2010/12/urlmatching&lt;/tt&gt;
вызовет функцию, которая наверное, знает, как найти и&amp;nbsp;отобразить запрошенный пост блога.
&lt;/p&gt;

&lt;h2&gt;Историческая справка&lt;/h2&gt;

&lt;p&gt;
Когда мы&amp;nbsp;немного освежили знания по&amp;nbsp;классическому URL диспетчеру мы&amp;nbsp;можем углубиться в
идею траверса. Перед тем, как мы&amp;nbsp;это сделаем давайте немного вспомним историю. Если вы&amp;nbsp;работали
некоторое время в&amp;nbsp;веб-разработке, то&amp;nbsp;вы, возможно, помните время, когда не&amp;nbsp;было таких
прекрасных фреймворков, как Pylons или Pyramid. Вместо этого, были HTTP серверы общего
назначения, которые работали просто как серверы файловой системы. Корень определенного сайта был
связан с&amp;nbsp;определенной директорией. Каждый сегмент URL запроса представлял
из&amp;nbsp;себя поддиректорию. Последний сегмент пути обычно являлся или директорией или файлом. Когда
сервер находил нужный файл, то&amp;nbsp;упаковывал его в&amp;nbsp;HTTP ответ и&amp;nbsp;отправлял обратно клиенту. Таким
образом, обслуживание запроса по&amp;nbsp;адресу &lt;tt&gt;/joeschmoe/photos/photo1&lt;/tt&gt; фактически означало, что 
на&amp;nbsp;диске должна быть директория &lt;tt&gt;joeschmoe&lt;/tt&gt;, которая в&amp;nbsp;свою очередь содержала директорию с
фотографиями, в&amp;nbsp;которой находился файл &lt;tt&gt;photo1&lt;/tt&gt;. Если в&amp;nbsp;процессе обработки пути нужный файл
или директория не&amp;nbsp;надились, то&amp;nbsp;отдавался ответ &lt;tt&gt;404 Not Found&lt;/tt&gt;.
&lt;/p&gt;

&lt;p&gt;
По&amp;nbsp;мере того, как веб становился все более динамичным, добавилась некоторая сложность.
Были придуманы технологии: &lt;tt&gt;CGI&lt;/tt&gt;, &lt;tt&gt;FastCGI&lt;/tt&gt; и&amp;nbsp;встраиваемые в&amp;nbsp;веб-сервер модули. Файлы все еще
искались в&amp;nbsp;файловой систем, но&amp;nbsp;если имя запрашиваемого файла заканчивалось, например, на &lt;tt&gt;.cgi&lt;/tt&gt;, &lt;tt&gt;.pl&lt;/tt&gt;
или &lt;tt&gt;.php&lt;/tt&gt;, или если они были размещены в&amp;nbsp;определенной специальной директории, то&amp;nbsp;в&amp;nbsp;этом случае
веб-сервер не&amp;nbsp;отдавал файл в&amp;nbsp;сыром выде, а&amp;nbsp;читал этот файл, исполнял его, используя какой-то интерпретатор,
и&amp;nbsp;только потом результат его исполнения отдавал клиенту (HTTP ответ на&amp;nbsp;HTTP запрос).
Сервер конфигурировался так, что некоторые файлы вызывали динамический
обработчик, а&amp;nbsp;другие файлы просто отдавались в&amp;nbsp;сыром виде веб-сервером (поведение по&amp;nbsp;умолчанию).
&lt;/p&gt;

&lt;h2&gt;Траверс или поиск ресурсов&lt;/h2&gt;

&lt;p&gt;
Верите вы&amp;nbsp;или нет, но&amp;nbsp;если вы&amp;nbsp;понимаете&amp;nbsp;то, как работает отдача файлов из&amp;nbsp;файловой системы, то&amp;nbsp;вы
поймете и&amp;nbsp;траверс. И&amp;nbsp;если вы&amp;nbsp;понимаете, что сервер, в&amp;nbsp;зависимости от&amp;nbsp;типа файла, может отдавать
разные ответы, то&amp;nbsp;вы&amp;nbsp;поймете и&amp;nbsp;поиск ресурсов.
&lt;/p&gt;

&lt;p&gt;
Основное отличие между поиском в&amp;nbsp;файловой системе и&amp;nbsp;траверсом состоит в&amp;nbsp;том, что файловая система
производит поиск во&amp;nbsp;вложенних директориях и&amp;nbsp;файлах, а
траверс обходит некоторый объект словарного типа в&amp;nbsp;дереве ресурсов. Рассмотрим 
пример, чтобы понять, что я&amp;nbsp;имею ввиду:
&lt;/p&gt;

&lt;p&gt;
Путь &lt;tt&gt;/joeschmoe/photos/photo1&lt;/tt&gt; содержит четыре сегмента: &lt;tt&gt;/&lt;/tt&gt;, &lt;tt&gt;joeschmoe&lt;/tt&gt;, &lt;tt&gt;photos&lt;/tt&gt; и
&lt;tt&gt;photo1&lt;/tt&gt;. При поиске в&amp;nbsp;файловой системе у&amp;nbsp;нас была&amp;nbsp;бы корневая директория (&lt;tt&gt;/&lt;/tt&gt;),
которая содержит в&amp;nbsp;себе поддиректории (&lt;tt&gt;joeschmoe&lt;/tt&gt;), которая, в&amp;nbsp;свою очередь, содержит
другие вложенные директории (&lt;tt&gt;photos&lt;/tt&gt;), а&amp;nbsp;та, в&amp;nbsp;конце концов, содержит JPEG файл (&lt;tt&gt;photo1&lt;/tt&gt;).
С&amp;nbsp;траверсом мы&amp;nbsp;имеем корневой объект словарного типа. Поиск по
ключу &lt;tt&gt;joeschmoe&lt;/tt&gt; возвращает нам другой словарный объект. Запрашивая вновь у&amp;nbsp;этого объекта
по&amp;nbsp;ключу photos, мы&amp;nbsp;получаем другой словарный объект, который в&amp;nbsp;итоге содержит ресурсы, которые мы
ищем и&amp;nbsp;значения, которые нам нужны и&amp;nbsp;доступны по&amp;nbsp;ключу &lt;tt&gt;photo1&lt;/tt&gt;.
&lt;/p&gt;

&lt;p&gt;
В&amp;nbsp;понятиях Python траверс или поиск ресуров, который соответствует пути запроса
&lt;tt&gt;/joeschmoe/photos/photo1&lt;/tt&gt; будет выглядеть примерно так:
&lt;/p&gt;

&lt;pre&gt;
get_root()['joeschmoe']['photos']['photo1']
&lt;/pre&gt;

&lt;p&gt;
&lt;tt&gt;get_root()&lt;/tt&gt; &amp;mdash;&amp;nbsp;это функция, которая возвращает корневой ресурс траверса. Если все указанные ключи
существуют, то&amp;nbsp;возвращаемый ресурс и&amp;nbsp;будет тем ресурсом, который был запрошен, по&amp;nbsp;аналогиии с
примером с&amp;nbsp;JPEG файлом, который был&amp;nbsp;бы найден в&amp;nbsp;файловой системе. Если по&amp;nbsp;мере поиска нужного ресурса было создано исключение
&lt;tt&gt;KeyError&lt;/tt&gt;, то&amp;nbsp;Pyramid вернет &lt;tt&gt;404 Not Found&lt;/tt&gt;. (Это не&amp;nbsp;тоже самое, что
происходит на&amp;nbsp;самом деле, но&amp;nbsp;основная идея показана верно.)
&lt;/p&gt;

&lt;h2&gt;Что такое ресурс?&lt;/h2&gt;

&lt;p&gt;
Вы&amp;nbsp;можете сказать &amp;laquo;я&amp;nbsp;понимаю файлы в&amp;nbsp;файловой системе, но&amp;nbsp;что такое эти вложенные словари?
Где эти объекты и&amp;nbsp;ресурсы находится? Чем они являются фактически?&amp;raquo;
&lt;/p&gt;

&lt;p&gt;
Так как Pyramid не&amp;nbsp;является строгим фреймворком и&amp;nbsp;его целью не&amp;nbsp;является ограничение разработчика,
то&amp;nbsp;он&amp;nbsp;и&amp;nbsp;не&amp;nbsp;делает ограничений на&amp;nbsp;то, как ваш ресурс реализован фактически.
Разработчик может реализовать ресурс так, как ему угодно. Используется один единственный способ для
хранения всех ресурсов (корневой ресурс в&amp;nbsp;том числе), в&amp;nbsp;базе данных в&amp;nbsp;виде графа. Корневой объект &amp;mdash;
это объект словарного типа. Любой словарный объект в&amp;nbsp;Python реализует метод &lt;tt&gt;__getitem__&lt;/tt&gt; который
вызывается по&amp;nbsp;мере поиска ресурса. Например, если &lt;tt&gt;adict&lt;/tt&gt; является объектом словарного типа,
то&amp;nbsp;Python трансформирует вызов типа &lt;tt&gt;adict['a']&lt;/tt&gt; в &lt;tt&gt;adict.__getitem__('a')&lt;/tt&gt;. Попробуйте это сделать
сами, если вы&amp;nbsp;нам не&amp;nbsp;верите:
&lt;/p&gt;

&lt;pre&gt;
Python 2.4.6 (#2, Apr 29 2010, 00:31:48)
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&gt;&gt;&gt; adict = {}
&gt;&gt;&gt; adict['a'] = 1
&gt;&gt;&gt; adict['a']
1
&gt;&gt;&gt; adict.__getitem__('a')
1
&lt;/pre&gt;

&lt;p&gt;
Корневой объект словарного типа хранит в&amp;nbsp;себе все идентификаторы его подресурсов как ключи и
реализует метод &lt;tt&gt;__getitem__&lt;/tt&gt;, который и&amp;nbsp;отдает&amp;nbsp;их. То&amp;nbsp;есть &lt;tt&gt;get_root()&lt;/tt&gt; отдает
уникальный корневой
объект, тогда как &lt;tt&gt;get_root()['joeschmoe']&lt;/tt&gt; отдает объект другого типа, который также хранится в&amp;nbsp;базе
данных, который тоже имеет свои собственные подресурсы и&amp;nbsp;реализует метод &lt;tt&gt;__getitem__&lt;/tt&gt; и&amp;nbsp;так далее
вниз по&amp;nbsp;иерархии. Эти ресурсы могут храниться как в&amp;nbsp;реляционной базе данных, так и&amp;nbsp;в&amp;nbsp;одном из
популярных сегодня NoSQL хранилищ или где-либо еще. Реального значения это не&amp;nbsp;имеет. До&amp;nbsp;тех пор
пока объекты будут представлять API для доступа как к&amp;nbsp;словарю (т.е. будут иметь реализацию метода
&lt;tt&gt;__getitem__&lt;/tt&gt;) траверсинг будет работать.
&lt;/p&gt;

&lt;p&gt;
Фактически, вам не&amp;nbsp;нужна база данных. Вы&amp;nbsp;можете использовать обычные простые словари,
со&amp;nbsp;структурой вашего сайта, которые буду захардкодены в&amp;nbsp;исходном коде Python. Или
вы&amp;nbsp;можете просто реализовать множество объектов с&amp;nbsp;методом &lt;tt&gt;__getitem__&lt;/tt&gt;, который
будет искать файлы в&amp;nbsp;нужной директории на&amp;nbsp;диске, и таким образом определить классический
традиционный механизм сопоставления пути URL с&amp;nbsp;физическими файлами и&amp;nbsp;директориями
в&amp;nbsp;файловой системе через траверс. Другими словами, в&amp;nbsp;этом случае траверс
будет являться надмножеством поиска ресурсов в&amp;nbsp;файловой системе.
&lt;/p&gt;

&lt;h2&gt;Поиск представлений&lt;/h2&gt;

&lt;p&gt;
Мы&amp;nbsp;почти уже закончили. Мы&amp;nbsp;пояснили весь траверс, который является процессом сопоставления
определенного ресурса с&amp;nbsp;заданным специфичным путем URL, но&amp;nbsp;что из&amp;nbsp;себя представляет
поиск представлений?
&lt;/p&gt;

&lt;p&gt;
Необходимость в&amp;nbsp;поиске представлений такова: может быть несколько действий, которые
вы&amp;nbsp;можете выполнить после того, как ресурс будет найден. В&amp;nbsp;нашем примере
с&amp;nbsp;фотографиями вы&amp;nbsp;можете посмотреть фотографию на&amp;nbsp;странице, но&amp;nbsp;вы&amp;nbsp;также
можете захотеть предоставить способ редактирования фотографии и сопутствующей
ей&amp;nbsp;мета-информации. Первое представление мы&amp;nbsp;назовем &lt;tt&gt;view&lt;/tt&gt;, а&amp;nbsp;второе будет
называться &lt;tt&gt;edit&lt;/tt&gt;. (Оригинально, я&amp;nbsp;знаю.) Pyramid имеет централизованный реестр
представлений где именованные представления могут быть проассоциированны со&amp;nbsp;специфичными типами
ресурсов. То&amp;nbsp;есть в&amp;nbsp;нашем примере мы&amp;nbsp;предполагаем&amp;nbsp;то, что
мы&amp;nbsp;зарегистрировали представления &lt;tt&gt;view&lt;/tt&gt; и &lt;tt&gt;edit&lt;/tt&gt; для объекта
&amp;laquo;фотография&amp;raquo; и&amp;nbsp;мы указали, что представление view является представлением
по&amp;nbsp;умолчанию. Путь &lt;tt&gt;/joeschmoe/photos/photo1/view&lt;/tt&gt; тождественен пути
&lt;tt&gt;/joeschmoe/photos/photo1&lt;/tt&gt;. Представление редактирования будет доступно по&amp;nbsp;запросу
&lt;tt&gt;/joeschmoe/photos/photo1/edit&lt;/tt&gt;.
&lt;/p&gt;

&lt;p&gt;
Надеемся на&amp;nbsp;то, что понятно, что первая часть часть URL будет возвращать тот-же самый ресурс,
что и версия чуть выше, которая не&amp;nbsp;имеет возможности редактирования фотографии, а&amp;nbsp;именно
ресурс возвращаемый по&amp;nbsp;вызову &lt;tt&gt;get_root()['joeschmoe']['photos']['photo1']&lt;/tt&gt;.
Но&amp;nbsp;траверс заканчивается здесь. &lt;tt&gt;photo1&lt;/tt&gt; не&amp;nbsp;имеет ключа &lt;tt&gt;edit&lt;/tt&gt;.
Фактически&amp;nbsp;он (объект типа &amp;laquo;фотография&amp;raquo;) даже может и&amp;nbsp;не&amp;nbsp;быть словарным
объектом, в&amp;nbsp;котором &lt;tt&gt;photo1['edit']&lt;/tt&gt; будет бессмысленным. Когда поиск ресурсов
в&amp;nbsp;Pyramid будет закончен и&amp;nbsp;будет найден конечный фрагмент дерева (нужный ресурс),
но&amp;nbsp;весь путь запроса все еще не&amp;nbsp;кончился, то&amp;nbsp;следующие сегменты будут трактоваться
как названия представлений. Реестр далее будет проверять является&amp;nbsp;ли нужное представление
проассоциированным с&amp;nbsp;ресурсом данного типа. Если так, то&amp;nbsp;представление будет вызвано
с&amp;nbsp;ресурсом, переданным как соотвествующий контекстный объект (также доступный как
&lt;tt&gt;request.context&lt;/tt&gt;). Если представление для вызова не&amp;nbsp;будет найдено, то&amp;nbsp;Pyramid
просто вернет ответ &lt;tt&gt;404 Not Found&lt;/tt&gt;.
&lt;/p&gt;

&lt;p&gt;
Можно переписать запрос &lt;tt&gt;/joeschmoe/photos/photo1/edit&lt;/tt&gt; в&amp;nbsp;следующий кусок питонического
псевдокода:
&lt;/p&gt;

&lt;pre&gt;
context = get_root()['joeschmoe']['photos']['photo1']
view_callable = get_view(context, 'edit')
request.context = context
view_callable(request)
&lt;/pre&gt;

&lt;p&gt;
Функций &lt;tt&gt;get_root()&lt;/tt&gt; и &lt;tt&gt;get_view()&lt;/tt&gt; не&amp;nbsp;существует на&amp;nbsp;самом деле. Внутри
себя, Pyramid работает немного иначе и&amp;nbsp;сложнее. Однако пример выше является разумным
приближением алгоритма поиска вьюшек в псевдокоде.
&lt;/p&gt;

&lt;h2&gt;Случаи применения&lt;/h2&gt;

&lt;p&gt;
Почему мы&amp;nbsp;должны думать о&amp;nbsp;траверсе? URL матчинг проще пояснить и&amp;nbsp;он&amp;nbsp;достаточно
хорош, верно?
&lt;/p&gt;

&lt;p&gt;
В&amp;nbsp;некоторых случах, да, но, конечно, не&amp;nbsp;во&amp;nbsp;всех случаях. До&amp;nbsp;сих пор у&amp;nbsp;нас
были очень структурированные URLы, где наш путь имел специфичные, маленькие кусочки:
&lt;/p&gt;

&lt;pre&gt;
/{userid}/{typename}/{objectid}[/{view_name}]
&lt;/pre&gt;

&lt;p&gt;
Во&amp;nbsp;всех этих примерах до&amp;nbsp;сих пор мы&amp;nbsp;захардкодивали название определенного кусочка,
предполагая, что мы&amp;nbsp;знаем во&amp;nbsp;время разработки какие имена будут использоваться (photos,
blog и&amp;nbsp;так далее). Но&amp;nbsp;что если мы&amp;nbsp;не&amp;nbsp;знаем какие имена это будут в&amp;nbsp;итоге?
Или, что еще хуже, что если мы&amp;nbsp;не&amp;nbsp;знаем вообще ничего о&amp;nbsp;будущей структуре URL внутри
директории пользователя? Мы&amp;nbsp;можем писать CMS в&amp;nbsp;которой мы&amp;nbsp;хотим, чтобы конечный
пользователь имел возможность произвольно добавлять содержимое и&amp;nbsp;другие директории внутри его
директории. Он&amp;nbsp;может решить сделать иерархию глубиной в&amp;nbsp;дюжину. Какими будут ваши шаблоны
сопоставления в&amp;nbsp;классическом роутинге, которые позволят каждой учетной записи пользователя
использовать любые комбинации путей?
&lt;/p&gt;

&lt;p&gt;
Это вполне возможно и&amp;nbsp;реализуемо, но&amp;nbsp;конечно это будет не&amp;nbsp;так-то просто. Шаблоны
сопоставления будут усложняться очень быстро по&amp;nbsp;мере того, как вы&amp;nbsp;будете пытаться учесть
все тонкости и&amp;nbsp;случаи расширяемой структуры директорий пользователя.
&lt;/p&gt;

&lt;p&gt;
С&amp;nbsp;траверсом, однако, это очень просто и&amp;nbsp;логично. Двадцать слоев иерархии не&amp;nbsp;будет
проблемой. Pyramid с&amp;nbsp;удовольствием сделает вызов &lt;tt&gt;__getitem__&lt;/tt&gt; столько раз, сколько надо
до&amp;nbsp;тех пор пока не кончится сегменты пути или пока ресурс создаст исключение &lt;tt&gt;KeyError&lt;/tt&gt;.
Каждый ресурс должен знать только лишь&amp;nbsp;то, как получить его непосредственных потомков
на&amp;nbsp;один уровень ниже (дети), обо всем остальном позаботится алогоритм траверса. И&amp;nbsp;еще, так
как структура дерева ресурсов может находится в&amp;nbsp;базе данных, а&amp;nbsp;не&amp;nbsp;в&amp;nbsp;коде,
то&amp;nbsp;будет очень просто дать пользователям возможность модифицировать дерево во&amp;nbsp;время
исполнения для установки персонализированной структуры директорий.
&lt;/p&gt;

&lt;p&gt;
Другой случай применения траверса, где он&amp;nbsp;покажет себя очень хорошо, это там, где нужна
поддержка контекстно-зависимых политик безопасности. Примером может быть система документооборота
для огромной корпорации, где члены разных департаментов имеют разные уровни доступа
к&amp;nbsp;документам и файлам других различных департаментов. Разумно, что мы&amp;nbsp;должны уметь каждому
файлу по-отдельности также задавать права для отдельных групп или отдельных пользователей
пользователей. Траверс показывает себя в&amp;nbsp;такой ситуации очень хорошо если ваши ресурсы
фактически представляют объекты данных относящихся к&amp;nbsp;вашим документам, потому как основная идея
авторизации ресурсов непосредственно связана с&amp;nbsp;разрешением кода и&amp;nbsp;процесса вызова.
Объекты-ресурсы могут хранить списки доступов ACL, которые могут быть унаследованы или
переопределены подресурсами или надресурсами.
&lt;/p&gt;

&lt;p&gt;
Если каждый ресурс будет генерировать контекстно-ориентированные ACL, тогда код представления может
попытаться выполнить нужное действие и&amp;nbsp;проверит перед этим через ACL может&amp;nbsp;ли текущий
пользователь совершить это действие. Таким образом вы&amp;nbsp;достигаете instance based или row level
безопасности, которую значительно более сложно реализовать стандартным табличным способом и
классическом роутингом. Pyramid активно поддерживает такие схемы и&amp;nbsp;фактически если
вы&amp;nbsp;регистрируете ваши вьюшки с&amp;nbsp;правами защиты и&amp;nbsp;используете авторизационную политику,
Pyramid может проверять через ACL и&amp;nbsp;решать доступна&amp;nbsp;ли или нет текущая вьюшка текущему
пользователю.
&lt;/p&gt;

&lt;p&gt;
Подводя итог, можно сказать, что существует целый класс проблем которые легко решаются путем
траверса и&amp;nbsp;поиска представлений, чем через классический роутинг. Если ваши проблемы
не&amp;nbsp;требуют этого, отлично: продолжайте работать дальше по&amp;nbsp;классической схеме роутинга,
но&amp;nbsp;если вы&amp;nbsp;используете Pyramid и&amp;nbsp;вы&amp;nbsp;понимаете, что вам нужно будет работать
с&amp;nbsp;одним из&amp;nbsp;таких случаев, то&amp;nbsp;вы&amp;nbsp;будете рады иметь механизм траверса
в&amp;nbsp;вашем инструменте.
&lt;/p&gt;
&lt;p&gt;
Более того, возможно смешение и&amp;nbsp;сочетание траверса с&amp;nbsp;классическим роутингом в&amp;nbsp;одном
и&amp;nbsp;том-же Pyramid приложении.
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://blog.nonsequitarian.org/"&gt;Роб Миллер&lt;/a&gt; (Rob Miller), 31 декабря, 2010.&lt;br/&gt;
Перевод: &lt;a href="http://resurtm.kz/"&gt;Тимур Рузиев&lt;/a&gt; aka resurtm, 27 марта, 2011.&lt;br/&gt;
Редактура, корректура: &lt;a href="http://tlemur.org.ru/"&gt;Тимур Тимирханов&lt;/a&gt; aka TLemur, 27 марта, 2011.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/resurtm/~4/cPuXU3diqmk" height="1" width="1"/&gt;</description>
<author>
resurtm@gmail.com (resurtm)</author>
<guid isPermaLink="false">
c81e728d9d4c2f636f067f89cc14862cda4b9237bacccdf19c0760cab7aec4a8359010b0</guid>
<feedburner:origLink>http://resurtm.kz/much-ado-about-traversal</feedburner:origLink></item>
</channel></rss>

