<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

    <channel>
        <title>Блог Шурашова Антона aka Sinkler</title>
        <link>http://sinkler.ru/</link>
        <description>Блог Шурашова Антона aka Sinkler</description>
        <copyright>Copyright 2010, Шурашов Антон Андреевич</copyright>
        <managingEditor>sinkler@sinkler.ru</managingEditor>
        <webMaster>sinkler@sinkler.ru</webMaster>
        <docs>http://www.rssboard.org/rss-specification</docs>
        <ttl>60</ttl>
        <rss2lj:owner xmlns:rss2lj="http://rss2lj.net/NS">shurashov</rss2lj:owner>

                <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/sinkler" /><feedburner:info uri="sinkler" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
            <title>Информация о пользователе, возвращаемая крупными OpenID-провайдерами</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/JFHoyM045RY/information_about_user_from_openid</link>
            <description>&lt;p&gt;
	Cегодня занялся прикручиванием авторизации через сервис &lt;a&gt;loginza.ru&lt;/a&gt; на один из своих сайтов, при этом требовалось сохранить существующую систему регистрации и авторизации.&lt;/p&gt;
&lt;p&gt;
	Основная проблема: все OpenID-провайдеры возвращают различную информацию о пользователе, а, иногда, вообще не возвращают. Приходится вручную перед интеграцией анализировать, что приходит от сервера и что нам писать в базу.&lt;/p&gt;
&lt;p&gt;
	Дабы хоть кому-то упростить жизнь, публикую параметры, которые приходили мне от популярных OpenID-сервисов.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/JFHoyM045RY" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>Сервисы</category>
            <comments>http://sinkler.ru/posts/information_about_user_from_openid#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/information_about_user_from_openid</guid>
            <pubDate>Sun, 28 Nov 2010 19:27:53 +0300</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/information_about_user_from_openid</feedburner:origLink></item>
                <item>
            <title>Простой антиспам для CakePHP</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/3-jDSUTZurk/antispam_for_cakephp</link>
            <description>&lt;p&gt;
	&lt;img alt="" src="/files/image/cake-logo.png" style="width: 180px; height: 180px; float: right; position: relative; z-index: 999;" /&gt;Хоть я особо тут и не пишу ничего, но спам-боты меня очень любят досаждать своими комментариями. Премодерация, конечно, работает, но как-то иногда лень удалять все эти десятки сообщений, тем более что множественное удаление сообщений мне тоже лень делать.&lt;/p&gt;
&lt;p&gt;
	Решил себе приделать простенький метод борьбы со спамом от &lt;a href="http://adw0rd.ru/2009/antispam/"&gt;Михаила Андреева&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;
	Смысл прост: заменяем настоящие названия полей формы на случайный набор символов, а старые поля скрываем через css.&lt;/p&gt;
&lt;div class="highlight"&gt;
&lt;pre class="brush: php"&gt;echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;34kjffe343&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; __(&amp;#39;Ваше имя&amp;#39;, true)));
echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;name&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; false));

echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;34f3f34f3fc34r6&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; __(&amp;#39;Ваш электронный адрес&amp;#39;, true)));
echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;email&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; false));

echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;458vn54jfkjm3&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; __(&amp;#39;Сайт&amp;#39;, true)));
echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;url&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; false));

echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;934hf9v34fhjc&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; __(&amp;#39;Комментарий&amp;#39;, true), &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;textarea&amp;#39;));
echo $this-&amp;gt;Form-&amp;gt;input(&amp;#39;comment&amp;#39;, array(&amp;#39;label&amp;#39; =&amp;gt; false, &amp;#39;type&amp;#39; =&amp;gt; &amp;#39;textarea&amp;#39;));
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="highlight"&gt;
&lt;pre class="brush: css"&gt;#CommentName, #CommentEmail, #CommentUrl, #CommentComment{
    display: none;
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
	Дабы не менять логики контролера, немного схитрим и вспомним про метод модели beforeValidate...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/3-jDSUTZurk" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>CakePHP</category>
            <comments>http://sinkler.ru/posts/antispam_for_cakephp#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/antispam_for_cakephp</guid>
            <pubDate>Thu, 25 Nov 2010 17:40:56 +0300</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/antispam_for_cakephp</feedburner:origLink></item>
                <item>
            <title>Селектор element#id и недобраузеры</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/dVrt6zLOWHo/element_id_and_ie7_and_opera9</link>
            <description>&lt;p&gt;
	Селектор жуквери element#id неккоректно работает в браузерах Opera 9 и Internet Explorer 7. Вместо всех елементов с заданным id выбирается только первый. Дабы и в них всё работало, используйте .class&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/dVrt6zLOWHo" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>JavaScript</category>
            <comments>http://sinkler.ru/posts/element_id_and_ie7_and_opera9#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/element_id_and_ie7_and_opera9</guid>
            <pubDate>Thu, 25 Nov 2010 16:55:12 +0300</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/element_id_and_ie7_and_opera9</feedburner:origLink></item>
                <item>
            <title>Tree behavior и callbacks</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/Uq1JTsE6hBU/tree_behavior_and_callbacks</link>
            <description>&lt;p&gt;
	&lt;img alt="" src="/files/image/cake-logo.png" style="width: 180px; height: 180px; float: right; position: relative; z-index: 999;" /&gt;Как это ни печально, но в версии CakePHP 1.3.3 опять криво работают каллбэки модели, если модель использует поведение Tree.&lt;/p&gt;
&lt;p&gt;
	В чем заключается эта кривость? Допустим, вы пытаетесь удалить запись №1 в модели Category, использующей tree behavior, у которой есть дочерние записи №2 и 3.&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
$this-&amp;gt;Category-&amp;gt;delete(1);&lt;/pre&gt;
&lt;p&gt;
	И, допустим в модели определен каллбэк beforeDelete(). Вы будете удивлены, но beforeDelete() сработает только для записи №1, проигнорировав записи 2 и 3.&lt;/p&gt;
&lt;p&gt;
	Не знаю, может в этом есть какая-то глубокая логика, но мне лично и многим другим, судя по обсуждениям в google groups, она не понятна.&lt;/p&gt;
&lt;p&gt;
	В версии CakePHP 1.2 это &amp;quot;лечилось&amp;quot; переопределением в app_model.php метода deleteAll и использованием его вместо delete:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
function deleteAll($conditions, $cascade = true, $callbacks = true) {
    $this-&amp;gt;Behaviors-&amp;gt;disable(&amp;#39;Tree&amp;#39;);
    $return = parent::deleteAll($conditions, $cascade, $callbacks);
    $this-&amp;gt;Behaviors-&amp;gt;enable(&amp;#39;Tree&amp;#39;);
    return $return;
}&lt;/pre&gt;
&lt;p&gt;
	С кейком 1.3.3 у меня эта фишка не прокатила, рыться глубоко в коде мне лень, поэтому для beforeDelete делаю так:&lt;/p&gt;
&lt;p&gt;
	1. Переношу весь код из beforeDelete в приватный метод beforeDeleteId($id):&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
private function beforeDeleteId($id) {
    //код Вашего каллбэка
    return true;
}&lt;/pre&gt;
&lt;p&gt;
	2. В beforeDelete() прописываю:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
function beforeDelete() {
    $children = $this-&amp;gt;children($this-&amp;gt;id, false, array(&amp;#39;id&amp;#39;));
    if (!empty($children)) {
        $ids = Set::format($children, &amp;#39;{1}&amp;#39;, array(&amp;#39;{n}&amp;#39;, &amp;quot;{n}.$this-&amp;gt;alias.id&amp;quot;));
        foreach ($ids as $id) {
            if(!$this-&amp;gt;beforeDeleteId($id)) {
                return false;
            }
        }
    }
    return $this-&amp;gt;beforeDeleteId($this-&amp;gt;id);
}&lt;/pre&gt;
&lt;p&gt;
	С afterDelete() ситуация немного сложнее, т.к. после удаления мы не можем узнать детей удаленной записи (они ведь тоже уже удалены). Что ж, будем узнавать их и запоминать перед удалением...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/Uq1JTsE6hBU" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>CakePHP</category>
            <comments>http://sinkler.ru/posts/tree_behavior_and_callbacks#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/tree_behavior_and_callbacks</guid>
            <pubDate>Wed, 25 Aug 2010 03:18:13 +0400</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/tree_behavior_and_callbacks</feedburner:origLink></item>
                <item>
            <title>XTemplate - читаем конфигурацию из шаблона</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/4ACtvQn08UI/read_configuration_from_xtemplate</link>
            <description>&lt;p&gt;
	Представим себе ситуацию: имеем блок, который выводит новости.&lt;/p&gt;
&lt;pre class="brush: xhtml;"&gt;
&amp;lt;!-- BEGIN:news --&amp;gt;
  &amp;lt;td class=&amp;quot;div_1&amp;quot;&amp;gt;
    &amp;lt;table&amp;gt;
      &amp;lt;tr&amp;gt;
        &amp;lt;td valign=&amp;quot;top&amp;quot; class=&amp;quot;image&amp;quot;&amp;gt;&amp;lt;a href=&amp;quot;{news.link}&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;{news.image}&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/td&amp;gt;
        &amp;lt;td valign=&amp;quot;top&amp;quot;&amp;gt;
          &amp;lt;span&amp;gt;{news.date}&amp;lt;/span&amp;gt;
          &amp;lt;p&amp;gt;{news.title}&amp;lt;/p&amp;gt;
          &amp;lt;img src=&amp;quot;{config.path.img}icon_str.gif&amp;quot; alt=&amp;quot;&amp;quot; /&amp;gt;&amp;lt;a href=&amp;quot;{news.link}&amp;quot;&amp;gt;Подробнее&amp;lt;/a&amp;gt;
        &amp;lt;/td&amp;gt;
      &amp;lt;/tr&amp;gt;
    &amp;lt;/table&amp;gt;
  &amp;lt;/td&amp;gt;
&amp;lt;!-- END:news --&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;p&gt;
	Блок используется на всех страницах сайта. Естественно, логично будет вынести парсинг этого блока куда-нибудь в бифор-каллбек контроллера, чтобы каждый раз не определять его вручную. А теперь представим, что злыдни-дизайнеры решили выводить на разных страницах разное количество новостей и при этом не говорят нам какое, а сами хотят определять это число.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/4ACtvQn08UI" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>PHP</category>
            <comments>http://sinkler.ru/posts/read_configuration_from_xtemplate#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/read_configuration_from_xtemplate</guid>
            <pubDate>Thu, 15 Jul 2010 02:36:46 +0400</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/read_configuration_from_xtemplate</feedburner:origLink></item>
                <item>
            <title>С днем рождения меня!</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/1zNOwFjHQzk/happy_birthday_19</link>
            <description>&lt;p&gt;
	&lt;img alt="" src="/files/image/birthday.jpg" style="width: 385px; height: 289px;" /&gt;&lt;/p&gt;
&lt;p&gt;
	А сегодня настал мой день рождения и испольнилось мне 19 лет. &lt;img alt="smiley" src="http://sinkler.ru/js/ckeditor/plugins/smiley/images/regular_smile.gif" title="smiley" /&gt;&lt;/p&gt;
&lt;p&gt;
	Огромное спасибо всем,&amp;nbsp;кто мучал мой телефон звонками и смс,&amp;nbsp;кто полностью переписал мою стену в контакте три раза,&amp;nbsp;кто слал длинные душераздирающие сообщения в джаббер и ICQ, в общем всем, кто создал мне в этот день отличное настроение, вы все самые-самые-самые крутые &lt;img alt="yes" src="http://sinkler.ru/js/ckeditor/plugins/smiley/images/thumbs_up.gif" title="yes" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/1zNOwFjHQzk" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>Личка</category>
            <comments>http://sinkler.ru/posts/happy_birthday_19#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/happy_birthday_19</guid>
            <pubDate>Tue, 11 May 2010 18:53:56 +0400</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/happy_birthday_19</feedburner:origLink></item>
                <item>
            <title>Мигрируем с CakePHP 1.2 на 1.3</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/oIeHh5iLzfo/migrating_from_cakephp12_to13</link>
            <description>&lt;p style="text-align: justify;"&gt;
	&lt;img align="right" alt="" height="180" src="/files/image/cake-logo.png" width="180" style="position: relative; z-index: 999;" /&gt;&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;
	Итак, у меня, наконец, появилось время и я закончил перевод &lt;a href="http://book.cakephp.org/ru/view/1561/Migrating-from-CakePHP-1-2-to-1-3" target="_blank"&gt;официального руководства по миграции с CakePHP 1.2 на версию 1.3&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;
	Перевод получился сжатым,&amp;nbsp;без лишних слов (не люблю много букав в куроводствах), по сравнению с оригиналом. Если я пропустил что-то важное или допустил неточность - обязательно напишите об этом в комментариях к статье.&lt;/p&gt;
&lt;p style="text-align: justify;"&gt;
	&amp;nbsp;&lt;/p&gt;
&lt;h3 style="text-align: justify;"&gt;
	Замена файлов каталога App&lt;/h3&gt;
&lt;ul type="disc"&gt;
	&lt;li style="text-align: justify;"&gt;
		webroot/index.php: Должен быть заменен в связи с изменением загрузочного процесса.&lt;/li&gt;
	&lt;li style="text-align: justify;"&gt;
		config/core.php: Были введены в действие дополнительные настройки, которые требуются для PHP 5.3.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style="text-align: justify;"&gt;
	Удаленные константы&lt;/h3&gt;
&lt;div style="text-align: justify;"&gt;
	Следующие константы были удалены из CakePHP. Если ваше приложение зависит от них, вы должны определить их в app/config/bootstrap.php&lt;/div&gt;
&lt;ul type="disc"&gt;
	&lt;li style="text-align: justify;"&gt;
		CIPHER_SEED - Эта константа была заменена на настройку Security.cipherSeed которую теперь можно изменить в app/config/core.php&lt;/li&gt;
	&lt;li style="text-align: justify;"&gt;
		PEAR&lt;/li&gt;
	&lt;li style="text-align: justify;"&gt;
		INFLECTIONS&lt;/li&gt;
	&lt;li style="text-align: justify;"&gt;
		VALID_NOT_EMPTY&lt;/li&gt;
	&lt;li style="text-align: justify;"&gt;
		VALID_EMAIL&lt;/li&gt;
	&lt;li style="text-align: justify;"&gt;
		VALID_NUMBER&lt;/li&gt;
	&lt;li style="text-align: justify;"&gt;
		VALID_YEAR&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 style="text-align: justify;"&gt;
	Настройка и загрузка приложения&lt;/h3&gt;
&lt;div style="text-align: justify;"&gt;
	&lt;b&gt;Дополнительные пути&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
	В вашем файле app/config/bootstrap.php вы могли использовать переменные $pluginPaths или $controllerPaths. Теперь существует новый способ добавления путей к вашим контроллерам,&amp;nbsp;моделям и т.п. Начиная с версии 1.3 RC1 переменные $pluginPaths не работают. Вы должны использовать App::build() для изменения путей.&lt;/div&gt;
&lt;pre class="brush: php;" style="text-align: justify;"&gt;
App::build(array(
    &amp;#39;plugins&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/plugins/&amp;#39;, &amp;#39;/next/full/path/to/plugins/&amp;#39;),
    &amp;#39;models&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/models/&amp;#39;, &amp;#39;/next/full/path/to/models/&amp;#39;),
    &amp;#39;views&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/views/&amp;#39;, &amp;#39;/next/full/path/to/views/&amp;#39;),
    &amp;#39;controllers&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/controllers/&amp;#39;, &amp;#39;/next/full/path/to/controllers/&amp;#39;),
    &amp;#39;datasources&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/datasources/&amp;#39;, &amp;#39;/next/full/path/to/datasources/&amp;#39;),
    &amp;#39;behaviors&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/behaviors/&amp;#39;, &amp;#39;/next/full/path/to/behaviors/&amp;#39;),
    &amp;#39;components&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/components/&amp;#39;, &amp;#39;/next/full/path/to/components/&amp;#39;),
    &amp;#39;helpers&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/helpers/&amp;#39;, &amp;#39;/next/full/path/to/helpers/&amp;#39;),
    &amp;#39;vendors&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/vendors/&amp;#39;, &amp;#39;/next/full/path/to/vendors/&amp;#39;),
    &amp;#39;shells&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/shells/&amp;#39;, &amp;#39;/next/full/path/to/shells/&amp;#39;),
    &amp;#39;locales&amp;#39; =&amp;gt; array(&amp;#39;/full/path/to/locale/&amp;#39;, &amp;#39;/next/full/path/to/locale/&amp;#39;)
));
&lt;/pre&gt;
&lt;div style="text-align: justify;"&gt;
	Кроме того, изменился порядок загрузки файлов. В прошлом, app/config/core.php загружался &lt;b&gt;после&lt;/b&gt; app/config/bootstrap.php. Это приводило к отсутствию кэширования всего, что загружается через App::import().&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
	&lt;b&gt;Загрузка пользовательских инфлекторов&lt;/b&gt;&lt;/div&gt;
&lt;div style="text-align: justify;"&gt;
	Файл inflections.php был удален, соответствующие методы реорганизованы и улучшены. Теперь вы можете использовать Inflector::rules() для создания собственных правил.&lt;/div&gt;
&lt;pre class="brush: php;" style="text-align: justify;"&gt;
Inflector::rules(&amp;#39;singular&amp;#39;, array(
    &amp;#39;rules&amp;#39; =&amp;gt; array(&amp;#39;/^(bil)er$/i&amp;#39; =&amp;gt; &amp;#39;\1&amp;#39;, &amp;#39;/^(inflec|contribu)tors$/i&amp;#39; =&amp;gt; &amp;#39;\1ta&amp;#39;),
    &amp;#39;uninflected&amp;#39; =&amp;gt; array(&amp;#39;singulars&amp;#39;),
    &amp;#39;irregular&amp;#39; =&amp;gt; array(&amp;#39;spins&amp;#39; =&amp;gt; &amp;#39;spinor&amp;#39;)
));&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/oIeHh5iLzfo" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>CakePHP</category>
            <comments>http://sinkler.ru/posts/migrating_from_cakephp12_to13#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/migrating_from_cakephp12_to13</guid>
            <pubDate>Sat, 08 May 2010 05:45:48 +0400</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/migrating_from_cakephp12_to13</feedburner:origLink></item>
                <item>
            <title>CakePHP и utf8</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/SpxQ4I7M0CU/cakephp_and_utf8</link>
            <description>&lt;p&gt;
	&lt;img align="right" alt="" height="180" src="/files/image/cake-logo.png" width="180" style="position: relative; z-index: 999;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Для того чтобы ваш сайт на CakePHP корректно работал с кодировкой utf8, необходимо сделать четыре вещи:&lt;/p&gt;
&lt;p&gt;
	1. Идем в файл app/config/database.php и меняем значение ключа &amp;quot;encoding&amp;quot; на &amp;quot;utf8&amp;quot;:&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
class DATABASE_CONFIG {

	var $default = array(
		&amp;#39;driver&amp;#39; =&amp;gt; &amp;#39;mysql&amp;#39;,
		&amp;#39;persistent&amp;#39; =&amp;gt; true,
		&amp;#39;host&amp;#39; =&amp;gt; &amp;#39;localhost&amp;#39;,
		&amp;#39;login&amp;#39; =&amp;gt; &amp;#39;root&amp;#39;,
		&amp;#39;password&amp;#39; =&amp;gt; &amp;#39;password&amp;#39;,
		&amp;#39;database&amp;#39; =&amp;gt; &amp;#39;cake_db&amp;#39;,
		&amp;#39;prefix&amp;#39; =&amp;gt; &amp;#39;&amp;#39;,
		&amp;#39;encoding&amp;#39; =&amp;gt; &amp;#39;utf8&amp;#39;
	);
}&lt;/pre&gt;
&lt;p&gt;
	И не забудьте удостовериться,&amp;nbsp;что база данных,&amp;nbsp;которую использует кейк, в кодировке utf8 (я использую utf8_general_ci).&lt;/p&gt;
&lt;p&gt;
	2. Теперь откройте файл app/config/core.php и ищем параметр конфигурации &amp;quot;App.encoding&amp;quot;. Меняем его на &amp;quot;utf-8&amp;quot;.&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
/**
 * Application wide charset encoding
 */
Configure::write(&amp;#39;App.encoding&amp;#39;, &amp;#39;utf-8&amp;#39;);&lt;/pre&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/SpxQ4I7M0CU" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>CakePHP</category>
            <comments>http://sinkler.ru/posts/cakephp_and_utf8#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/cakephp_and_utf8</guid>
            <pubDate>Tue, 23 Mar 2010 10:53:32 +0300</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/cakephp_and_utf8</feedburner:origLink></item>
                <item>
            <title>Создаем свой helper в CakePHP</title>
            <link>http://feedproxy.google.com/~r/sinkler/~3/fWuuPi8Nho4/create_your_helper_for_cakephp</link>
            <description>&lt;p&gt;
	&lt;img align="right" alt="" height="180" src="/files/image/cake-logo.png" width="180" style="position: relative; z-index: 999;" /&gt;&lt;/p&gt;
&lt;p&gt;
	Хелперы в CakePHP предназначены для быстрого представления и форматирования ваших данных удобным способом, они значительно убыстряют разработку приложений, делают её менее монотонной. CakePHP 1.2 по умолчанию включает 12 хелперов, имеющих огромное количество всевозможных методов. Два хелпера, которые вы будете наиболее часто использовать (или уже используете) в своих проектах - это Html и Form. Хелпер Html помогает быстро использовать повторяющиеся разделы html-кода, например, создавать ссылки, списки, вставлять изображения в ваши отображения. Form-хелпер поможет вам быстро создавать формы.&lt;/p&gt;
&lt;p&gt;
	Как исползовать хелперы? Первым делом, подключите необходимых помощников в контроллере, используя переменную $helpers.&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
var $helpers = array(&amp;#39;Html, Form&amp;#39;);&lt;/pre&gt;
&lt;p&gt;
	Теперь вы можете использовать их в своих отображенях, например&lt;/p&gt;
&lt;pre class="brush: php;"&gt;
echo $html-&amp;gt;link(&amp;#39;Гугль&amp;#39;, &amp;#39;http://google.ru/&amp;#39;);&lt;/pre&gt;
&lt;p&gt;
	Но, с течением времени и с развитием ваших приложений, вам наверняка захочется создать своих помощников.&lt;/p&gt;
&lt;p&gt;
	Например, на ваших страницах очень часто используется форма с выпадающим списоком для выбора одного из предложенных цветов и с кнопкой &amp;quot;выбрать&amp;quot;:&lt;/p&gt;
&lt;pre class="brush: xhtml;"&gt;
&amp;lt;form method=&amp;quot;post&amp;quot; action=&amp;quot;/cake/blog/colors/set/&amp;quot;&amp;gt;
&amp;lt;div class=&amp;quot;input select&amp;quot;&amp;gt;
    &amp;lt;label for=&amp;quot;ColorColor&amp;quot;&amp;gt;Выберите цвет&amp;lt;/label&amp;gt;
    &amp;lt;select name=&amp;quot;data[Color][color]&amp;quot; id=&amp;quot;ColorColor&amp;quot;&amp;gt;
        &amp;lt;option value=&amp;quot;green&amp;quot;&amp;gt;Зеленый&amp;lt;/option&amp;gt;
        &amp;lt;option value=&amp;quot;red&amp;quot;&amp;gt;Красный&amp;lt;/option&amp;gt;
        &amp;lt;option value=&amp;quot;white&amp;quot;&amp;gt;Белый&amp;lt;/option&amp;gt;
    &amp;lt;/select&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;div class=&amp;quot;submit&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;Выбрать&amp;quot; /&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/form&amp;gt;&lt;/pre&gt;
&lt;p&gt;
	Конечно, можно каждый раз создавать эту форму с помощью хелпера Form, а можно создать своего помощника и добавить в него метод, который будет делать это за вас.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/sinkler/~4/fWuuPi8Nho4" height="1" width="1"/&gt;</description>
            <author>sinkler@sinkler.ru</author>
            <category>CakePHP</category>
            <comments>http://sinkler.ru/posts/create_your_helper_for_cakephp#comments</comments>
            <guid isPermaLink="false">http://sinkler.ru/posts/create_your_helper_for_cakephp</guid>
            <pubDate>Sat, 20 Feb 2010 11:09:48 +0300</pubDate>
        <feedburner:origLink>http://sinkler.ru/posts/create_your_helper_for_cakephp</feedburner:origLink></item>
         
    </channel>
</rss>

