<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>я прав</title>
	<atom:link href="http://evilbloodydemon.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://evilbloodydemon.wordpress.com</link>
	<description>книга злого кровавого демона</description>
	<lastBuildDate>Fri, 06 May 2011 07:29:40 +0000</lastBuildDate>
	<language>ru</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='evilbloodydemon.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>я прав</title>
		<link>http://evilbloodydemon.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://evilbloodydemon.wordpress.com/osd.xml" title="я прав" />
	<atom:link rel='hub' href='http://evilbloodydemon.wordpress.com/?pushpress=hub'/>
		<item>
		<title>CakePHP &#8211; MongoDB session storage</title>
		<link>http://evilbloodydemon.wordpress.com/2011/04/01/cakephp-mongodb-session-storage/</link>
		<comments>http://evilbloodydemon.wordpress.com/2011/04/01/cakephp-mongodb-session-storage/#comments</comments>
		<pubDate>Fri, 01 Apr 2011 07:29:02 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=125</guid>
		<description><![CDATA[Для того, чтобы сохранять сессии в MongoDB нам понадобятся: 1. сам MongoDB 2. php-драйвер монго 3. источник данных для CakePHP MongoDB Datasource скачиваем плагин и кладем его в my/app/plugins/mongodb или забираем гитом cd my/app/plugins git clone git://github.com/ichikaway/cakephp-mongodb.git mongodb дальше в database.php описываем новое подключение &#60;?php  public $mongo = array(      'driver' =&#62; 'mongodb.mongodbSource',      'database' =&#62; 'sessions',  [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=125&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Для того, чтобы сохранять сессии в MongoDB нам понадобятся:</p>
<p>1. сам <a href="http://www.mongodb.org/downloads" target="_blank">MongoDB</a></p>
<p>2. <a href="http://php.net/mongo">php-драйвер монго</a></p>
<p>3. источник данных для CakePHP <a href="https://github.com/ichikaway/cakephp-mongodb">MongoDB Datasource</a><br />
скачиваем плагин и кладем его в my/app/plugins/mongodb или забираем гитом</p>
<p><code> cd my/app/plugins<br />
git clone git://github.com/ichikaway/cakephp-mongodb.git mongodb<br />
</code></p>
<p>дальше в database.php описываем новое подключение</p>
<pre style="color:#000000;background:#ffffff;"><span style="color:#a65700;background:#ffffe8;">&lt;?php</span><span style="color:#000000;background:#ffffe8;"> </span>
<span style="color:#800000;background:#ffffe8;font-weight:bold;">public</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#000000;background:#ffffe8;">$mongo</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#800000;background:#ffffe8;font-weight:bold;">array</span><span style="color:#808030;background:#ffffe8;">(</span><span style="color:#000000;background:#ffffe8;"> </span>
<span style="color:#000000;background:#ffffe8;">    </span><span style="color:#0000e6;background:#ffffe8;">'driver'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'mongodb.mongodbSource'</span><span style="color:#808030;background:#ffffe8;">,</span><span style="color:#000000;background:#ffffe8;"> </span>
<span style="color:#000000;background:#ffffe8;">    </span><span style="color:#0000e6;background:#ffffe8;">'database'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'sessions'</span><span style="color:#808030;background:#ffffe8;">,</span><span style="color:#000000;background:#ffffe8;"> </span>
<span style="color:#000000;background:#ffffe8;">    </span><span style="color:#0000e6;background:#ffffe8;">'host'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'localhost'</span><span style="color:#808030;background:#ffffe8;">,</span>
<span style="color:#000000;background:#ffffe8;">    </span><span style="color:#0000e6;background:#ffffe8;">'port'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#008c00;background:#ffffe8;">27017</span><span style="color:#808030;background:#ffffe8;">,</span>
<span style="color:#808030;background:#ffffe8;">)</span><span style="color:#800080;background:#ffffe8;">;</span>
<span style="color:#a65700;background:#ffffe8;">?&gt;</span></pre>
<p>&nbsp;</p>
<p>создаем модель Session, в ней описываем схему данных (хотя монго и schemaless, но кэйк сохраняет только те поля, которые описаны в схеме)</p>
<pre style="color:#000000;background:#ffffff;"><span style="color:#a65700;background:#ffffe8;">&lt;?php</span>
<span style="color:#800000;background:#ffffe8;font-weight:bold;">class</span><span style="color:#000000;background:#ffffe8;"> Session </span><span style="color:#800000;background:#ffffe8;font-weight:bold;">extends</span><span style="color:#000000;background:#ffffe8;"> AppModel </span><span style="color:#800080;background:#ffffe8;">{</span>
<span style="color:#000000;background:#ffffe8;">    </span><span style="color:#800000;background:#ffffe8;font-weight:bold;">public</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#000000;background:#ffffe8;">$mongoSchema</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#800000;background:#ffffe8;font-weight:bold;">array</span><span style="color:#808030;background:#ffffe8;">(</span>
<span style="color:#000000;background:#ffffe8;">        </span><span style="color:#0000e6;background:#ffffe8;">'id'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#800000;background:#ffffe8;font-weight:bold;">array</span><span style="color:#808030;background:#ffffe8;">(</span><span style="color:#0000e6;background:#ffffe8;">'type'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'string'</span><span style="color:#808030;background:#ffffe8;">)</span><span style="color:#808030;background:#ffffe8;">,</span>
<span style="color:#000000;background:#ffffe8;">        </span><span style="color:#0000e6;background:#ffffe8;">'data'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#800000;background:#ffffe8;font-weight:bold;">array</span><span style="color:#808030;background:#ffffe8;">(</span><span style="color:#0000e6;background:#ffffe8;">'type'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'string'</span><span style="color:#808030;background:#ffffe8;">)</span><span style="color:#808030;background:#ffffe8;">,</span>
<span style="color:#000000;background:#ffffe8;">        </span><span style="color:#0000e6;background:#ffffe8;">'expires'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#800000;background:#ffffe8;font-weight:bold;">array</span><span style="color:#808030;background:#ffffe8;">(</span><span style="color:#0000e6;background:#ffffe8;">'type'</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#808030;background:#ffffe8;">=</span><span style="color:#808030;background:#ffffe8;">&gt;</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'integer'</span><span style="color:#808030;background:#ffffe8;">)</span><span style="color:#808030;background:#ffffe8;">,</span>
<span style="color:#000000;background:#ffffe8;">    </span><span style="color:#808030;background:#ffffe8;">)</span><span style="color:#800080;background:#ffffe8;">;</span>
<span style="color:#800080;background:#ffffe8;">}</span>
<span style="color:#a65700;background:#ffffe8;">?&gt;</span></pre>
<p>&nbsp;</p>
<p>в core.php задаем новые параметры хранения сессий</p>
<pre style="color:#000000;background:#ffffff;"><span style="color:#a65700;background:#ffffe8;">&lt;?php</span>
<span style="color:#000000;background:#ffffe8;">Configure</span><span style="color:#808030;background:#ffffe8;">::</span><span style="color:#000000;background:#ffffe8;">write</span><span style="color:#808030;background:#ffffe8;">(</span><span style="color:#0000e6;background:#ffffe8;">'Session.save'</span><span style="color:#808030;background:#ffffe8;">,</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'database'</span><span style="color:#808030;background:#ffffe8;">)</span><span style="color:#800080;background:#ffffe8;">;</span>
<span style="color:#000000;background:#ffffe8;">Configure</span><span style="color:#808030;background:#ffffe8;">::</span><span style="color:#000000;background:#ffffe8;">write</span><span style="color:#808030;background:#ffffe8;">(</span><span style="color:#0000e6;background:#ffffe8;">'Session.model'</span><span style="color:#808030;background:#ffffe8;">,</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'Session'</span><span style="color:#808030;background:#ffffe8;">)</span><span style="color:#800080;background:#ffffe8;">;</span>
<span style="color:#000000;background:#ffffe8;">Configure</span><span style="color:#808030;background:#ffffe8;">::</span><span style="color:#000000;background:#ffffe8;">write</span><span style="color:#808030;background:#ffffe8;">(</span><span style="color:#0000e6;background:#ffffe8;">'Session.database'</span><span style="color:#808030;background:#ffffe8;">,</span><span style="color:#000000;background:#ffffe8;"> </span><span style="color:#0000e6;background:#ffffe8;">'mongo'</span><span style="color:#808030;background:#ffffe8;">)</span><span style="color:#800080;background:#ffffe8;">;</span>
<span style="color:#a65700;background:#ffffe8;">?&gt;</span></pre>
<p>&nbsp;</p>
<p>все получилось:</p>
<p><a href="http://evilbloodydemon.files.wordpress.com/2011/04/mongo-session.png"><img class="aligncenter size-full wp-image-128" title="mongo-session" src="http://evilbloodydemon.files.wordpress.com/2011/04/mongo-session.png?w=700&#038;h=108" alt="" width="700" height="108" /></a></p>
<p>&nbsp;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/125/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=125&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2011/04/01/cakephp-mongodb-session-storage/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>

		<media:content url="http://evilbloodydemon.files.wordpress.com/2011/04/mongo-session.png" medium="image">
			<media:title type="html">mongo-session</media:title>
		</media:content>
	</item>
		<item>
		<title>Autocomplete in views &#8211; Netbeans 6.9 + CakePHP 1.3</title>
		<link>http://evilbloodydemon.wordpress.com/2010/11/09/netbeans-cakephp-autocomplete-view/</link>
		<comments>http://evilbloodydemon.wordpress.com/2010/11/09/netbeans-cakephp-autocomplete-view/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 14:30:11 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[autocomplete]]></category>
		<category><![CDATA[netbeans]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=110</guid>
		<description><![CDATA[Старый трюк с хелперами в отдельном файле для вьюх в Netbeans 6.9 работать перестал, да и в грядущем CakePHP 2.0 хелперов отдельными переменными во вьюхах не будет. Поэтому вот как надо поступить, чтобы наслаждаться правильным автокомплитом: 1. Добавляем в проект файл autocomplete.php c таким вот содержимым &#60;?php /** * @property HtmlHelper $Html * @property FormHelper [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=110&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Старый <a href="http://evilbloodydemon.wordpress.com/2009/01/19/netbeans-cakephp-autocomplete/">трюк с хелперами</a> в отдельном файле для вьюх в Netbeans 6.9 работать перестал, да и в грядущем CakePHP 2.0 хелперов отдельными переменными во вьюхах не будет. Поэтому вот как надо поступить, чтобы наслаждаться правильным автокомплитом:</p>
<p>1. Добавляем в проект файл autocomplete.php c таким вот содержимым</p>
<pre style="color:#000000;background:#ffffff;"><span style="color:#7f0055;background:#ffffe8;">&lt;?php</span>

<span style="color:#3f7f59;background:#ffffe8;">/**</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property HtmlHelper $Html</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property FormHelper $Form</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property JsHelper $Js</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property NumberHelper $Number</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property PaginatorHelper $Paginator</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property RssHelper $Rss</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property SessionHelper $Session</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property TextHelper $Text</span>
<span style="color:#3f7f59;background:#ffffe8;">* @property TimeHelper $Time</span>
<span style="color:#3f7f59;background:#ffffe8;">*/</span>
<span style="color:#7f0055;background:#ffffe8;font-weight:bold;">class</span><span style="color:#000000;background:#ffffe8;"> AutocompleteView </span><span style="color:#7f0055;background:#ffffe8;font-weight:bold;">extends</span><span style="color:#000000;background:#ffffe8;"> View </span><span style="color:#000000;background:#ffffe8;">{</span>
<span style="color:#000000;background:#ffffe8;">}</span></pre>
<p>2. В каждой вьюхе пишем в самом начале (да, не очень изящно, но зато работает):</p>
<pre style="color:#000000;background:#ffffff;"><span style="color:#7f0055;background:#ffffe8;">&lt;?php</span><span style="color:#3f7f59;background:#ffffe8;">/* @var $this AutocompleteView */</span><span style="color:#7f0055;background:#ffffe8;">?&gt;</span></pre>
<p>3. Готово</p>
<div id="attachment_112" class="wp-caption aligncenter" style="width: 710px"><a href="http://evilbloodydemon.files.wordpress.com/2010/11/cakephp2x-netbeans-ide-6.png"><img class="size-full wp-image-112" title="cakephp2x - NetBeans IDE 6" src="http://evilbloodydemon.files.wordpress.com/2010/11/cakephp2x-netbeans-ide-6.png?w=700&#038;h=172" alt="IDE screenshot" width="700" height="172" /></a><p class="wp-caption-text">результат трудов</p></div>
<p>UPD. для массовой вставки строчки в начало шаблонов можно воспользоваться следующей командой (linux/cygwin)<br />
<code><br />
find -name "*.ctp" -print0 | xargs -0 sed -i "1i &lt;?php /** @var \$this AutocompleteView */ ?&gt;"<br />
</code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/110/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/110/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/110/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=110&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2010/11/09/netbeans-cakephp-autocomplete-view/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>

		<media:content url="http://evilbloodydemon.files.wordpress.com/2010/11/cakephp2x-netbeans-ide-6.png" medium="image">
			<media:title type="html">cakephp2x - NetBeans IDE 6</media:title>
		</media:content>
	</item>
		<item>
		<title>Scope Behavior</title>
		<link>http://evilbloodydemon.wordpress.com/2009/11/16/scope-behavior/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/11/16/scope-behavior/#comments</comments>
		<pubDate>Mon, 16 Nov 2009 09:50:18 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[behavior]]></category>
		<category><![CDATA[scope]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/2009/11/16/scope-behavior/</guid>
		<description><![CDATA[У меня возникла такая ситуация, что несколько сайтов с одинаковым движком используют одни и те же таблицы в одной базе данных. Для различения принадлежности записей в бд к сайтам используется поле site_id. Добавлять его к каждому запросу в условия довольно утомительно, поэтому я сделал специальный behavior для этой цели &#8211; Scope. в модели (например, User) [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=98&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>У меня возникла такая ситуация, что несколько сайтов с одинаковым движком используют одни и те же таблицы в одной базе данных. Для различения принадлежности записей в бд к сайтам используется поле <strong>site_id</strong>. Добавлять его к каждому запросу в условия довольно утомительно, поэтому я сделал специальный behavior для этой цели &#8211; Scope.</p>
<p>в модели (например, User) добавляем behavior и передаем ему настройки</p>
<pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;"><span style="color:#0000ff;">&lt;?</span>php
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">...
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;"><a style="color:#0000ff;" href="http://www.php.net/var">var</a> $actsAs = <a style="color:#ffa500;" href="http://www.php.net/array">array</a>(
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">    '<span style="color:#8b0000;">Scope.Scope</span>' =&gt; <a style="color:#ffa500;" href="http://www.php.net/array">array</a>(
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">        '<span style="color:#8b0000;">field</span>' =&gt; '<span style="color:#8b0000;">site_id</span>',
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">        '<span style="color:#8b0000;">value</span>' =&gt; SITE_ID,
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">    )
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">);
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">...
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;"><span style="color:#0000ff;">?&gt;</span></pre>
</pre>
<p>&#160;</p>
<p>теперь при вызове функций модели find или save условие будет добавляться автоматически, то есть</p>
<pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;"><span style="color:#0000ff;">&lt;?</span>php
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">...
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">$this-&gt;User-&gt;find('<span style="color:#8b0000;">all</span>');
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">...
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;"><span style="color:#0000ff;">?&gt;</span></pre>
</pre>
<p>&#160;</p>
<p>будет эквивалентно</p>
<pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;"><span style="color:#0000ff;">&lt;?</span>php
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">...
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">$this-&gt;User-&gt;find('<span style="color:#8b0000;">all</span>', <a style="color:#ffa500;" href="http://www.php.net/array">array</a>(
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">    '<span style="color:#8b0000;">conditions</span>' =&gt; <a style="color:#ffa500;" href="http://www.php.net/array">array</a>(
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">        '<span style="color:#8b0000;">User.site_id</span>' =&gt; SITE_ID,
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">    )
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">);
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;">...
</pre>
<pre style="background-color:#ffffff;width:100%;font-family:consolas,&#39;font-size:12px;margin:0;"><span style="color:#0000ff;">?&gt;</span></pre>
</pre>
<p>&#160;</p>
<p>Пользоваться, конечно, следует с осторожностью, так как некоторые операции, например updateAll и deleteAll c $cascade=false работают напрямую с источником данных и behavior остается не у дел (deleteAll c $cascade=true будет работать как и ожидается, с подстановкой параметров).</p>
<p>Исходный код лежит на гитхабе &#8211; <a href="http://github.com/evilbloodydemon/cakephp-scope">http://github.com/evilbloodydemon/cakephp-scope</a></p>
<p>Замечания и предложения приветствуются.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/98/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/98/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/98/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=98&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/11/16/scope-behavior/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
		<item>
		<title>Произвольная хэш функция для аутентификации в CakePHP</title>
		<link>http://evilbloodydemon.wordpress.com/2009/09/25/custom-hash-for-auth-cakephp/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/09/25/custom-hash-for-auth-cakephp/#comments</comments>
		<pubDate>Fri, 25 Sep 2009 12:35:27 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=94</guid>
		<description><![CDATA[Разработчикам чаще приходится не создавать веб-приложения с нуля, а дорабатывать существующие или по крайней мере использовать бд, которая используется совместно с другими приложениями. И скорее всего в таком случае задача хранения пароля пользователя решалась несколько по-другому, чем по умолчанию предполагается в CakePHP. Например, хэш вычисляется по фунции sha1(md5(&#8216;SeCrEt&#8217; . $password . &#8216;KeY&#8217;)). Как с этим [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=94&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Разработчикам чаще приходится не создавать веб-приложения с нуля, а дорабатывать существующие или по крайней мере использовать бд, которая используется совместно с другими приложениями. И скорее всего в таком случае задача хранения пароля пользователя решалась несколько по-другому, чем по умолчанию предполагается в CakePHP. Например, хэш вычисляется по фунции </p>
<p>sha1(md5(&#8216;SeCrEt&#8217; . $password . &#8216;KeY&#8217;)). </p>
<p>Как с этим жить?</p>
<p>CakePHP хранит пароли следующим образом:<br />
поле пароля в БД = самый стойкий из доступных хэшей(открытый пароль + секретная соль)</p>
<p>Но на наш случай у компонента <strong>Auth</strong> припасено свойство <strong>authenticate</strong> (см. http://api.cakephp.org/class/auth-component) &#8211; ссылка на объект, который реализует функцию <strong>hashPassword</strong>.</p>
<p>И, собственно говоря, пример:</p>
<p>в файле app_controller.php помещаем класс для нашей хэш функции</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#000000;font-weight:bold;">class</span> MyHash <span style="color:#009900;">&#123;</span></div>
</li>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#000000;font-weight:bold;">public</span> <span style="color:#000000;font-weight:bold;">function</span> hashPasswords<span style="color:#009900;">&#40;</span><span style="color:#000088;">$data</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span></div>
</li>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><a style="color:#000060;" href="http://www.php.net/is_array"><span style="color:#990000;">is_array</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$data</span><span style="color:#009900;">&#41;</span> <span style="color:#339933;">&amp;&amp;</span> <a style="color:#000060;" href="http://www.php.net/isset"><span style="color:#990000;">isset</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$data</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;User&#8217;</span><span style="color:#009900;">&#93;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span></div>
</li>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><a style="color:#000060;" href="http://www.php.net/isset"><span style="color:#990000;">isset</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$data</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;User&#8217;</span><span style="color:#009900;">&#93;</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;username&#8217;</span><span style="color:#009900;">&#93;</span><span style="color:#009900;">&#41;</span> <span style="color:#339933;">&amp;&amp;</span> <a style="color:#000060;" href="http://www.php.net/isset"><span style="color:#990000;">isset</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$data</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;User&#8217;</span><span style="color:#009900;">&#93;</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;password&#8217;</span><span style="color:#009900;">&#93;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span></div>
</li>
<li style="vertical-align:top;font-weight:bold;color:#006060;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$data</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;User&#8217;</span><span style="color:#009900;">&#93;</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;password&#8217;</span><span style="color:#009900;">&#93;</span> <span style="color:#339933;">=</span> <a style="color:#000060;" href="http://www.php.net/sha1"><span style="color:#990000;">sha1</span></a><span style="color:#009900;">&#40;</span> <a style="color:#000060;" href="http://www.php.net/md5"><span style="color:#990000;">md5</span></a> <span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;SeCrEt&#8217;</span> <span style="color:#339933;">.</span> <span style="color:#000088;">$data</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;User&#8217;</span><span style="color:#009900;">&#93;</span><span style="color:#009900;">&#91;</span><span style="color:#0000ff;">&#8216;password&#8217;</span><span style="color:#009900;">&#93;</span> <span style="color:#339933;">.</span> <span style="color:#0000ff;">&#8216;KeY&#8217;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span></div>
</li>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span></div>
</li>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span></div>
</li>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#b1b100;">return</span> <span style="color:#000088;">$data</span><span style="color:#339933;">;</span></div>
</li>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#009900;">&#125;</span></div>
</li>
<li style="vertical-align:top;font-weight:bold;color:#006060;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#009900;">&#125;</span></div>
</li>
</ol>
</div>
<p>а в функции <strong>AppController::beforeFilter</strong> пишем строчку</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li style="font-weight:normal;vertical-align:top;font:normal normal 130% 'Courier New', Courier, monospace;color:#003030;">
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">Auth</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">authenticate</span> <span style="color:#339933;">=</span> <span style="color:#000000;font-weight:bold;">new</span> MyHash<span style="color:#009900;">&#40;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span></div>
</li>
</ol>
</div>
<p>Готово!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/94/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/94/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/94/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=94&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/09/25/custom-hash-for-auth-cakephp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
		<item>
		<title>Ускорение Netbeans</title>
		<link>http://evilbloodydemon.wordpress.com/2009/09/24/netbeans-speedup/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/09/24/netbeans-speedup/#comments</comments>
		<pubDate>Thu, 24 Sep 2009 06:01:08 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[all]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jvm]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[speedup]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=91</guid>
		<description><![CDATA[Netbeans &#8211; самая лучшая IDE для разработки на php, но иногда несколько задумчивая. Этот недостаток исправляется некоторыми настройками для java-машины. В /etc/netbeans.conf или в ярлык для запуска IDE нужно добавить следующие опции -J-client -J-Xms32m -J-Xmx384m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-XX:CompileThreshold=100 -XX:+CompressedOOPS -XX:+AggressiveOpts -XX:+TieredCompilation -XX:+DoEscapeAnalysis -XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled Таким образом мы разрешаем использовать до 384 мб памяти, [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=91&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Netbeans &#8211; самая лучшая IDE для разработки на php, но иногда несколько задумчивая. Этот недостаток исправляется некоторыми настройками для java-машины.<br />
В /etc/netbeans.conf или в ярлык для запуска IDE нужно добавить следующие опции</p>
<p><code>-J-client -J-Xms32m -J-Xmx384m -J-XX:PermSize=32m -J-XX:MaxPermSize=200m -J-Xverify:none -J-XX:CompileThreshold=100 -XX:+CompressedOOPS -XX:+AggressiveOpts -XX:+TieredCompilation -XX:+DoEscapeAnalysis -XX:+UseConcMarkSweepGC -J-XX:+CMSClassUnloadingEnabled -J-XX:+CMSPermGenSweepingEnabled</code></p>
<p>Таким образом мы разрешаем использовать до 384 мб памяти, компилировать в машинный код большинство функций и оптимизировать их.</p>
<p>Результат вас приятно удивит.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/91/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/91/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/91/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=91&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/09/24/netbeans-speedup/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
		<item>
		<title>Netbeans CakePHP Bundle</title>
		<link>http://evilbloodydemon.wordpress.com/2009/09/10/netbeans-cakephp-bundle/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/09/10/netbeans-cakephp-bundle/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 06:16:01 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[bundle]]></category>
		<category><![CDATA[netbeans]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=87</guid>
		<description><![CDATA[Смастерил набор сниппетов для Netbeans, облегчающих разработку на фреймворке CakePHP. 50 для шаблонов отображения и 26 для php-кода. Источником вдохновения послужил оригинальный бандл для маковского редактора TextMate, в котором на скринкастах так ловко набирают километры исходных кодов для торта. Возможности у сниппетов в нетбинс не такие широкие, как у текстмэйта, но я постарался максимально сохранить [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=87&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Смастерил набор сниппетов для Netbeans, облегчающих разработку на фреймворке CakePHP.<br />
50 для шаблонов отображения и 26 для php-кода.<br />
Источником вдохновения послужил оригинальный бандл для маковского редактора TextMate, в котором на скринкастах так ловко набирают километры исходных кодов для торта. Возможности у сниппетов в нетбинс не такие широкие, как у текстмэйта, но я постарался максимально сохранить оргинальное поведение.</p>
<p>Дистрибутив и репозиторий лежат на <a href="http://github.com/evilbloodydemon/netbeans-cakephp-bundle/">гитхабе</a></p>
<p>Установка очень проста:</p>
<p>  1. скачать последний релиз <a href="http://github.com/evilbloodydemon/netbeans-cakephp-bundle/downloads">отсюда</a><br />
  2. Запустить нетбинс<br />
  3. Импортировать сниппеты (Tools -&gt; Options -&gt; Import)<br />
  4. Перезапустить нетбинс<br />
  5. Делать сайты в десять раз быстрее</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/87/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/87/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/87/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=87&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/09/10/netbeans-cakephp-bundle/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
		<item>
		<title>Еще раз о Cake3</title>
		<link>http://evilbloodydemon.wordpress.com/2009/08/06/cake3-cakephp-again/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/08/06/cake3-cakephp-again/#comments</comments>
		<pubDate>Thu, 06 Aug 2009 11:07:33 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=82</guid>
		<description><![CDATA[Введение Да, да, я знаю. Такое уже было раньше. Что я могу сказать &#8211; у меня были вопросы, а у Nate были ответы. Это первая часть, в ней рассматриваются общие вопросы о CakePHP и Cake3. Общие вопросы Похоже что у CakePHP будут сразу три версии, это несомненно может запутать новых разработчиков. Я не видел официальных [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=82&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Введение</strong></p>
<p>Да, да, я знаю. Такое <a href="http://evilbloodydemon.wordpress.com/2009/07/22/cakephp-3/">уже было раньше</a>. Что я могу сказать &#8211; у меня были вопросы, а у Nate были ответы. Это первая часть, в ней рассматриваются общие вопросы о CakePHP и Cake3.</p>
<p><strong>Общие вопросы</strong></p>
<p><strong>Похоже что у CakePHP будут сразу три версии, это несомненно может запутать новых разработчиков. Я не видел официальных заявлений на этот счет, так что поправьте меня, если я не прав:<br />
- ветка 1.3 &#8211; для всех, кто пишет под PHP4<br />
- ветка 2.0 &#8211; для тех, кто разрабатывает новые проекты под PHP5-5.2 или для тех, кто использует PHP 5.3 и хочет проапгрейдить приложения, написанные под CakePHP 1.2<br />
- ветка 3.0 &#8211; для приложений на PHP 5.3</strong></p>
<p>Почти верно. Как только ветка 1.3 станет стабильной, разработка версии 1.x прекратится, будут только исправляться ошибки и проблемы безопасности. Мы еще не определились с возможностью обратного портирования фич из 2.x, но это будет зависить от спроса на такую деятельность, чего не предвидится. и да, 2.0 позволит просто переносить приложения с 1.3 (его API практически не отличается от 1.2). 3.0, в свою очередь, находится в ранних стадиях разработки и не рекомендуется ни для чего, кроме экспериментов.</p>
<p><span id="more-82"></span><br />
<strong>Сколько людей участвует в разработке трех новых версий Cake? Как они распределены по веткам в процентном соотношении?</strong></p>
<p>В общем у нас 16 активных разработчиков, которые работают и над кодом и над другими вещами. Над 1.3 работают 6 человек, основную работу ведут <a href="http://twitter.com/mark_story">Mark Story</a> и <a href="http://twitter.com/jperras">Joël Perras</a>. Для работ над 2.0 Larry Masters (глава проекта и корпорации cakedc.com) &laquo;одолжил&raquo; нам несколько разработчиков из своей корпорации, в частности Graham Weldon (a.k.a. <a href="http://twitter.com/predominant">Predominant</a>), который работает над полной совместимостью кода с PHP5.</p>
<p>И, наконец, я &#8211; ведущий разработчик 3.0, а Joël, Garrett, <a href="http://twitter.com/nperson">David Persso</a>n, and <a href="http://twitter.com/DarkAngelBGE">Tim</a> &amp; <a href="http://twitter.com/felixge">Felix</a> (из <a href="http://debuggable.com/">Debuggable</a>) присылают мне патчи. </p>
<p><strong>Вопросы про Cake3</strong></p>
<p><strong>Сейчас 1.3 и 2.0 имеют лицензию MIT. А у Cake3 будет лицензия BSD. Каковы причины этого и как это повлияет на разработчиков?</strong></p>
<p>Честно говоря, это никак не повлияет на разработчиков. В плане того, что вы можете делать с программным обеспечением лицензия BSD разрешает столько же, если не больше, как и MIT. Смена лицензии произошла из-за моих предпочтений: BSD более старая лицензия с более определенной историей. gwoo поддержал это решение, так как BSD включает специальный раздел, который защищает брэнд CakePHP и Cake Software Foundation от коммерческого использования, против чего мы очень возражаем. Мы рады, что люди строят бизнес на нашем коде, но использование ими наших брендов для собственного продвижения не соответствует духу того, чем мы занимаемся.</p>
<p><strong>Cake3 будет возвращать результаты запросов в виде объектов, а не в виде массивов. Я конечно могу ошибаться, но кажется ты предпочитал подход с использованием массивов? С чем связана смена позиции по этому вопросу, пришлось смириться или ты так и планировал?</strong></p>
<p>Я предпочитал массивы в определенном контексте и так как контекстом раньше являлся PHP4, и в нём были функции для работы с массивами, на которые всегда можно было рассчитывать, а нормальной объектной модели не было, то это был очевидный выбор. Сейчас мы все это переросли и нет никакой необходимости работать с массивами, что освобождает нас от множества ограничений в дизайне, с ними связанных.</p>
<p><strong>Было ли что-нибудь взято из <a href="http://groups.google.com/group/cake-php/browse_thread/thread/134b180ce477b9ef/7868d41614958d02?q=#7868d41614958d02">&laquo;топика ненависти&raquo;</a>, что ты не планировал реализовывать или хотел реализовать по другому, но пошел на поводу у сообщества?<br />
</strong><br />
Возможно одна из самых значимых смен точки зрения (не только из за &laquo;топика ненависти&raquo;) &#8211; это поддержка составных ключей. Простые ключи хороши тем, что их легко использовать и на низком и на высоком уровне (REST API и тд) и это здорово. Но что я осознал, это то, что часто (опять же в контексте) существуют хорошие аргументы в пользу составных ключей. И хотя мы не поддерживаем их на высоком уровне абстракции, это та вещь, которую должен поддерживать любой хорошо спроектированных слой абстракции данных.</p>
<p><strong>Предположим, я довольно хороший разработчик, который любит ковыряться в коде, присылать патчи и я начинаю проект, который будет запущен минимум через год. Было бы разумным начинать этот проект на Cake3?</strong></p>
<p>Ну, это зависит от приложения. В большинстве случаев вы просто должны были бы сделать это, потому что сейчас множество базовых вещей вроде паджинации и сессий просто не реализованы. Хотя это не имеет особого значения из-за новой структуры Cake3. Вы можете загружать классы и библиотеки довольно легко, можно даже подключить Doctrine вместо дефолтного ORM. Также большая часть API будет вам знакома, если вы уже разрабатывали на CakePHP.</p>
<p>Если у кого-то действительно есть экспериментальное приложение в разработке и он бы хотел поучаствовать в разработке Cake3, то я бы пообщался с ним по этому поводу. Самая важная вещь в этой версии &#8211; система плагинов, уже реализована и плагины обрабатываются также как и приложение и даже как ядро, так что всё взаимозаменяемо. Еще одно архитектурное отличие &#8211; большинство классов ядра может быть заменена вашими собственными.</p>
<p>С помощью этого решения мы надеемся, что когда ядро стабилизируется, вся разработка будет перенесена в плагины. Это очень важно, потому что барьер участия в маленьком проекте с ограниченным набором фич гораздо ниже. Разработка может вестись параллельно и фичи могут вносится в базовую поставку и изыматься из неё практически без влияния на код приложения.</p>
<p><strong>Что происходит с юнит-тестированием в Cake3? Похоже что SimpleTest выкинули и заменили самописным инструментом тестирования</strong></p>
<p>Опять же, это одно из тех решений, которые были сделаны за нас раньше, так как SimleTest был единственным доступным решением для PHP4. Теперь мы решили написать инструмент тестирования самостоятельно, причин тому несколько, но основные это<br />
(а) мы хотели бы, чтобы люди могли запускать тесты сразу после установки<br />
(б) нам нужна инфраструктура для тестов, которая заточена под наши нужды и позволяла бы нам тестировать так, как нам нужно. Причем тестировать не только ядро, но и приложения с плагинами.</p>
<p>Тем не менее, мы планируем сделать нашу систему тестирования довольно легковесной и одна из вещей, которая будет пересмотрена перед релизом &#8211; это API, скорее всего он будет более совместим с PHPUnit для того, чтобы облегчить переход для приложений с большим набором тестов.</p>
<p><strong>Система фильтов выглядит очень мило и уже обсуждалась. Какая фича Cake3 кажется вам классной, но не получила внимания?</strong></p>
<p>Самая значимая вещь, о которой я рассказывал не так много &#8211; это класс Media. Он интересен тем, что он берет на себя большую часть работы по обработке различных типов контента. Он размещается между контроллером и вью и позволяет присоединять различные обработчики для различных типов контента, причем как для ввода, так и для вывода. Это означает, что вместо того, чтобы создавать вью каждый раз, когда нужно чтобы метод контроллера отправил JSON, вы можете единожды присоединить обработчик, который будет формировать JSON из переменных, определенных в методе контроллера. А для HTML, по умолчанию определен фильтр, который отрисовывает шаблоны из каталога views/. Но даже в этом существует невероятная гибкость и теперь всё можно настраивать в одном месте.</p>
<p><strong>Я тут кое-чего с фильтрами не могу понять. Ты привязываешь фильтр к методу, но не указываешь до или после метода его нужно применять, так?<br />
Если до, то ты просто исполняешь код до того, как вызвать return $chain-&gt;next(&#8230;). А если нужно после? Вот так вот?</strong></p>
<p><code>$ret = $chain-&gt;next($self, $params, $chain);<br />
//my code<br />
return $ret;   </code></p>
<p>Да, именно так. Вы можете представлять себе написание фильтра как переопределение метода в подклассе, но вместо вызова родительского метода, вы вызываете $chain-&gt;next(&#8230;). У такого подхода множество преимуществ по сравнению с до- и после- фильтрами, например то, что все действия остаются в одной области видимости и вам не нужно разбивать их на два метода и беспокоится о сохранении состояния. Все операции теперь атомарны и изолированы, а код более понятен. </p>
<p>Продолжение следует</p>
<p>Эта статья &#8211; перевод. Оригинал &#8211; <a href="http://www.pseudocoder.com/archives/2009/08/05/9-questions-with-nate-abele-lead-developer-of-cakephp/">тут</a>.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/82/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/82/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/82/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=82&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/08/06/cake3-cakephp-again/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
		<item>
		<title>cakephp 3.0</title>
		<link>http://evilbloodydemon.wordpress.com/2009/07/22/cakephp-3/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/07/22/cakephp-3/#comments</comments>
		<pubDate>Wed, 22 Jul 2009 11:17:02 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=76</guid>
		<description><![CDATA[Сейчас очень мало информации о CakePHP 2.0 и особенно о суперновом 3.0, так что я решил провести небольшое интервью с Nate Abele, ведущим разработчиком CakePHP. Привет, Nate, CakeFest завершился и слух об анонсе CakePHP 2.0 и Cake 3 постепенно распространяется. Можешь рассказать в общих чертах, что будет в новых версиях? CakePHP 2.0 &#8211; это обновление [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=76&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Сейчас очень мало информации о CakePHP 2.0 и особенно о суперновом 3.0, так что я решил провести небольшое интервью с Nate Abele, ведущим разработчиком CakePHP.</p>
<p><strong>Привет, Nate, CakeFest завершился и слух об анонсе CakePHP 2.0 и Cake 3 постепенно распространяется. Можешь рассказать в общих чертах, что будет в новых версиях?</strong></p>
<p>CakePHP 2.0 &#8211; это обновление текущей версии 1.x с переходом на строгую совместимость с PHP5, что означает, помимо выгоды от избавления от излишнего кода для поддержки PHP4, повышение производительности примерно на 25%.</p>
<p>Cake 3, с другой стороны, значительно отличается от текущей версии по ряду параметров. В основном тем, что с нуля переписан на PHP 5.3.</p>
<p><strong>CakePHP 2.0 будет совместим с 1.x? Мы уже пережили значительный апгрейд с 1.1 на 1.2, апгрейд на 2.0 видимо будет еще более тяжелым?</strong><br />
<span id="more-76"></span><br />
Вообще-то, нет. CakePHP 2.0 будет практически 100% совместим на уровне API с грядущим CakePHP 1.3, который, в свою очередь, будет совместим с 1.2, за исключением некоторых устаревших (но еще работающих) методов.</p>
<p>Также, на случай миграции с 1.2 на 1.3/2.0, у нас есть инструкция, в которой будет сказано, какие небольшие изменения нужно будет внести в код существующих приложений.</p>
<p><strong>Круто, то есть будет халявный прирост производительности для всех существующих 1.2 приложений?</strong></p>
<p>Именно что.</p>
<p><strong>Хорошо, вернемся к 3.0. Расскажи-ка немного о фундаментальных изменениях в PHP как языке и о том, как они повлияли на новое ядро CakePHP.</strong></p>
<p>Ну, для CakePHP, переход от совместимости с PHP4 прямо на php5.3 &#8211; это очень большой шаг, не только из-за новых фич 5.3, но также и из-за фич PHP5, которыми мы наконец-то сможем воспользоваться.</p>
<p>Одна из важных фич PHP5.3, которая повлияла на новую архитектуру &#8211; пространства имён. Новое ядро организовано в виде пакетов, каждый из которых состоит, в свою очередь, из других пакетов.</p>
<p>Это делает новое ядро не только модульным (т.е. его части могут быть использованы и в не-Cake приложениях), но также делает систему плагинов очень простой и мощной. Плагины теперь могут неограниченно расширять функциональность любого класса приложения, ядра и даже динамически изменять зависимости ядра.</p>
<p>Другая фича &#8211; замыкания. Замыкания &#8211; это анонимные функции (то есть функции, присвоенные свойству класса или переменной), которые могут наследовать контекст области видимости, в которой они объявлены. Это позволяет нам внедрять необходимую функциональность прямо в классы и методы, и в Cake3 мы используем их в системе фильтров.</p>
<p>В новом ядре, множество методов объектов реализуют систему фильтров, что позволяет привязывать произвольную функциональность прямо к вызовам методов: модифицировать параметры и возвращаемые значения.</p>
<p>Это очень мощная штука, она позволяет легко реализовать такую функциональность как кэширование или логгирование, так как она может быть применена ненавязчиво, без необходимости для целевого класса знать, как делать все эти штуки.</p>
<p>Одна из вещей, с которой мы боремся как разработчики &#8211; слишком тесное взаимодествие классов из-за того, что каждый знает о механизме работы другого.<br />
С помощью системы фильтров мы можем сохранять классы полность изолированными, но по-прежнему имеющими возможноть взаимодействовать не зная ничего друг о друге.<br />
Другая отличная фича этой системы &#8211; стандартный интерфейс, поэтому все фильтры могут быть применены одинаковым образом. Так что если вы знаете, как писать фильтры для одного класса, то вы знаете, как это делать для них всех.</p>
<p><strong>Можно пример?</strong></p>
<p>Предположим, я хочу лог всех запросов к БД. В 1.2 классы работы с БД записывают запросы, исполняют их и возвращают список, когда их попросят. Хотя классы работы с БД должны работать только с БД, они не должны ничего знать ни о каких логах.</p>
<p>В Cake3 я могу сделать так:</p>
<blockquote><p>applyFilter(&#8216;_execute&#8217;, function($self, $params, $chain) {<br />
  $out = fopen(&#8216;php://stderr&#8217;);<br />
  fwrite($out, $params['sql']);<br />
  fclose($out);<br />
  return $chain-&gt;next($self, $params, $chain);<br />
});<br />
?&gt;</p></blockquote>
<p>Здесь я получаю объект БД из класса Connections (это эквивалент вызова ConnectionManager::getDataSource() в 1.2) и присоединяю фильтр, который перехватывает метод _execute().<br />
После этого, я мог бы отправить вывод в класс логгинга, но сейчас я просто хочу вывести запросы в лог ошибок, чтобы быстренько посмотреть что да как.<br />
Фильтр будет применен каждый раз, когда запрос отправится в БД, таким образом все запросы будут записаны, как я и хотел.</p>
<p><strong>Получается, что фильтры можно применить только к объекту, а не к классу?</strong></p>
<p>Ну вообще-то пример &#8211; это лишь маленькая часть мощи системы фильтров.<br />
Для инстанцируемых классов &#8211; да, обычно фильтры применяются по необходимости. Хотя, фреймворк активно разрабатывается, и мы столкнулись с необходимостью конфигурировать все объекты определенного типа, так что в будущем будет возможно и это.</p>
<p>Кроме того, в ядре появится новый класс &#8211; Collection. Этот класс похож на массив, но с дополнительными полезностями, наподобие вызова метода у всех содержащихся в нем объектах при вызове метода у самого класса коллекции. Таким образом, возможно применить фильтр у множества объектов сразу используя такую технику.</p>
<p><strong>Ты упомянул класс коллекций, а вот я слышал, что модели подвергнуться наибольшим изменениям в 3.0. Не раскроешь планы насчет этого?</strong></p>
<p>Да, в чем-то модели поменяются, а в чем-то &#8211; нет. Например, записи по-прежнему будут получаться чем-то наподобие  $posts = Post::find(&laquo;all&raquo;);<br />
Это и все связанное с моделями должно быть сразу же понятно любому, кто сейчас работает с кэйком.</p>
<p>Но внутри, модели будут полностью новыми. Теперь они будут взаимодействовать с источниками данных через ограниченный набор методов с помощью объектов Query. Эти объекты очень полезны, так как они позволяют нам инкапсулировать большую часть работы по генерации запросов, которая раньше была разбросана по нескольким разным классам. Кроме того, так как query-объекты работают с уровнем данных и так как объекты ядра могут быть заменены пользовательскими, то пользователи могут легко модифицировать и расширять синтаксис SQL, поддерживаемый кэйком.</p>
<p>С помощью упоминавшегося класса коллекций, результаты запроса стали объектами, причем объектами стали не только записи, но и наборы записей. Объект RecordSet, потомок Collection, похож на массив в том смысле, что можно пройтись по нему foreach сотоварищи. Но он также имеет и значительные улучшения, наподобие ленивой подгрузки записей по мере надобности.<br />
Эта его особенность отражает архитектурное решение &#8211; во всех частях фрэймворка, где это только возможно, используется новая более объектно-ориентированная архитектура, причем ленивая. </p>
<p>То есть любая загрузка или обработка не произойдет до тех пор, пока реально не понадобиться. Классы не загружаются, пока не начнут использоваться, маршруты не компилируются, пока не будут запрошены, результаты запросов не извлекаются пока вы не начнете их обрабатывать.<br />
Вместе с множеством других архитектурных улучшений это делает новое ядро очень эффективным.</p>
<p><strong>Если записи теперь объекты, получается что CakePHP получит полноценную реализацию ActiveRecord?</strong></p>
<p>Ну да. С новой фичей PHP5.3 &#8211; Late Static Binding мы можем обращаться к статическим классам, как показано выше.</p>
<p><strong>Хорошо. Моя личная цель &#8211; прекратить испльзовать реляционные БД для неструктурированных данных в 2009 году. В Cake3 будет поддержка чего-нибудь такого?</strong></p>
<p>Определенно. С упрощенным интерфейсом DataSource и менее строгими требованиями к схеме данных, моделирование нереляционных данных стало значительно легче. Новая система моделей также более гибкая в плане определения связей между моделями. С помощью query-объектов вы можете реализовать флаги и выражения, специфичные для хранилища данных, с которым вы работаете.</p>
<p><strong>Невероятно! И когда же мы получим все эти крутанские штуки? Есть какой-нибудь план по выпуску Cake3?</strong></p>
<p>Хотя код доступен непосредственно на code.cakephp.org, трудно сказать когда будет официальный релиз. Но ожидайте значительного объема работы в ближайшие месяцы.</p>
<p>У Cake3 появились новые фичи и новые требования к серверной части. Что если сравнить его с такими фремворками, как Ruby on Rails, Django и тд?</p>
<p>Ну, миграция с PHP 5.2 на 5.3 быстрая и безболезненная, так как в области существующих фич мало что изменилось. Как всегда PHP &#8211; это самая простая в использовании и самая простая в развертывании платформа в вебе. Разместить сайт &#8211; это всего лишь скопировать файлы в корень сайта. </p>
<p>Поддержка PHP приложений всегда была простой и в плане производительности PHP всегда был на высоте. С его архитектурой вам не приходится беспокоиться об управлении памятью, дедлоками или проблемами с инфраструктурой при масштабировании.</p>
<p>Это перевод, оригинал &#8211; <a href="http://debuggable.com/posts/Cake_3_interview_with_Nate_Abele:4a665a5e-5bfc-4e42-96ee-6d284834cda3">здесь</a></p>
<p>Ссылки:<br />
CakePHP 2.0 &#8211; <a href="http://code.cakephp.org/cakephp2">http://code.cakephp.org/cakephp2</a><br />
Cake3 &#8211; <a href="http://code.cakephp.org/cake3">http://code.cakephp.org/cake3</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/76/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/76/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/76/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=76&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/07/22/cakephp-3/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
		<item>
		<title>Интерактивная консоль для CakePHP</title>
		<link>http://evilbloodydemon.wordpress.com/2009/06/09/cakephp-interactive-console/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/06/09/cakephp-interactive-console/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 06:46:24 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=70</guid>
		<description><![CDATA[Matt Curry смастерил плагин Interactive для плагина DebugKit. Для чего он нужен? В DebugKit добавляется новая панель &#8211; интерактивная консоль CakePHP. В ней можно: выполнять простой пхп-код 10 % 4 //вернет 2 is_array(49) //вернет false выполнять SQL SELECT id FROM users WHERE email = 'test@test.com' //вернет id пользователя UPDATE posts SET published = false; //вернет [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=70&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pseudocoder.com/archives/2009/06/09/interactive-plugin-for-cakephp-console-and-debugkit/">Matt Curry</a> смастерил плагин <a href="http://github.com/mcurry/interactive">Interactive</a> для плагина <a href="http://evilbloodydemon.wordpress.com/2009/01/20/debugkit-for-cakephp/">DebugKit</a>.</p>
<p><strong>Для чего он нужен?</strong></p>
<p><span id="more-70"></span><br />
В DebugKit добавляется новая панель &#8211; интерактивная консоль CakePHP. В ней можно:</p>
<p><strong>выполнять простой пхп-код</strong><br />
<code>10 % 4 //вернет 2<br />
is_array(49) //вернет false  </code></p>
<p><strong>выполнять SQL</strong><br />
<code>SELECT id FROM users WHERE email = 'test@test.com' //вернет id пользователя<br />
UPDATE posts SET published = false; //вернет "No results found.", но обновление выполнит</code></p>
<p><strong>использовать функции</strong><br />
<code>__('Test Message', true) //возвратит перевод текста в соответствии с установленной локалью<br />
Configure::write('Config.language', 'es');<br />
__('Test Message', true); //возвратит перевод текста по-испански</code></p>
<p><strong>использовать библиотеки</strong><br />
<code>Security::hash('my_pAssw0rd', null, true) //возвратит хэш пароля<br />
Set::extract('/id', array(array('id' =&gt; 3), array('name' =&gt; 'test', 'id' =&gt; 4))) //array(3, 4)  </code></p>
<p><strong>использовать хелперы</strong><br />
<code>$html-&gt;link('Posts', array('controller' =&gt; 'posts')) //возвратит html-код для ссылки и саму ссылку<br />
$form-&gt;input('Post.title'); //возвратит код поля ввода и само поле</code></p>
<p><strong>использовать код вашего приложения</strong><br />
<code>Post::find('first') //The first record from your posts table<br />
User::findById(3) //The user record for id 3  </code></p>
<p><strong>проводить отладку</strong><br />
если что-то работает, не так как вы задумывали, то можно включить отладку</p>
<p><code>Configure::write('debug', 2);<br />
User::findByIdd(3) //покажет ошибку  </code></p>
<p><strong>примечания</strong><br />
при использовании консоли через DebugKit можно группировать команды, разделяя их точкой с запятой. Хотя при этом нельзя объявить переменную в одной команде, а использовать в другой. Вот такой код не сработает:</p>
<p><code>$i = 10;<br />
$i ++;<br />
echo $i;</code></p>
<p>Также следует заметить, что в примерах никогда не указывалась ни одна из используемых моделей. Плагин заботится об этом сам. Можно вызывать методы как статические, так и как динамические. Все это будет работать:</p>
<p><code>Post::find('first');<br />
$Post-&gt;find('first');<br />
Post-&gt;find('first');<br />
$this-&gt;Post-&gt;find('first');  </code></p>
<p>Установка.<br />
1. Скачать <a href="http://github.com/mcurry/interactive">плагин</a> с гитхаба<br />
2. Поставить <a href="http://thechaw.com/debug_kit">DebugKit из транка</a><br />
3a. В AppController подключить панель<br />
<code>$components = array('DebugKit.Toolbar' =&gt; array('panels' =&gt; array('Interactive.interactive')));</code><br />
3б. Использовать через консоль<br />
<code>cake interactive</code></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/70/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/70/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/70/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=70&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/06/09/cakephp-interactive-console/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
		<item>
		<title>Как объединить действия add и edit вместе</title>
		<link>http://evilbloodydemon.wordpress.com/2009/06/01/cakephp-merge-add-and-edit/</link>
		<comments>http://evilbloodydemon.wordpress.com/2009/06/01/cakephp-merge-add-and-edit/#comments</comments>
		<pubDate>Mon, 01 Jun 2009 10:40:58 +0000</pubDate>
		<dc:creator>evilbloodydemon</dc:creator>
				<category><![CDATA[all]]></category>

		<guid isPermaLink="false">http://evilbloodydemon.wordpress.com/?p=67</guid>
		<description><![CDATA[Контроллер Обычно, когда вы создаете приложение, то вам нужны и страница для добавления записей и для их редактирования. Контроллеры и отображения, которые создаются с помощью консоли, считают эти действия отдельными сущностями, что приводит к дублированию кода. Вот действия add и edit, созданные через консоль: function add&#40;&#41; &#123; &#160; &#160; if &#40;!empty&#40;$this-&#62;data&#41;&#41; &#123; &#160; &#160; &#160; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=67&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Контроллер</strong></p>
<p>Обычно, когда вы создаете приложение, то вам нужны и страница для добавления записей и для их редактирования. Контроллеры и отображения, которые создаются с помощью консоли, считают эти действия отдельными сущностями, что приводит к дублированию кода.</p>
<p>Вот действия add и edit, созданные через консоль:<br />
<span id="more-67"></span></p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#000000;font-weight:bold;">function</span> add<span style="color:#009900;">&#40;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#339933;">!</span><a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">Post</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">create</span><span style="color:#009900;">&#40;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">Post</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">save</span><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">flash</span><span style="color:#009900;">&#40;</span>__<span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;User saved.&#8217;</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></div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.php.net/array"><span style="color:#990000;">array</span></a><span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;action&#8217;</span><span style="color:#339933;">=&gt;</span><span style="color:#0000ff;">&#8216;index&#8217;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span> <span style="color:#b1b100;">else</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#000000;font-weight:bold;">function</span> edit<span style="color:#009900;">&#40;</span><span style="color:#000088;">$id</span> <span style="color:#339933;">=</span> <span style="color:#009900;font-weight:bold;">null</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#339933;">!</span><span style="color:#000088;">$id</span> <span style="color:#339933;">&amp;&amp;</span> <a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">flash</span><span style="color:#009900;">&#40;</span>__<span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;Invalid Post&#8217;</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> <a href="http://www.php.net/array"><span style="color:#990000;">array</span></a><span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;action&#8217;</span><span style="color:#339933;">=&gt;</span><span style="color:#0000ff;">&#8216;index&#8217;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#339933;">!</span><a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">Post</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">save</span><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">flash</span><span style="color:#009900;">&#40;</span>__<span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;The Post has been saved.&#8217;</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> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.php.net/array"><span style="color:#990000;">array</span></a><span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;action&#8217;</span><span style="color:#339933;">=&gt;</span><span style="color:#0000ff;">&#8216;index&#8217;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span> <span style="color:#b1b100;">else</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span> <span style="color:#339933;">=</span> <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">Post</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">read</span><span style="color:#009900;">&#40;</span><span style="color:#009900;font-weight:bold;">null</span><span style="color:#339933;">,</span> <span style="color:#000088;">$id</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#009900;">&#125;</span></div>
</li>
</ol>
</div>
<p>Как вы видите, весь метод add продублирован в методе edit. Мы можем избавиться от метода add и заставить метод edit обрабатывать создание новых записей. Есть несколько способов сделать это.</p>
<p>Можно удалить метод add() полностью, добавив маршрут, который перенаправляет /add на метод edit</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">Router<span style="color:#339933;">::</span><span style="color:#004000;">connect</span><span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;/:controller/add&#8217;</span><span style="color:#339933;">,</span> <a href="http://www.php.net/array"><span style="color:#990000;">array</span></a><span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;action&#8217;</span> <span style="color:#339933;">=&gt;</span> <span style="color:#0000ff;">&#8216;edit&#8217;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
</ol>
</div>
<p>Или же можно все ссылки, указывающие на /add, заменить на /edit</p>
<p>Также потребуются некоторые изменения в методе edit.<br />
Удалите первый блок if:</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#339933;">!</span><span style="color:#000088;">$id</span> <span style="color:#339933;">&amp;&amp;</span> <a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">flash</span><span style="color:#009900;">&#40;</span>__<span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;Invalid Post&#8217;</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> <a href="http://www.php.net/array"><span style="color:#990000;">array</span></a><span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;action&#8217;</span><span style="color:#339933;">=&gt;</span><span style="color:#0000ff;">&#8216;index&#8217;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#009900;">&#125;</span> </div>
</li>
</ol>
</div>
<p>Измените последний блок if c:</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
</ol>
</div>
<p>на:</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#000088;">$id</span> <span style="color:#339933;">&amp;&amp;</span> <a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
</ol>
</div>
<p>Метод edit теперь должен выглядеть так:</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#000000;font-weight:bold;">function</span> edit<span style="color:#009900;">&#40;</span><span style="color:#000088;">$id</span> <span style="color:#339933;">=</span> <span style="color:#009900;font-weight:bold;">null</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#339933;">!</span><a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">Post</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">save</span><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">flash</span><span style="color:#009900;">&#40;</span>__<span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;The Post has been saved.&#8217;</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> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<a href="http://www.php.net/array"><span style="color:#990000;">array</span></a><span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;action&#8217;</span><span style="color:#339933;">=&gt;</span><span style="color:#0000ff;">&#8216;index&#8217;</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span> <span style="color:#b1b100;">else</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#009900;">&#125;</span></div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#b1b100;">if</span> <span style="color:#009900;">&#40;</span><span style="color:#000088;">$id</span> <span style="color:#339933;">&amp;&amp;</span> <a href="http://www.php.net/empty"><span style="color:#990000;">empty</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span><span style="color:#009900;">&#41;</span><span style="color:#009900;">&#41;</span> <span style="color:#009900;">&#123;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">data</span> <span style="color:#339933;">=</span> <span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">Post</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">read</span><span style="color:#009900;">&#40;</span><span style="color:#009900;font-weight:bold;">null</span><span style="color:#339933;">,</span> <span style="color:#000088;">$id</span><span style="color:#009900;">&#41;</span><span style="color:#339933;">;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; <span style="color:#009900;">&#125;</span> </div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#009900;">&#125;</span> </div>
</li>
</ol>
</div>
<p><strong>Отображение</strong></p>
<p>Можно удалить файл add.ctp, потому что он больше никем не вызывается. Add.ctp и edit.ctp по умолчанию очень похожи, так что таким образом удастся избежать избыточности кода.<br />
Отображение edit будет работать для создания новых записей без каких-либо изменений.<br />
Если есть необходимость, то можно изменять подписи в зависимости от текущего действия.</p>
<div class="php" style="font-family:monospace;color:#006;border:1px solid #d0d0d0;background-color:#f0f0f0;">
<ol>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;"><span style="color:#b1b100;">echo</span> <a href="http://www.php.net/sprintf"><span style="color:#990000;">sprintf</span></a><span style="color:#009900;">&#40;</span>__<span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;%s %s&#8217;</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></div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__<span style="color:#009900;">&#40;</span><a href="http://www.php.net/ucwords"><span style="color:#990000;">ucwords</span></a><span style="color:#009900;">&#40;</span><span style="color:#000088;">$this</span><span style="color:#339933;">-&gt;</span><span style="color:#004000;">action</span><span style="color:#009900;">&#41;</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></div>
</li>
<li>
<div style="font:normal normal 1em/1.2em monospace;background:none;vertical-align:top;color:#000020;margin:0;padding:0;">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;__<span style="color:#009900;">&#40;</span><span style="color:#0000ff;">&#8216;Post&#8217;</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:#339933;">;</span> </div>
</li>
</ol>
</div>
<p>Выведет &laquo;Добавить запись&raquo; или &laquo;Изменить запись&raquo; в зависимости от ситуации (и при наличии локализации, конечно же).</p>
<p>Это &#8211; перевод отрывка из книги <a href="http://www.pseudocoder.com/archives/2009/05/13/free-cakephp-e-book-super-awesome-advanced-cakephp-tips/">Super Awesome Advanced CakePHP Tips</a></p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/evilbloodydemon.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/evilbloodydemon.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/evilbloodydemon.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/evilbloodydemon.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/evilbloodydemon.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/evilbloodydemon.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/evilbloodydemon.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/evilbloodydemon.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/evilbloodydemon.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/evilbloodydemon.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/evilbloodydemon.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/evilbloodydemon.wordpress.com/67/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/evilbloodydemon.wordpress.com/67/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/evilbloodydemon.wordpress.com/67/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=evilbloodydemon.wordpress.com&amp;blog=6244330&amp;post=67&amp;subd=evilbloodydemon&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://evilbloodydemon.wordpress.com/2009/06/01/cakephp-merge-add-and-edit/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/82c39cca605917d3d7d372a31665bf04?s=96&#38;d=" medium="image">
			<media:title type="html">evilbloodydemon</media:title>
		</media:content>
	</item>
	</channel>
</rss>
