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

<channel>
	<title>Изучаем Web &#187; helpers</title>
	<atom:link href="http://brotkin.ru/tag/helpers/feed/" rel="self" type="application/rss+xml" />
	<link>http://brotkin.ru</link>
	<description>ковыряемся в Internet</description>
	<lastBuildDate>Tue, 10 Jan 2012 21:51:39 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>Ko3: знаете ли вы? Часть 3</title>
		<link>http://brotkin.ru/2011/07/15/do-you-know-3/</link>
		<comments>http://brotkin.ru/2011/07/15/do-you-know-3/#comments</comments>
		<pubDate>Fri, 15 Jul 2011 11:37:09 +0000</pubDate>
		<dc:creator>BIakaVeron</dc:creator>
				<category><![CDATA[знаете ли вы]]></category>
		<category><![CDATA[database]]></category>
		<category><![CDATA[date]]></category>
		<category><![CDATA[helpers]]></category>
		<category><![CDATA[ORM]]></category>
		<category><![CDATA[session]]></category>
		<category><![CDATA[template]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=285</guid>
		<description><![CDATA[
Если надо использовать функции СУБД (типа SUM() или COUNT()), то по умолчанию Ko3 заключит имя функции в кавычки или апострофы (в зависимости от того, в качестве имени поля будет функция или как выражение where). Чтобы этого избежать, можно применить один из двух методов:
1. Класс Database_Expression. Он создан специально для подобных случаев. Для краткости удобно использовать [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>Если надо использовать функции СУБД (типа <code>SUM()</code> или <code>COUNT()</code>), то по умолчанию <strong>Ko3</strong> заключит имя функции в кавычки или апострофы (в зависимости от того, в качестве имени поля будет функция или как выражение <em>where</em>). Чтобы этого избежать, можно применить один из двух методов:<br />
1. Класс <strong>Database_Expression</strong>. Он создан специально для подобных случаев. Для краткости удобно использовать <code>DB::expr($expression)</code>, который по сути аналогичен вызову <code>new Database_Expression($expression)</code>. Вот примеры его использования:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// сформирует запрос SELECT COUNT(*) AS `cnt` FROM `blog`</span>
DB<span style="color: #339933;">::</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span>DB<span style="color: #339933;">::</span><span style="color: #004000;">expr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'COUNT(*) AS `cnt`'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// сформирует запрос SELECT * FROM `blog` WHERE `created` &gt; NOW() - INTERVAL 1 DAY</span>
DB<span style="color: #339933;">::</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'created'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&gt;'</span><span style="color: #339933;">,</span> DB<span style="color: #339933;">::</span><span style="color: #004000;">expr</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NOW() - INTERVAL 1 DAY'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>2. Если заключить в двойные кавычки имена полей внутри функций, то экранирование не произойдет. К сожалению, не подойдет для второго примера, зато сократит длину первого:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">DB<span style="color: #339933;">::</span><span style="color: #004000;">select</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'COUNT(&quot;*&quot;) AS `cnt`'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">from</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'blog'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code>
</li>
<li>С помощью <strong>Query Builder</strong> можно реализовать множественную вставку записей одним запросом:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">DB<span style="color: #339933;">::</span><span style="color: #004000;">insert</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$table_name</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">columns</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$columns</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">values</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$set1</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">values</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$set2</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">values</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$set3</span><span style="color: #009900;">&#41;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code>
</li>
<li>Частенько бывает необходимо сохранить в шаблоне какие-то переменные (например, в конструкторе или в <code>before()</code>). Но что, если надо (в зависимости от каких-либо условий) поменять текущий шаблон на другой? Казалось бы, мы потеряем часть сохраненных данных? На помощь придет метод <code>set_filename()</code>, по названию которого можно догадаться, что мы устанавливаем новый путь к обрабатываемому шаблону. При этом все свойства шаблона (в том числе и подшаблоны) останутся на месте:
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// было </span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span> <span style="color: #339933;">=</span> View<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'new/template'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// стало</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">template</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set_filename</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'new/template'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></p>
<p>При этом помним, что для вызова метода <code>set_filename()</code> необходимо, чтобы искомая переменная была объектом <strong>View</strong>. В случае с <strong>Controller_Template</strong> <code>$this->template</code> из строки во <strong>View</strong> превращается в методе <code>before()</code>.</li>
<li>Методы <code>set()</code> и <code>get()</code> класса <strong>Session</strong> не позволяют работать с переменными-массивами, т.е. надо сперва извлечь весь массив, потом поработать с ним и сохранить обратно. Удобно использовать такой подход:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #339933;">&amp;</span> Session<span style="color: #339933;">::</span><span style="color: #004000;">instance</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">as_array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// дальше делаем с массивом, что хотим</span>
<span style="color: #000088;">$data</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'bar'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code>
</li>
<li>Как мы знаем, методы <code>find()</code> и <code>find_all()</code> моделей <strong>ORM </strong>сбрасывают текущие условия выборки. Часто бывает нужно сохранить их для следующего запроса (например, для пагинатора нужно еще и общее число записей). Для этого есть специальный метод <code>reset()</code>, который позволяет не только сбрасывать модель, но и сохранять ее текущее состояние:
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user</span> <span style="color: #339933;">=</span> ORM<span style="color: #339933;">::</span><span style="color: #004000;">factory</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'user'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">-&gt;</span><span style="color: #004000;">where</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'activated'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'='</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">reset</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">FALSE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// просим ORM не сбрасывать состояние после запроса</span>
<span style="color: #000088;">$total</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">count_all</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$users</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">find_all</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code>
</li>
<li>Многие рутинные вещи в <strong>Kohana</strong> уже присутствуют, так что не стоит изобретать свои велосипеды. Например, в классе <strong>Date</strong> есть константы для перевода календарных единиц в секунды (<code>Date::MINUTE</code>, <code>Date::HOUR</code>, <code>Date::YEAR</code> и т.д.). Еще в нем есть очень полезные методы для работы с датой (вычисление количества минут/часов/лет, форматирование даты и т.д.). Также и в хэлпере <strong>Text</strong> полным-полно нужных функций (о них я <a href="http://brotkin.ru/2009/05/06/xelper-text/">писал</a> ранее). </li>
<li>Используете в проекте защиту от <a href="http://wikipedia.org/wiki/Cross_Site_Request_Forgery">CSRF</a>? Тогда методы <code>Security::token()</code> и <code>Security::check($token)</code> Вам в помощь. Первый метод возвращает сгенерированный токен (берет из сессии, если нет &#8211; генерирует новый), а второй осуществляет сравнение с переданным значением <code>$token</code> (можно использовать как правило валидации).</li>
</ol>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2011/07/15/do-you-know-3/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2011/07/15/do-you-know-3/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2011/07/15/do-you-know-3/&t=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2011/07/15/do-you-know-3/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2011/07/15/do-you-know-3/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2011/07/15/do-you-know-3/&u_data[name]=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2011/07/15/do-you-know-3/&title=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2011/07/15/do-you-know-3/&bm_description=Ko3%3A+%D0%B7%D0%BD%D0%B0%D0%B5%D1%82%D0%B5+%D0%BB%D0%B8+%D0%B2%D1%8B%3F+%D0%A7%D0%B0%D1%81%D1%82%D1%8C+3+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2011/07/15/do-you-know-3/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Ko3: работа с cookies</title>
		<link>http://brotkin.ru/2010/06/24/ko3-cookies/</link>
		<comments>http://brotkin.ru/2010/06/24/ko3-cookies/#comments</comments>
		<pubDate>Thu, 24 Jun 2010 11:10:21 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Kohana3]]></category>
		<category><![CDATA[cookie]]></category>
		<category><![CDATA[helpers]]></category>
		<category><![CDATA[ko3]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=432</guid>
		<description><![CDATA[Предлагаю вашему вниманию небольшую заметку о работе с куками в Kohana v3. Наверняка вы знаете, что для этого в Ko3 имеется специальный хэлпер Cookie. Как обычно, сперва рассмотрим его методы.
Тут все привычно и понятно



set&#40;$name, $value, $expiration = NULL&#41;


Устанавливает куку по имени $name в значение $value (на самом деле не совсем так, об этом позже). Параметр [...]]]></description>
			<content:encoded><![CDATA[<p>Предлагаю вашему вниманию небольшую заметку о работе с куками в <strong>Kohana v3</strong>. Наверняка вы знаете, что для этого в <strong>Ko3</strong> имеется специальный хэлпер <strong>Cookie</strong>. Как обычно, сперва рассмотрим его методы.<span id="more-432"></span></p>
<h3>Тут все привычно и понятно</h3>
<ul>
<li><code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$value</span><span style="color: #339933;">,</span> <span style="color: #000088;">$expiration</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code><br />
Устанавливает куку по имени <code>$name</code> в значение <code>$value</code> (на самом деле не совсем так, об этом позже). Параметр <code>$expiration</code> необязательный, он предназначен для указания срока актуальности куки. Например, если установить <code>$expiration</code> в 30, то получится время жизни 30 секунд от момента установки. Если параметр сделать равным нулю, то кука сохранится без времени жизни и удалится по окончании сессии браузера. Если же его вообще опустить, то будет взято значение по умолчанию &#8211; свойство <code>Cookie::$expiration</code>. Изначально оно равно нулю, но так как оно <code>public</code>, то его можно поменять под себя.<br />
Если установка куки прошла успешно, возвращается <strong>TRUE</strong>, иначе <strong>FALSE</strong>.</li>
<li><code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$default</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code><br />
Возвращает куку по имени <code>$key</code>, а если не найдена &#8211; значение <code>$default</code>.</li>
<li><code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">delete<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code><br />
Удаляет куку <code>$name</code>. Происходит это следующим образом &#8211; текущее значение обнуляется, время жизни передается отрицательное (т.е. кука уже просрочена).</p>
<blockquote><p>Важно понимать, что при установке куки (классическим <code>setcookie()</code> или <code>Cookie::set()</code> &#8211; без разницы) новое значение будет установлено только после перезагрузки страницы (точнее после отправки <em>HTTP</em>-заголовков). Текущее же значение так и останется нетронутым в глобальном массиве <code>$_COOKIE</code>. Помните об этом, т.к. <code>Cookie::set()</code> изменяет только будущую куку, <code>Cookie::get()</code> пытается найти текущую, а <code>Cookie::delete()</code> удаляет как текущую, так и отправляемую.</p></blockquote>
</li>
</ul>
<h3>Дополнительные параметры</h3>
<p>В данном классе есть публичные статичные свойства, которые могут быть полезными при работе с куками. Одно из них (<code>Cookie::$expiration</code>) я уже упомянул, вот прочие:</p>
<ul>
<li><code>$path</code> (&#8216;<em>/</em>&#8216; по умолчанию). Используется для указания пути, для которого доступна кука. Например:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Cookie<span style="color: #339933;">::</span><span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// кука доступна для всего содержимого домена</span>
Cookie<span style="color: #339933;">::</span><span style="color: #000088;">$path</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'/first/'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// кука видна только в папке first и ее содержимом</span></pre></div></div>

<p></code></li>
<li><code>$domain</code> (<em>NULL</em> по умолчанию). Позволяет четко указать, для какого домена использовать куку. Например, для успешного использования кук поддоменами, надо указать имя родительского домена, предварив его точкой, например так:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Cookie<span style="color: #339933;">::</span><span style="color: #000088;">$domain</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'.first.com'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// кука будет доступна в доменах first.com, second.first.com и т.д.</span>
Cookie<span style="color: #339933;">::</span><span style="color: #000088;">$domain</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'second.first.com'</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// куки будут недоступны для домена first.com!!</span></pre></div></div>

<p></code></li>
<li><code>$secure</code> (<strong>FALSE</strong> по умолчанию). По названию понятно, что используется для безопасной отправки кук. Заголовки с куками будут отправлены только если используется протокол <em>HTTPS</em>.</li>
<li><code>$httponly</code> (<strong>FALSE</strong> по умолчанию). Это тоже опция безопасности. Если установить в <strong>TRUE</strong>, то доступ к кукам будет осуществляться только посредством <em>HTTP</em>-заголовков (т.е. отсекаются скриптовые языки, например <em>JavaScript</em>). </li>
</ul>
<h3>Изюминка</h3>
<p>А зачем же тогда класс <strong>Cookie</strong> нужен, если он по сути не отличается от &#8220;родной&#8221; функции <code>setcookie()</code>? Так вот, данный класс позволяет дополнительно шифровать куки, а точнее &#8211; подписывать их. Дело в том, что метод <code>Cookie::set()</code> отправляет не переданное значение <code>$value</code>, а более сложную конструкцию, состоящую из двух частей &#8211; собственно значение и его подпись. </p>
<p>Вот, например, как выглядит у меня кука по имени &#8216;<em>test1</em>&#8216; и значением 1:<br />
<code>8f72531079624b276ca56e21b3162a648ba20431~1</code><br />
Первая часть (до тильды) &#8211; это и есть таинственная подпись, потом идет нешифрованное значение &#8211; единица. В чем смысл? Разработчики постарались обезопасить куки от подмены значения. Когда мы передаем в <code>Cookie::set()</code> переменную, хэлпер формирует строковое значение из имени браузера (<code>$_SERVER['HTTP_USER_AGENT']</code>), имени куки и нового значения и генерирует хэш от полученной строки. В результате получается подпись для куки.<br />
Обратите внимание, что само по себе значение ни от кого не прячется &#8211; оно доступно, просто откиньте тильду. Но вот если кто-то попробует подменить значение, то сгенерированная заново подпись не совпадет с переданной в куке &#8211; так система определит подмену и просто отбросит куку.</p>
<p>Все вышеуказанные действия по формировании подписи осуществляются в методе <code>salt($name, $value)</code>. Помимо вышеперечисленных &#8220;ингредиентов&#8221;, перед хэшированием добавляется соль &#8211; значение параметра <code>Cookie::$salt</code>. Это, как и в модуле <strong>Auth</strong>, позволяет усложнить возможный подбор подписи куки, т.к. сам алгоритм известен. Просто поменяйте значение по умолчанию на какое-то свое, и никто не сможет изменить ваши подписанные куки.</p>
<blockquote><p>С подписью кук могут возникнуть проблемы, если в вашем проекте предполагается установка кук посредством <em>JavaScript</em>. Конечно, можно портировать алгоритм формирования подписи из <em>php</em>, чтобы кука не отбрасывалась после установки, но тогда вам придется опубликовать и соль, что неприемлимо. Если все же очень хочется писать куки из скрипта, есть вариант немного переписать класс <strong>Cookie</strong>, чтобы он мог принимать и неподписанные куки (определять по отсутствию тильды в значении).</p></blockquote>
<p>На этом все, класс небольшой и совсем не страшный <img src='http://brotkin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2010/06/24/ko3-cookies/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2010/06/24/ko3-cookies/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2010/06/24/ko3-cookies/&t=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2010/06/24/ko3-cookies/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2010/06/24/ko3-cookies/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2010/06/24/ko3-cookies/&u_data[name]=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2010/06/24/ko3-cookies/&title=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2010/06/24/ko3-cookies/&bm_description=Ko3%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+cookies+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2010/06/24/ko3-cookies/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Хэлпер Arr: работа с массивами</title>
		<link>http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/</link>
		<comments>http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 18:10:58 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[cправочник]]></category>
		<category><![CDATA[helpers]]></category>
		<category><![CDATA[Kohana3]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=420</guid>
		<description><![CDATA[Пока плодятся поспешные минорные релизы Kohana 3.0.6.x, давайте-как лучше рассмотрим полезнейший хэлпер Arr, предназначенный для работы с массивами. Вроде бы ничего сложного, массивы как массивы, а какие удобства обеспечивает один небольшой класс! Итак, к делу.

Метод is_assoc(array $array). Позволяет проверить, является ли массив ассоциативным или нет. Алгоритм достаточно интересный (впервые увидел двойной вызов array_keys()). Стоит отметить, [...]]]></description>
			<content:encoded><![CDATA[<p>Пока плодятся поспешные минорные релизы <strong>Kohana 3.0.6.x</strong>, давайте-как лучше рассмотрим полезнейший хэлпер <strong>Arr</strong>, предназначенный для работы с массивами. Вроде бы ничего сложного, массивы как массивы, а какие удобства обеспечивает один небольшой класс! Итак, к делу.</p>
<ul>
<li>Метод <code>is_assoc(array $array)</code>. Позволяет проверить, является ли массив ассоциативным или нет. Алгоритм достаточно интересный (впервые увидел двойной вызов <code>array_keys()</code>). Стоит отметить, что если в исходном массиве ключи числовые, то все равно вернется <strong>TRUE</strong> (единственное исключение &#8211; массив с индексами от нуля с шагом 1, т.е. типичный неассоциативный массив).</li>
<li>Метод <code>path($array, $path, $default = NULL)</code>. Просто жизненно важный метод для работы с многомерными массивами, он позволяет обратиться в вложенному элементу, используя точку в качестве разделителей уровня вложенности. Например, если есть элемент <code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$array</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'test'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'var'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'value'</span><span style="color: #009900;">&#93;</span></pre></div></div>

<p></code>, то <code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">arr<span style="color: #339933;">::</span><span style="color: #004000;">path</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$array</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'test.var.value'</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code> вернет его значение. Третий параметр, как несложно догадаться, предназначен для значения на случай, если элемент отсутствует. </li>
<li>Метод <code>range($step = 10, $max = 100)</code> вернет массив, заполненный элементами с шагом <code>$step</code>, вплоть до максимального числа <code>$max</code>. Не очень удобно, что нельзя указать начальный элемент (для данного метода он всегда будет совпадать с числом <code>$step</code>).</li>
<li>Метод <code>get($array, $key, $default = NULL)</code>, думаю, самый известный в данном классе. Он ищет элемент в массиве, с поддержкой дефолтного значения. Отличается от <code>arr::path()</code> тем, что ищет только в первом уровне вложенности.</li>
<li>Метод <code>extract($array, array $keys, $default = NULL)</code>. Метод, часто используемый для безопасной обработки данных глобальных массивов. Передавая массив <code>$keys</code>, мы определяем ключи, которые надо извлекать из массива <code>$array</code>. Все прочие ключи игнорируются. Если по какому-то ключу значение не найдено, подставляется <code>$default</code>. Например, <code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$user_data</span> <span style="color: #339933;">=</span> arr<span style="color: #339933;">::</span><span style="color: #990000;">extract</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'remember'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code>, позволит получить массив из ключей &#8216;<em>username</em>&#8216;, &#8216;<em>password</em>&#8216; и &#8216;<em>remember</em>&#8216; массива <code>$_POST</code>.</li>
<li>Метод <code>binary_search($needle, $haystack, $sort = FALSE)</code>, в ветке <strong>2.3.x</strong> использовавшийся для бинарного поиска, теперь просто вызывает <code>array_search()</code>, так что смысла в его использовании нет (оставлен для совместимости).</li>
<li>Метод <code>unshift(array &#038; $array, $key, $val)</code> позволяет вставить в начало ассоциативного массива значение <code>$val</code> по ключу <code>$key</code>.</li>
<li>Метод <code>map($callback, $array)</code> рекурсивно применяет функцию <code>$callback</code> ко всем элементам <code>$array</code>, в том числе и подмассивам. В отличие от стандартного <code>array_map()</code>, <code>arr::map()</code> не работает с несколькими массивами (т.е. <code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">arr<span style="color: #339933;">::</span><span style="color: #004000;">map</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'trim'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array1</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array2</span><span style="color: #339933;">,</span> <span style="color: #000088;">$array3</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code> не пройдет).</li>
<li>Метод <code>merge(array $a1, array $a2)</code> рекурсивно объединяет два массива. В отличие от <code>array_merge_recursive()</code>, она не принимает более 2х массивов. Кроме того, если массивы неассоциативные, то значения не будут дублироваться. Например, <code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">arr<span style="color: #339933;">::</span><span style="color: #004000;">merge</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code> вернет <code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code>, а не <code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'foo'</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code></li>
<li>Метод <code>overwrite($array1, $array2)</code> перезаписывает значения массива <code>$array1</code> значениями из <code>$array2</code>. При этом новые ключи в <code>$array1</code> не добавляются. Таким образом, пример из пункта про <code>arr::extract()</code> можно записать как <code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">arr<span style="color: #339933;">::</span><span style="color: #004000;">overwrite</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'username'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'remember'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code></li>
<li>Метод <code>callback($str)</code> пытается разбить строковое представление вызова функции с параметрами на массив (функция, параметры). Например, <code>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">arr<span style="color: #339933;">::</span><span style="color: #004000;">callback</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foo::bar(1,2,$_POST)'</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p></code> вернет массив:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span> 
   <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> 
   <span style="color: #009900;">&#123;</span> 
      <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;foo&quot;</span> 
      <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;bar&quot;</span> 
   <span style="color: #009900;">&#125;</span> 
   <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">3</span><span style="color: #009900;">&#41;</span> 
   <span style="color: #009900;">&#123;</span> 
      <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;1&quot;</span> 
      <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;2&quot;</span> 
      <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  string<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">$_POST</span>&quot;</span>  
   <span style="color: #009900;">&#125;</span> 
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<blockquote><p>Если в строку заключать не в одиночные кавычки, а в двойные, то, что естественно, вместо строки <code>$_POST</code> подставится строковое представление этого глобального массива, т.е. строка &#8216;<em>array</em>&#8216;.</p></blockquote>
<blockquote><p>В версии <strong>2.3.4</strong> был похожий метод <code>callback_string()</code>, но он предусматривал использование квадратных скобок в строке, т.е. &#8216;<em>foo::bar[1,2]</em>&#8216;. Вероятно это связано с использованием такого синтаксиса в Валидаторе, при объявлении правил.</p></blockquote>
</li>
<li>Метод <code>flatten($array)</code> преобразовывает многомерный массив в одномерный. Значения просто переносятся в &#8220;корень&#8221; массива. При этом ключи сохранятся только для конечных элементов (не являющихся массивами). Пример:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
<span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
   <span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'2'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> 
      <span style="color: #0000ff;">'3'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
      <span style="color: #009900;">&#40;</span>
         <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> 
         <span style="color: #cc66cc;">6</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">6</span>
      <span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> 
   <span style="color: #0000ff;">'5'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">5</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">::</span><span style="color: #004000;">flatten</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arr</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
В результате получим массив:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#123;</span>
   <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  int<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#41;</span> 
   <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  int<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span>  
   <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  int<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">6</span><span style="color: #009900;">&#41;</span> 
   <span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=&gt;</span>  int<span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">5</span><span style="color: #009900;">&#41;</span> 
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code><br />
У элемента &#8216;4&#8242; ключ сгенерирован заново, а массив под ключом &#8216;3&#8242; исчез, оставив только свое содержимое. Тут стоит обратить внимание, что в целом ключи остались прежними. А что, если у двух элементов будет одно и то же значение ключа? Проверим:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$arr</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span>
<span style="color: #009900;">&#40;</span>
   <span style="color: #0000ff;">'1'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
   <span style="color: #009900;">&#40;</span>
      <span style="color: #0000ff;">'2'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">2</span><span style="color: #339933;">,</span> 
      <span style="color: #0000ff;">'3'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span>
      <span style="color: #009900;">&#40;</span>
         <span style="color: #cc66cc;">4</span><span style="color: #339933;">,</span> 
         <span style="color: #cc66cc;">5</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">6</span>
      <span style="color: #009900;">&#41;</span>
   <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> 
   <span style="color: #0000ff;">'5'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">5</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">var_dump</span><span style="color: #009900;">&#40;</span>arr<span style="color: #339933;">::</span><span style="color: #004000;">flatten</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$arr</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p></code><br />
Здесь я для значения &#8216;6&#8242; поменял ключ. В результате получим:<br />
<code>array(3)<br />
{<br />
   [2]=>  int(2)<br />
   [0]=>  int(4)<br />
   [5]=>  int(5)<br />
}</code><br />
Один элемент пропал &#8211; шестерка была затерта пятеркой, т.к. ключи совпадали. Так что будьте осторожнее с этим методом.</li>
</ul>
<p>По сравнению с <strong>2.3.4</strong>, в хэлпере не хватает таких методов, как <code>rotate()</code>, <code>remove()</code> и <code>to_object()</code>. Но их всегда можно перенести в третью ветку, ничего сложного в этом нет. </p>
<p>На этом наше короткое теоретическое знакомство с данным хэлпером закончено &#8211; приступайте к практике. Пользуйтесь этим классом, не изобретайте велосипед <img src='http://brotkin.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&t=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&u_data[name]=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/&bm_description=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+Arr%3A+%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0+%D1%81+%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2%D0%B0%D0%BC%D0%B8+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2010/06/13/xelper-arr-rabota-s-massivami/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Своя CMS: Хэлпер для хранения промежуточных данных</title>
		<link>http://brotkin.ru/2009/05/08/message_helper/</link>
		<comments>http://brotkin.ru/2009/05/08/message_helper/#comments</comments>
		<pubDate>Fri, 08 May 2009 10:49:17 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[Пишем CMS]]></category>
		<category><![CDATA[CMS]]></category>
		<category><![CDATA[helpers]]></category>
		<category><![CDATA[Kohana]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=224</guid>
		<description><![CDATA[Наверняка вы сталкивались с ситуацией, когда выполнено какое-то действие и необходимо направить пользователя на страницу с полученными результатами. Например, при регистрации пользователя мы либо должны показать пользователю страницу с информацией о дальнейших действиях (послано письмо с подтверждением или можно сразу входить на сайт), либо вернуть обратно на страницу с заполненной им формой и указать, какие [...]]]></description>
			<content:encoded><![CDATA[<p>Наверняка вы сталкивались с ситуацией, когда выполнено какое-то действие и необходимо направить пользователя на страницу с полученными результатами. Например, при регистрации пользователя мы либо должны показать пользователю страницу с информацией о дальнейших действиях (послано письмо с подтверждением или можно сразу входить на сайт), либо вернуть обратно на страницу с заполненной им формой и указать, какие поля не прошли валидацию. Для работы с подобными я решил написать хэлпер.<span id="more-224"></span></p>
<h2>Постановка задачи</h2>
<p>Изначально я использовал сессию, чтобы складировать туда переменные. Однако т.к. в различных контроллерах сохранялась разная информация, запоминать которую становилось все сложнее и сложнее, возникла необходимость в систематизации принципов хранения, обработки и получения данных. Толчком в нужном направлении для меня послужил хэлпер <strong>notice</strong> из дистрибутива <strong>YurikoCMS</strong>, о которой я недавно <a href="http://brotkin.ru/2009/05/03/eshhe-odna-cms-yurikocms/">писал</a>. Однако он не обеспечивал всего нужного мне функционала, а хотелось мне вот чего:</p>
<ul>
<li>Хранение информации различного типа с возможностью выбора данных только этого типа.</li>
<li>Данные из &#8220;предыдущей жизни&#8221; далее не сохраняются (т.е. неиспользованный мусор не накапливается от страницы к странице).</li>
<li>Хранение данных валидации (с учетом имени поля и формированием <em>i18n</em>-сообщения об ошибке).</li>
<li>Хранение прочих данных (например, заполненные поля анкеты, которые необходимо показать еще раз), возможность запроса конкретной записи по имени ключа (<em>tagname</em>).</li>
</ul>
<p>Нет ничего приятнее, чем решить проблему самостоятельно, поэтому я сел за написание скрипта.</p>
<h2>Что вышло в итоге.</h2>
<p>В результате получился такой вот хэлпер (<a href="http://kohana.pastebin.com/f4b9a966a">посмотреть</a>). Использование довольно простое:</p>
<p><code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span>
<span style="color: #666666; font-style: italic;">// где-то в контроллере, идет валидация полей пользовательской формы</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">user</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">validate</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		message<span style="color: #339933;">::</span><span style="color: #004000;">add_validation</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">errors</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;auth&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		arr<span style="color: #339933;">::</span><span style="color: #004000;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		arr<span style="color: #339933;">::</span><span style="color: #004000;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'password_confirm'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$_POST</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		message<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'custom'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
		message<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span>Kohana<span style="color: #339933;">::</span><span style="color: #004000;">lang</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth.registration_ok'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'success'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		url<span style="color: #339933;">::</span><span style="color: #004000;">redirect</span><span style="color: #009900;">&#40;</span>Router<span style="color: #339933;">::</span><span style="color: #004000;">uri</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'method'</span><span style="color: #339933;">=&gt;</span><span style="color: #0000ff;">'login'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// в шаблоне формы для ввода регистрационных данных</span>
<span style="color: #339933;">&lt;</span>ul<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">...</span>
  <span style="color: #339933;">&lt;</span>li<span style="color: #339933;">&gt;&lt;!--</span> Email field  <span style="color: #339933;">--&gt;</span>
    <span style="color: #000000; font-weight: bold;">&lt;?=</span>message<span style="color: #339933;">::</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'validation'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
    &lt;label for=&quot;email&quot;&gt;<span style="color: #000000; font-weight: bold;">&lt;?=</span>Kohana<span style="color: #339933;">::</span><span style="color: #004000;">lang</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'auth.email'</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&lt;/label&gt;
    &lt;input type=&quot;text&quot; name=&quot;email&quot; id=&quot;email&quot; value=&quot;<span style="color: #000000; font-weight: bold;">&lt;?=</span>message<span style="color: #339933;">::</span><span style="color: #004000;">custom</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'email'</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>&quot; /&gt;
  &lt;/li&gt;
...
&lt;/ul&gt;
&nbsp;
// в шаблоне для большинства страниц
&lt;div id=&quot;content&quot;&gt;
	<span style="color: #000000; font-weight: bold;">&lt;?</span>message<span style="color: #339933;">::</span><span style="color: #004000;">render</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;?=</span><span style="color: #000088;">$content</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
&lt;/div&gt;</pre></div></div>

<p></code></p>
<p>Метод <strong>message::add()</strong> является основным методом добавления информации в хэлпер. Так как ошибки валидации, возвращаемые методом <strong>errors()</strong>, являются массивом вида <em>$fieldname=>$rulename</em>, для них создан метод <strong>message::add_validation()</strong>, вторым параметром которого является имя <em>i18n</em>-файла, в котором описаны используемые формой ресурсы. Для показа сообщений используется метод <em>message::render()</em>, который может выводить как сообщения конкретного типа, так и все имеющиеся сообщения (за исключением ошибок валидации и <em>custom</em>-данных). Ошибки валидации показываются по отдельности перед полями ввода, с помощью все того же метода <strong>message::render()</strong>. А значения полей заполняются на основе работы метода <strong>message::custom()</strong>, который пытается найти в сообщениях типа &#8216;<em>custom</em>&#8216; указанную переменную. Дополнительно можно использовать метод <strong>get_type()</strong>, который вернет массив записей указанного типа без использования шаблонов (т.е. без вызова <strong>render()</strong>).<br />
При использовании получаются примерно такие сообщения (кликабельно):<br />
<div id="attachment_225" class="wp-caption aligncenter" style="width: 310px"><a href="http://brotkin.ru/wp-content/uploads/register.jpg"><img src="http://brotkin.ru/wp-content/uploads/register-300x204.jpg" alt="Форма регистрации с ошибками в отдельных полях" title="Форма регистрации с ошибками в отдельных полях" width="300" height="204" class="size-medium wp-image-225" /></a><p class="wp-caption-text">Форма регистрации с ошибками в отдельных полях</p></div></p>
<div id="attachment_226" class="wp-caption aligncenter" style="width: 310px"><a href="http://brotkin.ru/wp-content/uploads/after_registration.jpg"><img src="http://brotkin.ru/wp-content/uploads/after_registration-300x199.jpg" alt="Сообщение о результате совершенных действий" title="Сообщение о результате совершенных действий" width="300" height="199" class="size-medium wp-image-226" /></a><p class="wp-caption-text">Сообщение о результате совершенных действий</p></div>
<h2>Как это работает?</h2>
<p>Для того, чтобы данные сохранялись и загружались, использованы хуки. В принципе, все аналогично <strong>Zeelot</strong>&#8216;овскому <strong>notice</strong>, мы сохраняем данные при отправке заголовков системой или если пойман редирект, а инициализация происходит сразу после загрузки ядра фреймворка:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// в любом хуке</span>
	Event<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'system.ready'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'message'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'init'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	Event<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'system.send_headers'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'message'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'save'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	Event<span style="color: #339933;">::</span><span style="color: #004000;">add</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'system.redirect'</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'message'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'save'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>В момент инициализации считывается значение конфигурации из файла <em>config/message.php</em>, где должно быть прописано имя переменной для сохранения в сессии (параметр &#8216;<em>message_key</em>&#8216;). В принципе, вы можете изменить текст хэлпера, просто я не хотел жестко прописывать какое-то конкретное значение.</p>
<h2>Исходники</h2>
<p><a href="http://brotkin.ru/kohana-sources/message_helper.rar">Архив хэлпера</a>. В выложенном мной файле помимо самого хэлпера лежит использовавшийся мной шаблон для вывода ошибок, а также фрагмент файла стилей (на всякий случай).<br />
В связи с моим переходом на Ko3 предлагаю вам соответствующую <a href="http://github.com/biakaveron/message">версию</a> класса.</p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/05/08/message_helper/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/05/08/message_helper/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/05/08/message_helper/&t=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/05/08/message_helper/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/05/08/message_helper/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/05/08/message_helper/&u_data[name]=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/05/08/message_helper/&title=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/05/08/message_helper/&bm_description=%D0%A1%D0%B2%D0%BE%D1%8F+CMS%3A+%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+%D0%B4%D0%BB%D1%8F+%D1%85%D1%80%D0%B0%D0%BD%D0%B5%D0%BD%D0%B8%D1%8F+%D0%BF%D1%80%D0%BE%D0%BC%D0%B5%D0%B6%D1%83%D1%82%D0%BE%D1%87%D0%BD%D1%8B%D1%85+%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/05/08/message_helper/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Хэлпер text</title>
		<link>http://brotkin.ru/2009/05/06/xelper-text/</link>
		<comments>http://brotkin.ru/2009/05/06/xelper-text/#comments</comments>
		<pubDate>Wed, 06 May 2009 06:05:05 +0000</pubDate>
		<dc:creator>biakaveron</dc:creator>
				<category><![CDATA[cправочник]]></category>
		<category><![CDATA[helpers]]></category>
		<category><![CDATA[Kohana]]></category>

		<guid isPermaLink="false">http://brotkin.ru/?p=222</guid>
		<description><![CDATA[Небольшая заметка-справка о возможностях стандартного хэлпера text. Хэлпер предназначен для работы с текстом (какая неожиданность!   ), некоторые его функции могут оказаться весьма полезными для разрабатываемых вами проектов, если они работают с текстовыми ресурсами (статьи, форумы и т.д.).
Для начала замечу, что все доступные методы не заменяют оригинальный текст, а возвращают модифицированный как результат. А [...]]]></description>
			<content:encoded><![CDATA[<p>Небольшая заметка-справка о возможностях стандартного хэлпера text. Хэлпер предназначен для работы с текстом (какая неожиданность! <img src='http://brotkin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ), некоторые его функции могут оказаться весьма полезными для разрабатываемых вами проектов, если они работают с текстовыми ресурсами (статьи, форумы и т.д.).<span id="more-222"></span></p>
<p>Для начала замечу, что все доступные методы не заменяют оригинальный текст, а возвращают модифицированный как результат. А теперь, собственно сами методы:</p>
<ul>
<li><strong>limit_words</strong>(<em>$str, $limit = 100, $end_char = NULL</em>). Обрезает строку <strong>$str</strong> до <strong>$limit</strong> слов. В конец результирующей строки добавляет символы <strong>$end_char</strong> (по умолчанию символ &#8220;многоточие&#8221;). Например, если вы не хотите в RSS или на главной показывать полный текст статьи, данная функция может стать полезной для проведения &#8220;обрезания&#8221;.</li>
<li><strong>limit_chars</strong>(<em>$str, $limit = 100, $end_char = NULL, $preserve_words = FALSE</em>). Аналогична <strong>limit_words()</strong>, но в качестве единиц измерения длины строки выступают символы. Дополнительный параметр <strong>$preserve_words</strong> указывает, сохранять ли целыми слова (по умолчанию <strong>FALSE</strong>). Например:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Мама мыла раму'</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> text<span style="color: #339933;">::</span><span style="color: #004000;">limit_words</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет 'Мама мы...'</span>
<span style="color: #b1b100;">echo</span> text<span style="color: #339933;">::</span><span style="color: #004000;">limit_words</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;!&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет 'Мама мы!'</span>
<span style="color: #b1b100;">echo</span> text<span style="color: #339933;">::</span><span style="color: #004000;">limit_words</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">NULL</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет 'Мама мыла...'</span></pre></div></div>

<p></code></li>
<li><strong>alternate()</strong>. Позволяет чередовать строки, переданные в качестве параметров функции. Реализуется с помощью встроенного счетчика (статическая переменная), который увеличивается каждый раз, когда вызывается данная функция. Например, так можно чередовать светлые и темные строки в таблице:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #b1b100;">foreach</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$rows</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">'&lt;tr class=&quot;'</span><span style="color: #339933;">,</span> text<span style="color: #339933;">::</span><span style="color: #004000;">alternate</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;light&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;dark&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&quot;&gt;&lt;td&gt;'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">value</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'&lt;/td&gt;&lt;/tr&gt;'</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p></code></p>
<p>А если надо обнулить счетчик, просто вызываем text::alternate() без параметров.</p>
<blockquote><p>К сожалению, функция не может принимать на входе массив строк, это было бы удобнее (ИМХО). Написал запрос разработчикам, может добавят такую возможность.</p></blockquote>
</li>
<li><strong>random</strong>(<em>$type = &#8216;alnum&#8217;, $length = 8</em>). Создает случайную строку указанного типа (параметр <strong>$type</strong>) и длины (<strong>$length</strong>). В качестве типа могут быть использованы: &#8216;<em>alnum</em>&#8216; (цифры и буквы латинского алфавита), &#8216;<em>alpha</em>&#8216; (буквы латинского алфавита), &#8216;<em>hexdec</em>&#8216; (цифры шестнадцатеричной системы счисления от 0 до f), &#8216;<em>numeric</em>&#8216; (цифры от 0 до 9), &#8216;<em>nozero</em>&#8216; (цифры от 1 до 9), &#8216;<em>distinct</em>&#8216; (цифры и числа, не имеющие схожих по начертанию аналогов, удобно для формирования текста т.н. <em>капчи</em>). Если строка <strong>$type</strong> не совпадает ни с одной из перечисленных, то она будет использована как список доступных символов (например, если вы захотите использовать не латинские символы, а кириллицу).</li>
<li><strong>reduce_slashes</strong>(<em>$str</em>). Избавляет строку <strong>$str</strong> от повторяющихся слэшей. Работает только с прямым слэшем, т.е. с символом &#8216;<em>/</em>&#8216;.</li>
<li><strong>censor</strong>(<em>$str, $badwords, $replacement = &#8216;#&#8217;, $replace_partial_words = FALSE</em>). Функция-цензор, позволяет заменять в строке <strong>$str</strong> слова из &#8220;черного списка&#8221; <strong>$badwords</strong> на символы из параметра <strong>$replacement</strong> (по умолчанию символ &#8220;решетка&#8221;). Последний параметр <strong>$replace_partial_words</strong> указывает, заменять только целые слова, или любые вхождения данного шаблона. Для определения &#8220;целостности&#8221; слова используется псевдосимвол <strong>\b</strong> (<a href="http://www.regular-expressions.info/wordboundaries.html">описание</a>).<br />
<blockquote><p>Будьте внимательны! Несмотря на название <strong>$replace_partial_words</strong> (&#8220;<em>заменять части слов</em>&#8220;), использование значения <strong>FALSE</strong> приводит к полной замене всех вхождений шаблона в тексте. Вы же не захотите видеть на вашем сайте строки &#8220;<em>застра*** братуху, застра***</em>&#8221; <img src='http://brotkin.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
<strong>Update</strong>. Имя параметра оперативно <a href="http://dev.kohanaphp.com/projects/kohana2/repository/revisions/4329/diff/branches/2.4/system/helpers/text.php">исправили</a>, в 2.4 все будет ОК.
</p></blockquote>
<p>Например, сравните эти два вызова:<br />
<code></p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$str</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Маленький переполох'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$bad</span> <span style="color: #339933;">=</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'лох'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> text<span style="color: #339933;">::</span><span style="color: #004000;">censor</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #000088;">$bad</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'*'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет 'Маленький перепо***'</span>
<span style="color: #b1b100;">echo</span> text<span style="color: #339933;">::</span><span style="color: #004000;">censor</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$str</span><span style="color: #339933;">,</span> <span style="color: #000088;">$bad</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'*'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #666666; font-style: italic;">// выведет исходную строку</span></pre></div></div>

<p></code></li>
<li><strong>similar</strong>(<em>array $words</em>). Находит общую подстроку, присутствующую во всех словах массива <strong>$words</strong>. Алгоритм прост: берется первое слово из массива и посимвольно проверяется совпадение во всех остальных элементах <strong>$words</strong>. Таким образом, <em>similar(array(&#8216;test&#8217;, &#8216;test!&#8217;))</em> вернет слово &#8216;<em>test</em>&#8216;, а <em>similar(&#8216;test&#8217;, &#8216;1test&#8217;)</em> вернет пустую строку.</li>
<li><strong>auto_link_urls</strong>(<em>$text</em>). Как видно из названия, автоматически конвертирует в строке <strong>$text</strong> текстовые URL&#8217;ы в гиперссылки. Заменяет как ссылки с указанием протокола (<em>http://</em>, <em>https://</em>), так и без него (<em>www.example.com</em>). Уже оформленные ссылки не трогает. Для формирования тэгов использует <strong>html::anchor()</strong>.</li>
<li><strong>auto_link_emails</strong>(<em>$text</em>). Аналогична <strong>auto_link_urls()</strong>, но работает с почтовыми адресами (<strong>html::mailto()</strong>).</li>
<li><strong>auto_link</strong>(<em>$text</em>). Два в одном: конвертирует и URL&#8217;ы, и email&#8217;ы. По сути просто последовательный вызов предыдущих двух функций.</li>
<li><strong>auto_p</strong>(<em>$str</em>). Обрамляет абзацы текста тэгами <em>
<p></em>. Двойные переводы каретки считаются за начало абзаца, одиночные заменяются на тэг <em><br /></em>. Многие html-тэги в тексте (типа <em>TABLE</em>, <em>UL</em>, <em>DIV</em>) в отдельные абзацы не выносятся. Удобна для автоматического форматирования текста, если вы не планируете использовать уже готовый текстовый редактор типа <strong>Tiny_MCE</strong>.</li>
<li><strong>bytes</strong>(<em>$bytes, $force_unit = NULL, $format = NULL, $si = TRUE</em>). Преобразовывает <strong>$bytes</strong> (в байтах) в удобочитаемую строку с использованием более крупных единиц (Кб, Мб и т.д.). Параметр <strong>$force_unit</strong> определяет, в каких единицах вы хотели бы видеть результат (о допустимых единицах чуть ниже), если не указан &#8211; вычисляется автоматически. <strong>$format</strong> &#8211; аргумент, определяющий форматирование результата (синтаксис такой же, как в функции <strong>sprintf()</strong>), по умолчанию два знака после запятой, заполнение нулями. Последний параметр &#8211; выбор используемого стандарта, СИ (по умолчанию) или IEC.
<ol>
<li><strong>СИ</strong>. Доступны единицы: <em>&#8216;B&#8217;, &#8216;kB&#8217;, &#8216;MB&#8217;, &#8216;GB&#8217;, &#8216;TB&#8217;, &#8216;PB&#8217;</em>. 1 kB = 1000 B.</li>
<li><strong>IEC</strong>. Доступны единицы: <em>&#8216;B&#8217;, &#8216;KiB&#8217;, &#8216;MiB&#8217;, &#8216;GiB&#8217;, &#8216;TiB&#8217;, &#8216;PiB&#8217;</em>. 1KiB = 1024 B.</li>
</ol>
<p>Также, если вы указываете единицы вручную, выбор стандарта будет основываться на анализе этой единицы измерения (т.е. если вы хотите размер в &#8216;<em>KiB</em>&#8216;, параметр <strong>$si</strong> можно не указывать).</p>
<blockquote><p>Будьте внимательны к подобным преобразованиям! Поскольку стандартная точность &#8211; два знака после запятой, 10 байт после явного преобразования в килобайты превратятся в ноль.</p></blockquote>
</li>
<li><strong>widont</strong>(<em>$str</em>). Предотвращает перенос строки перед последним словом в строке <strong>$str</strong>, заменяя пробел перед ним на символ &#8220;неразрывный пробел&#8221; (<em>&amp;nbsp;</em>).</li>
</ul>
<h2>К чему я это все?</h2>
<p>Самое интересное, что о функционале доброй половины хэлперов из дистрибутива фреймворка я и не подозревал, а ведь многие функции весьма полезны и актуальны. Меньше знаешь &#8211; лучше спишь? <img src='http://brotkin.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>

<div class="bookmarkz"><a href="http://www.google.com/bookmarks/mark?op=add&bkmk=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/google.png" border="0" width="16" height="16" alt="Google Bookmarks" title="Google Bookmarks"></a> <a href="http://digg.com/submit?url=http://brotkin.ru/2009/05/06/xelper-text/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/digg.png" border="0" width="16" height="16" alt="Digg" title="Digg"></a> <a href="http://reddit.com/submit?url=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/reddit.png" border="0" width="16" height="16" alt="Reddit" title="Reddit"></a> <a href="http://del.icio.us/post?url=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/delicious.png" border="0" width="16" height="16" alt="del.icio.us" title="del.icio.us"></a> <a href="http://ma.gnolia.com/beta/bookmarklet/add?url=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web&description=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/magnolia.png" border="0" width="16" height="16" alt="Ma.gnolia" title="Ma.gnolia"></a> <a href="http://www.technorati.com/faves?add=http://brotkin.ru/2009/05/06/xelper-text/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/technorati.png" border="0" width="16" height="16" alt="Technorati" title="Technorati"></a> <a href="http://www.slashdot.org/bookmark.pl?url=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/slashdot.png" border="0" width="16" height="16" alt="Slashdot" title="Slashdot"></a> <a href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://brotkin.ru/2009/05/06/xelper-text/&t=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/yahoo.png" border="0" width="16" height="16" alt="Yahoo My Web" title="Yahoo My Web"></a> <a href="http://news2.ru/add_story.php?url=http://brotkin.ru/2009/05/06/xelper-text/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/news2ru.png" border="0" width="16" height="16" alt="News2.ru" title="News2.ru"></a> <a href="http://www.bobrdobr.ru/addext.html?url=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/bobrdobr.png" border="0" width="16" height="16" alt="БобрДобр.ru" title="БобрДобр.ru"></a> <a href="http://rumarkz.ru/bookmarks/?action=add&popup=1&address=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rumarkz.png" border="0" width="16" height="16" alt="RUmarkz" title="RUmarkz"></a> <a href="http://www.vaau.ru/submit/?action=step2&url=http://brotkin.ru/2009/05/06/xelper-text/" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/vaau.png" border="0" width="16" height="16" alt="Ваау!" title="Ваау!"></a> <a href="http://memori.ru/link/?sm=1&u_data[url]=http://brotkin.ru/2009/05/06/xelper-text/&u_data[name]=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/memori.png" border="0" width="16" height="16" alt="Memori.ru" title="Memori.ru"></a> <a href="http://www.rucity.com/bookmarks.php?action=add&address=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/rucity.png" border="0" width="16" height="16" alt="rucity.com" title="rucity.com"></a> <a href="http://moemesto.ru/post.php?url=http://brotkin.ru/2009/05/06/xelper-text/&title=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/moemesto.png" border="0" width="16" height="16" alt="МоёМесто.ru" title="МоёМесто.ru"></a> <a href="http://www.mister-wong.ru/index.php?action=addurl&bm_url=http://brotkin.ru/2009/05/06/xelper-text/&bm_description=%D0%A5%D1%8D%D0%BB%D0%BF%D0%B5%D1%80+text+-+%D0%98%D0%B7%D1%83%D1%87%D0%B0%D0%B5%D0%BC+Web" rel="nofollow" target="_blank"><img src="http://brotkin.ru/wp-content/plugins/bookmarkz/images/mrwong.png" border="0" width="16" height="16" alt="Mister Wong" title="Mister Wong"></a> </div>
]]></content:encoded>
			<wfw:commentRss>http://brotkin.ru/2009/05/06/xelper-text/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

