<?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>Yashio&#039;s Blog</title>
	<atom:link href="http://yashio.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://yashio.wordpress.com</link>
	<description>Just another WordPress.com weblog</description>
	<lastBuildDate>Wed, 18 Apr 2012 03:23:32 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='yashio.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://0.gravatar.com/blavatar/8cee2ccb755f852e90d83486ee240be3?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Yashio&#039;s Blog</title>
		<link>http://yashio.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://yashio.wordpress.com/osd.xml" title="Yashio&#039;s Blog" />
	<atom:link rel='hub' href='http://yashio.wordpress.com/?pushpress=hub'/>
		<item>
		<title>cakePHP2.1でファイルのアップロードとダウンロード</title>
		<link>http://yashio.wordpress.com/2012/03/30/cakephp2-1/</link>
		<comments>http://yashio.wordpress.com/2012/03/30/cakephp2-1/#comments</comments>
		<pubDate>Thu, 29 Mar 2012 15:46:44 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=408</guid>
		<description><![CDATA[cakePHP2.1の ファイルアップロード ファイルダウンロード をやってみようと思います。ひとまずファイルアップロード用にテーブル作成します。 今回は、ファイルの実体は特定のディレクトリに保存するので、ファイルの実体はDBには保存しません。 mysql&#62; desc upload_files; +----------------+--------------+------+-----+---------+----------------+ &#124; Field &#124; Type &#124; Null &#124; Key &#124; Default &#124; Extra &#124; +----------------+--------------+------+-----+---------+----------------+ &#124; id &#124; int(11) &#124; NO &#124; PRI &#124; NULL &#124; auto_increment &#124; &#124; user_id &#124; int(11) &#124; NO &#124; &#124; NULL &#124; &#124; &#124; name &#124; varchar(50) &#124; NO &#124; &#124; [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=408&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>cakePHP2.1の<br />
ファイルアップロード<br />
ファイルダウンロード<br />
をやってみようと思います。ひとまずファイルアップロード用にテーブル作成します。<br />
今回は、ファイルの実体は特定のディレクトリに保存するので、ファイルの実体はDBには保存しません。</p>
<p><code><br />
mysql&gt; desc  upload_files;<br />
+----------------+--------------+------+-----+---------+----------------+<br />
| Field          | Type         | Null | Key | Default | Extra          |<br />
+----------------+--------------+------+-----+---------+----------------+<br />
| id             | int(11)      | NO   | PRI | NULL    | auto_increment |<br />
| user_id        | int(11)      | NO   |     | NULL    |                |<br />
| name           | varchar(50)  | NO   |     | NULL    |                |<br />
| file_name      | varchar(100) | NO   |     | NULL    |                |<br />
| extension      | varchar(10)  | NO   |     | NULL    |                |<br />
| size           | int(11)      | NO   |     | 0       |                |<br />
| download_count | int(11)      | NO   |     | 0       |                |<br />
| created        | datetime     | YES  |     | NULL    |                |<br />
| deleted        | tinyint(1)   | YES  |     | 0       |                |<br />
| deleted_date   | datetime     | YES  |     | NULL    |                |<br />
+----------------+--------------+------+-----+---------+----------------+<br />
</code></p>
<p>次にファイルアップロード用のViewです。<br />
Viewにはこんな感じでアップロードフォームを作ります。<br />
<pre class="brush: php;">
echo $this-&gt;Form-&gt;create(null, array('action' =&gt; 'index', 'enctype' =&gt; 'multipart/form-data'));
echo $this-&gt;Form-&gt;input(null, array('type'=&gt;'file','label'=&gt;'対象ファイル' ));
echo $this-&gt;Form-&gt;submit('ファイルアップロード');
</pre></p>
<p>次はアップロード用のコントローラー。index()メソッドです。一覧とアップロードされた<br />
ページを一緒にしているので一覧もとりに行っています。<br />
定数化したり、モデルに処理を移動する必要があったりしますが、まずはこれで。<br />
<pre class="brush: php;">
public function index() {
	$this-&gt;UploadFile-&gt;recursive = 0;
	$this-&gt;set('uploadFiles', $this-&gt;paginate());
	if(!empty($this-&gt;request-&gt;data)){
		$uploaddir = self::FILE_SAVE_PATH.DS;//事前にパスを宣言して、パーミッション変えておいてください。
		$uploadfile = $uploaddir . date(&quot;YmdHis&quot;);
		$this-&gt;request-&gt;data['UploadFile']['user_id']	 = $this-&gt;Auth-&gt;User('id');
		$this-&gt;request-&gt;data['UploadFile']['file_name'] = self::FILE_SAVE_PATH.DS.basename($uploadfile);
		$this-&gt;request-&gt;data['UploadFile']['extension'] = pathinfo($this-&gt;request-&gt;data['UploadFile']['name'],PATHINFO_EXTENSION);
		if(!move_uploaded_file($this-&gt;request-&gt;data['UploadFile']['tmp_name'], $uploadfile)){
			return;
		}
		if($this-&gt;request-&gt;data['UploadFile']['size'] &gt; 1000000){
			$this-&gt;UploadFile-&gt;invalidate('name','ファイルサイズが大きすぎます');
			return;
		}
		if($this-&gt;UploadFile-&gt;save($this-&gt;request-&gt;data)){
			$this-&gt;Session-&gt;setFlash('アップロードを完了しました', true);
		}else{
			$this-&gt;Session-&gt;setFlash('アップロードに失敗しました', true);
		}
		$this-&gt;redirect('index');
	}
}
</pre></p>
<p>さて次は一覧のViewです。ダウンロードリンクですな。<br />
<pre class="brush: php;">
echo $this-&gt;Html-&gt;link($uploadFile['UploadFile']['name'], array('controller' =&gt; 'upload_files', 'action' =&gt; 'download', $uploadFile['UploadFile']['id'])); 
</pre><br />
それでは、ダウンロード用のメソッドを見ていきます。ここでポイントは、MediaViewを使うとすんごい便利なんです。<br />
ダウンロードは断然、cakePHPのコアのMediaViewを使うとダウンロードが簡単にできるのでおすすめ。<br />
1.3では「$this-&gt;view = &#8216;Media&#8217;;」という使い方だったのですが、（２．０はわからない・・・）2.1では<br />
「$this-&gt;viewClass = &#8216;Media&#8217;;」という利用方法に変わっている、というのが本日の重要ポイントです。<br />
lib/Cake/View にあるMediaView.phpをみると利用方法が書いて有ります。<br />
ヘッダーの書き出しとか自前でしなくてよくて、このMediaViewが勝手に判断してくれるのでかなり便利です。<br />
これで、ダウンロードリンクをクリックしてもページ遷移なしでファイルがダウンロードできます。お便利。<br />
本当はダウンロードされるたびにカウントアップしたものにしようと思っていますが・・今回はとりあえずスルーしました。<br />
<pre class="brush: php;">
public function download($id) {
	$this-&gt;viewClass = 'Media';
	$this-&gt;UploadFile-&gt;id = $id;
	$this-&gt;UploadFile-&gt;recursive = -1;
	$data = $this-&gt;UploadFile-&gt;read();
	$params = array(
		'id'=&gt;basename($data['UploadFile']['file_name']),
		'name'=&gt;preg_replace(&quot;/.[^.]+$/&quot;,&quot;&quot;,$data['UploadFile']['name']),
		'download'=&gt;true,
		'extension'=&gt;$data['UploadFile']['extension'],
		'path'=&gt;dirname($data['UploadFile']['file_name']).DS
	);
	$this-&gt;set($params);
}
</pre><br />
月末に怒涛のブログ記事を書きましたが、まだまだ2.1関連の内容をお届けできればと思います！</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/cakephp/'>cakephp</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/408/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/408/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/408/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=408&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2012/03/30/cakephp2-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>cakePHP2.1でSoftDeleteBehaviorを使う</title>
		<link>http://yashio.wordpress.com/2012/03/24/cakephp2-1%e3%81%a7softdeletebehavior%e3%82%92%e4%bd%bf%e3%81%86/</link>
		<comments>http://yashio.wordpress.com/2012/03/24/cakephp2-1%e3%81%a7softdeletebehavior%e3%82%92%e4%bd%bf%e3%81%86/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 14:29:07 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=402</guid>
		<description><![CDATA[何かというとcakeでは通常$model-&#62;delete();すると物理削除でレコードごとなくなりますが、 これがあら不思議！このビヘイビアを使うと論理削除にしてくれます。 通常のdelete()呼び出しで物理削除ではなく、deletedに1 が入り、delete_dateフィールドに日時が入る 該当するモデルは何もしなければdelete = 0 である条件を必ずつけてくれる というものです。いや幸せ。 さて準備です。GitHubのcakeDCから ここにあるSoftDeleteBehavior.phpだけをapp/Model/Behaviorにぶっこんでみます。 例としてモデルは、User.phpにしてみましょう。 私のモデルは、既にACLのビヘイビアが設定されていますが、それに追加してあげればいいですね。 さて、ここでもうひとつ準備。 テーブルにフィールドがあれば良いですが、usersテーブルに該当するフィールドを用意しましょう。 mysqlを例にして下記のようなフィールドを追加します。 ここで注意・・deletedは指定しないで追加するとtinyint(4)として登録されますのでちゃんとtinyint(1)で指定しましょう。 これが間違ってると検索時に　deleted = &#8221;という謎の条件になってしまいます。 deleted 　 tinyint(1) deleted_date datetime さてこれで用意が整ったので、一覧画面を覗いてみましょう。 WHERE `User`.`id` = 1 AND `User`.`deleted` = &#8217;0&#8242; LIMIT 1 こんな条件が一覧についていたら、やりたいことができたも同然です。 それでは試しに、ユーザを削除してみると、どうやらエラーがでるみたいですが・・・。 SoftDeleteBehavior　は通常のdelete()を呼ぶとどうやらfalseを返すようです。 なのでひとまず・・こんなかんじでしのいでみました。 さてこれで削除したデータを見てみると、 いえい！削除されていますよぅ！ mysql&#62; select deleted,deleted_date from users where id =6; +---------+---------------------+ &#124; deleted &#124; deleted_date [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=402&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>何かというとcakeでは通常$model-&gt;delete();すると物理削除でレコードごとなくなりますが、<br />
これがあら不思議！このビヘイビアを使うと論理削除にしてくれます。</p>
<li>通常のdelete()呼び出しで物理削除ではなく、deletedに1 が入り、delete_dateフィールドに日時が入る</li>
<li>該当するモデルは何もしなければdelete = 0 である条件を必ずつけてくれる</li>
<p>というものです。いや幸せ。<br />
さて準備です。<a href="https://github.com/CakeDC/utils/tree/2.0/Model/Behavior" target="_blank">GitHubのcakeDC</a>から<br />
ここにあるSoftDeleteBehavior.phpだけをapp/Model/Behaviorにぶっこんでみます。<br />
例としてモデルは、User.phpにしてみましょう。<br />
私のモデルは、既にACLのビヘイビアが設定されていますが、それに追加してあげればいいですね。<br />
<pre class="brush: php;">
	public $actsAs = array(
					'Acl' =&gt; array(
						'type' =&gt; 'requester',
					),
					'SoftDelete'
					);
</pre><br />
さて、ここでもうひとつ準備。<br />
テーブルにフィールドがあれば良いですが、usersテーブルに該当するフィールドを用意しましょう。<br />
mysqlを例にして下記のようなフィールドを追加します。<br />
ここで注意・・deletedは指定しないで追加するとtinyint(4)として登録されますのでちゃんとtinyint(1)で指定しましょう。<br />
これが間違ってると検索時に　deleted = &#8221;という謎の条件になってしまいます。</p>
<p>deleted        　  tinyint(1)<br />
deleted_date    datetime</p>
<p>さてこれで用意が整ったので、一覧画面を覗いてみましょう。<br />
WHERE `User`.`id` = 1 AND `User`.`deleted` = &#8217;0&#8242; LIMIT 1<br />
こんな条件が一覧についていたら、やりたいことができたも同然です。<br />
それでは試しに、ユーザを削除してみると、どうやらエラーがでるみたいですが・・・。</p>
<p>SoftDeleteBehavior　は通常のdelete()を呼ぶとどうやらfalseを返すようです。<br />
なのでひとまず・・こんなかんじでしのいでみました。<br />
<pre class="brush: php;">
if (!$this-&gt;User-&gt;delete()) {
	$this-&gt;redirect(array('action'=&gt;'index'));
}
</pre><br />
さてこれで削除したデータを見てみると、<br />
いえい！削除されていますよぅ！</p>
<p><code><br />
mysql&gt; select deleted,deleted_date from users where id =6;<br />
+---------+---------------------+<br />
| deleted | deleted_date        |<br />
+---------+---------------------+<br />
|       1 | 2012-03-24 19:43:51 |<br />
+---------+---------------------+<br />
1 row in set (0.00 sec)<br />
</code></p>
<p>補足＊管理画面などで削除されているユーザ自体も表示したい場合は、現在追加されているSoftDeleteを<br />
detachしてあげればよいです。例えばこんな感じ。<br />
<pre class="brush: php;">
public function index(){
	$this-&gt;User-&gt;Behaviors-&gt;detach('SoftDelete');
	$this-&gt;User-&gt;recursive = 0;
	$this-&gt;set('users', $this-&gt;paginate());
}
</pre></p>
<p>補足その２＊UserモデルにhasManyしているPostモデルにもこのSoftDeleteを摘要して、hasManyの条件として<br />
depend =&gt; trueを設定してみたのですが、どうも連動してSoftDeleteはしてくれませんでした。<br />
UserモデルのSoftDeleteを外して、物理削除状態にすると、PostモデルのSoftDeleteが聞いて削除状態になりました。<br />
ここらへんはもうちょっと調べて挙動を確認してみないといけないですね。新しいことがわかったらまた追記したいと思います。</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/cakephp/'>cakephp</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/402/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/402/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/402/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=402&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2012/03/24/cakephp2-1%e3%81%a7softdeletebehavior%e3%82%92%e4%bd%bf%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>cakePHP2.1でSearchPlugin hasManyを扱う</title>
		<link>http://yashio.wordpress.com/2012/03/24/cakephp2-1%e3%81%a7searchplugin-hasmany%e3%82%92%e6%89%b1%e3%81%86/</link>
		<comments>http://yashio.wordpress.com/2012/03/24/cakephp2-1%e3%81%a7searchplugin-hasmany%e3%82%92%e6%89%b1%e3%81%86/#comments</comments>
		<pubDate>Sat, 24 Mar 2012 11:43:11 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=399</guid>
		<description><![CDATA[先日からSearchPluginを使った画面周りの実装してます。 今回は特に、一対多データの扱いについてです。 ブログにタグをつけたチュートリアルが結構あるので、HABTMデータは結構ありますね。 今回の実際はHABTAMではなく、中間テーブルを介在しません。 その１．企業モデルに「属性」を外だしで複数持たせる。（いわば、タグと同じ） その２．属性は複数もてるが、マスターテーブルは持たない。 その３．属性テーブルはid,company_id,nameという構成。 というちょっと特殊なケースかもしれない。でも　よくあるUseとPostの関係だと思ってもらってもいいです。 ただし、属性自体を「AND」条件で検索したい。というのが味噌です。 SearchPluginの準備 app配下にSearchというディレクトリ掘って、GitHubのこちらを 一式ごっそりおきます。 bootstrap.phpのこの箇所が生きていれば、問題ないでしょう。 次に読みこむコントローラー側で利用できるように こちらもセット。これで準備完了。 次に親となる企業モデルCompany.phpにこの設定。当然、テーブル構成にこのフィールドが必要です。 それと、SearchPluginで使う設定も一緒に書き足しておきましょう。 $filterArgsのmethodについては後ほど。 次に、CompaniesAttribute.phpの方にも設定をしておきます。 モデル側の設定はひとまずここまで。次は検索画面ですね。 先ほど、プラグインを読み込んだコントローラーにこんな検索メソッドを準備。 属性テーブルCompaniesAttributeから選択させる属性一覧を取得してViewに渡しています。 あとは検索結果をpaginateするための条件設定です。 検索画面と検索結果を一緒に表示しています。 次にViewですね。検索フォームの箇所だけ、こんな感じ。 本当はいろんな検索条件があるのですが、属性だけにしてみました。 ひとまず属性を複数選択できるドロップダウン形式で表示しています。 これで肝心の企業モデルCompany.phpに設定していたsearchByAttributesを実装します。 こちらは　@kanonjiさんのこちらの記事が非常に参考になりました。 属性自体は、IDを持たないので、値としては数字ではなくテキストが入ってきます。 検索画面のドロップダウンのリストのvalue値は「製造業」のような日本語が入ってくることを前提にしています。 若干いじったところ 属性モデルから企業モデルを参照するのでcontainでCompanyモデルを利用しようとしたら、 find(&#8216;list&#8217;)ではLEFTJOINされなかったのでall指定にしてextractでIDを引っ張り出しました。 カテゴリー:cakephp<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=399&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>先日からSearchPluginを使った画面周りの実装してます。<br />
今回は特に、一対多データの扱いについてです。<br />
ブログにタグをつけたチュートリアルが結構あるので、HABTMデータは結構ありますね。<br />
今回の実際はHABTAMではなく、中間テーブルを介在しません。</p>
<p>その１．企業モデルに「属性」を外だしで複数持たせる。（いわば、タグと同じ）<br />
その２．属性は複数もてるが、マスターテーブルは持たない。<br />
その３．属性テーブルはid,company_id,nameという構成。</p>
<p>というちょっと特殊なケースかもしれない。でも　よくあるUseとPostの関係だと思ってもらってもいいです。<br />
ただし、属性自体を「AND」条件で検索したい。というのが味噌です。</p>
<p><strong>SearchPluginの準備</strong><br />
app配下にSearchというディレクトリ掘って、<a href="https://github.com/CakeDC/search/tree/2.0" target="_blank">GitHubのこちら</a>を<br />
一式ごっそりおきます。<br />
bootstrap.phpのこの箇所が生きていれば、問題ないでしょう。<br />
<pre class="brush: php;">
CakePlugin::loadAll(); // Loads all plugins at once
</pre><br />
次に読みこむコントローラー側で利用できるように<br />
<pre class="brush: php;">
public $components = array('Search.Prg'); 
</pre><br />
こちらもセット。これで準備完了。</p>
<p>次に親となる企業モデルCompany.phpにこの設定。当然、テーブル構成にこのフィールドが必要です。<br />
それと、SearchPluginで使う設定も一緒に書き足しておきましょう。<br />
$filterArgsのmethodについては後ほど。<br />
<pre class="brush: php;">
	public $hasMany = array(
		'CompaniesAttribute' =&gt; array(
			'className' =&gt; 'CompaniesAttribute',
			'foreignKey' =&gt; 'company_id',
			'dependent' =&gt; true,//企業が削除されたら、属性は一緒に削除されていい
			'conditions' =&gt; '',
			'fields' =&gt; '',
			'order' =&gt; 'order',
			'limit' =&gt; '',
			'offset' =&gt; '',
			'exclusive' =&gt; '',
			'finderQuery' =&gt; '',
			'counterQuery' =&gt; ''
		),
	);

	public $filterArgs = array(
		array('name' =&gt; 'attribute_id', 'type' =&gt; 'subquery', 'field' =&gt; 'Company.id', 'method' =&gt; 'searchByAttributes'),
 	);
</pre><br />
次に、CompaniesAttribute.phpの方にも設定をしておきます。<br />
<pre class="brush: php;">
	public $belongsTo = array(
		'Company' =&gt; array(
			'className' =&gt; 'Company',
			'foreignKey' =&gt; 'company_id',
			'conditions' =&gt; '',
			'fields' =&gt; '',
			'order' =&gt; ''
		)
	);

</pre><br />
モデル側の設定はひとまずここまで。次は検索画面ですね。<br />
先ほど、プラグインを読み込んだコントローラーにこんな検索メソッドを準備。<br />
属性テーブルCompaniesAttributeから選択させる属性一覧を取得してViewに渡しています。<br />
あとは検索結果をpaginateするための条件設定です。<br />
検索画面と検索結果を一緒に表示しています。<br />
<pre class="brush: php;">
	function search(){
    	　　$this-&gt;Prg-&gt;commonProcess();
    	　　$conditions = $this-&gt;Company-&gt;parseCriteria($this-&gt;passedArgs);//SearchPlugin
		$this-&gt;paginate = array(
		  'conditions' =&gt; $conditions,
		  'limit' =&gt; 5,
		  'order'=&gt;'Company.id asc'
		);
		$attributes = $this-&gt;Company-&gt;CompaniesAttribute-&gt;findAllByProjectId($this-&gt;Session-&gt;read('selectedProjectId'));
		$attributes = Set::combine($attributes, '{n}.CompaniesAttribute.name', '{n}.CompaniesAttribute.name');
		$this-&gt;set('pager_numbers', $this-&gt;pager_numbers);
		$this-&gt;set(compact('attributes'));
		$this-&gt;set('companies', $this-&gt;paginate('Company'));  
	}
</pre></p>
<p>次にViewですね。検索フォームの箇所だけ、こんな感じ。<br />
本当はいろんな検索条件があるのですが、属性だけにしてみました。<br />
ひとまず属性を複数選択できるドロップダウン形式で表示しています。<br />
<pre class="brush: php;">
&lt;?php echo $this-&gt;Form-&gt;create('Company');?&gt;
&lt;fieldset&gt;
	&lt;legend&gt;&lt;?php echo __('Search Company'); ?&gt;&lt;/legend&gt;
&lt;?php
	echo $this-&gt;Form-&gt;input('attribute_id',array('multiple'=&gt;true,'options'=&gt;$attributes));
?&gt;
&lt;/fieldset&gt;
&lt;?php echo $this-&gt;Form-&gt;end(__('検索'));?&gt;
</pre></p>
<p>これで肝心の企業モデルCompany.phpに設定していたsearchByAttributesを実装します。<br />
こちらは　<a href="https://twitter.com/#!/kanonji" target="_blank">@kanonji</a>さんの<a href="http://d.hatena.ne.jp/kanonji/20110217/1297927267" target="_blank">こちらの記事</a>が非常に参考になりました。<br />
属性自体は、IDを持たないので、値としては数字ではなくテキストが入ってきます。<br />
検索画面のドロップダウンのリストのvalue値は「製造業」のような日本語が入ってくることを前提にしています。<br />
<pre class="brush: php;">
    public function searchByAttributes($data = array()){
        $this-&gt;Behaviors-&gt;attach('Search.Searchable');
        $attribute_id = Set::extract($data,'/attribute_id');
	$options = array(
            'conditions' =&gt; array('CompaniesAttribute.name'  =&gt; $attribute_id),
            'contain' =&gt; $this-&gt;alias,
        );
        if (( $c = count ( $attribute_id )) !== 1 ){
        	//ここの条件を通すとAND条件として構成される。ここを通らないとOR条件として構成される。
            $options['group'] = 'CompaniesAttribute.company_id HAVING COUNT(CompaniesAttribute.company_id) = '.$c;
        }
	$data = $this-&gt;CompaniesAttribute-&gt;find('all',$options);
        $condition = implode(', ', Set::extract($data,'/Company/id'));
        if ( empty( $condition )){
            $condition = 'NULL';
        }
        return $condition;
    }
</pre><br />
<strong>若干いじったところ</strong><br />
属性モデルから企業モデルを参照するのでcontainでCompanyモデルを利用しようとしたら、<br />
find(&#8216;list&#8217;)ではLEFTJOINされなかったのでall指定にしてextractでIDを引っ張り出しました。</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/cakephp/'>cakephp</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/399/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/399/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/399/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=399&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2012/03/24/cakephp2-1%e3%81%a7searchplugin-hasmany%e3%82%92%e6%89%b1%e3%81%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>ArraySourceの勧め</title>
		<link>http://yashio.wordpress.com/2012/03/22/arraysource%e3%81%ae%e5%8b%a7%e3%82%81/</link>
		<comments>http://yashio.wordpress.com/2012/03/22/arraysource%e3%81%ae%e5%8b%a7%e3%82%81/#comments</comments>
		<pubDate>Thu, 22 Mar 2012 14:29:03 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[cakephp]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=396</guid>
		<description><![CDATA[今日もお酒のまないんで、ひとつ記事かいてねることにします。本日もcakePHP2.1のお話です。 さて、設定ファイルでデータベースに持つ程でもない情報というのは、かつてconst.phpに書いてました。 ところが例えば男・女　とか、普遍的なものだったりあまり情報が書き換わらないものって結構あります。 で、設定ファイルが結構カオスになってたりします。 今回は、設定情報もこんなふうに持つと良いよってことで、https://github.com/cakephp/datasources/tree/2.0/Model/Datasource ここからArraySource.phpだけをいただきます。そんでapp/Model/Datasourceにポロリと入れます。 次に、設定です。database.phpにこんな記述を足します。既存のデータベースの設定に追加してくださいね。 これで、利用できる準備が整いました。 次にGender.phpっていうモデルをModel配下に作成します。 これで、このモデルをbelongToに持つモデルにこんなふうに設定すると、（注１） 親のモデルから芋ずるに引っ張ってくるとあたかもGenderモデルがDBから取得したデータのように、「女性」や「男性」を返してくれます。 設定ファイルとかから参照しなくて良いので、かなりストレスフルフリーです。 （注１） ここで一点だけ。どうもcontainableを使う場合、$belongsToの条件に&#8216;fields&#8217; =&#62; &#8216;display&#8217;,の 指定をするか、あるいはcontainableのconditionsの中に、フィールドを指定する、 のどちらかをしないと取ってこれませんでした。 親モデルからfind(&#8216;all&#8217;)の場合は別に指定はいらないのですが、ビヘイビアを使う場合には 上記指定をしないと結果がarray()になってしまい、途中でフィールド名がunsetされてしまうようでした。 これ仕様なのかちょっとわからないです。 でもcontainable使ってるだけだからなあ。。。できればフィールド名は指定しなくてもいいようになるといいんですが。 ここからは確認していませんが、新規登録の時にもちゃんとlistでとってこれれば こんなかんじでアソシエーションの恩恵を受けられるのではないでしょうか。 というわけで、設定ファイルの値をあたかもDBから取得したように振る舞えるArraySource。ぜひみなさんも使ってみてください。 カテゴリー:cakephp, PHP<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=396&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>今日もお酒のまないんで、ひとつ記事かいてねることにします。本日もcakePHP2.1のお話です。<br />
さて、設定ファイルでデータベースに持つ程でもない情報というのは、かつてconst.phpに書いてました。<br />
ところが例えば男・女　とか、普遍的なものだったりあまり情報が書き換わらないものって結構あります。<br />
で、設定ファイルが結構カオスになってたりします。</p>
<p>今回は、設定情報もこんなふうに持つと良いよってことで、<a href="https://github.com/cakephp/datasources/tree/2.0/Model/Datasource" title="https://github.com/cakephp/datasources/tree/2.0/Model/Datasource" target="_blank">https://github.com/cakephp/datasources/tree/2.0/Model/Datasource</a><br />
ここからArraySource.phpだけをいただきます。そんでapp/Model/Datasourceにポロリと入れます。</p>
<p>次に、設定です。database.phpにこんな記述を足します。既存のデータベースの設定に追加してくださいね。<br />
<pre class="brush: php;">
	var $ArraySource = array(
		'datasource' =&gt; 'ArraySource',
	);
</pre><br />
これで、利用できる準備が整いました。<br />
次にGender.phpっていうモデルをModel配下に作成します。</p>
<p><pre class="brush: php;">
&lt;?php
App::uses('AppModel', 'Model');
/**
 * Gender Model
 *
 */
 class Gender extends AppModel
{
    public $name = 'Gender';

    public $displayField = 'display';

    public $useDbConfig = 'ArraySource';//ここにdatabase.phpで宣言した変数名をセット

    public $records = array(
            array(
                'id' =&gt; 1,
                'display' =&gt; '男性',
            ),
            array(
                'id' =&gt; 2,
                'display' =&gt; '女性',
            ),
        );

    const MAN     = 1;//一応定数としても利用できるようにしてみた。
    const WOMAN = 2;

}
</pre></p>
<p>これで、このモデルをbelongToに持つモデルにこんなふうに設定すると、（注１）</p>
<p><pre class="brush: php;">
	public $belongsTo = array(
		'Gender' =&gt; array(
			'className' =&gt; 'Gender',
			'foreignKey' =&gt; 'gender_id',
			'fields' =&gt; 'display',//これがちょっときになる指定
		)
	);
</pre></p>
<p>親のモデルから芋ずるに引っ張ってくるとあたかもGenderモデルがDBから取得したデータのように、「女性」や「男性」を返してくれます。<br />
設定ファイルとかから参照しなくて良いので、かなりストレス<del datetime="2012-03-23T15:59:08+00:00">フル</del>フリーです。<br />
<pre class="brush: php;">
echo h($value['Gender']['display']);
</pre></p>
<p>（注１）<br />
ここで一点だけ。どうもcontainableを使う場合、$belongsToの条件に<strong>&#8216;fields&#8217; =&gt; &#8216;display&#8217;,</strong>の<br />
指定をするか、あるいはcontainableのconditionsの中に、フィールドを指定する、<br />
のどちらかをしないと取ってこれませんでした。<br />
親モデルからfind(&#8216;all&#8217;)の場合は別に指定はいらないのですが、ビヘイビアを使う場合には<br />
上記指定をしないと結果がarray()になってしまい、途中でフィールド名がunsetされてしまうようでした。<br />
これ仕様なのかちょっとわからないです。<br />
でもcontainable使ってるだけだからなあ。。。できればフィールド名は指定しなくてもいいようになるといいんですが。</p>
<p>ここからは確認していませんが、新規登録の時にもちゃんとlistでとってこれれば<br />
<pre class="brush: php;">
 echo $this-&gt;Form-&gt;input('gender');
</pre><br />
こんなかんじでアソシエーションの恩恵を受けられるのではないでしょうか。</p>
<p>というわけで、設定ファイルの値をあたかもDBから取得したように振る舞えるArraySource。ぜひみなさんも使ってみてください。</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/cakephp/'>cakephp</a>, <a href='http://yashio.wordpress.com/category/php/'>PHP</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/396/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/396/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/396/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=396&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2012/03/22/arraysource%e3%81%ae%e5%8b%a7%e3%82%81/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>cakePHP2.1でcakeEmailを使う。</title>
		<link>http://yashio.wordpress.com/2012/03/21/cakephp2-1%e3%81%a7cakeemail%e3%82%92%e4%bd%bf%e3%81%86%e3%80%82/</link>
		<comments>http://yashio.wordpress.com/2012/03/21/cakephp2-1%e3%81%a7cakeemail%e3%82%92%e4%bd%bf%e3%81%86%e3%80%82/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 13:39:41 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[language php]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=392</guid>
		<description><![CDATA[そろそろcakePHP2.1であんなことやこんなことやっていろいろ恥ずかしいことも蓄積してきたので皆様とシェア致します。 こちらのサイトを参考にしました。 １．２，１．３ではqdmailを使っていたのですが、開発自体がすでに止まっているようなので 標準で用意されているものも最近は利用されている人が多いようなのでこちらでやってみました。 app/Config/email.phpにはこんなかんじで設定。gmail経由で送ってみたよ。 インストールしたばっかりんときはemail.php.defaultみたいなファイル名なので名前をちゃんと変えよう。 すでにdefaultの項目があるのでこんなかんじに変えてみました。お好みで変えてみてください。 を冒頭にセット。 使う側のコントローラーには そんでもって実際に送る場所こんなかんじで。 テンプレートやらのセットはマニュアルにあるので読むべし。cakePHP2.1から？ではないと思うけどテンプレートの構成が若干1.2と変わっているんでつね・・ こんなかんじで無事におくれました！(∩´∀｀)∩ﾜｰｲ Pluginも結構cakePHP2.1で動くもの多いですね。SearchPluginもACLPluginも。SoftDeleteビヘイビアとかArraySourceとかもぼつぼつ。 カテゴリー:Uncategorized<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=392&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>そろそろcakePHP2.1であんなことやこんなことやっていろいろ恥ずかしいことも蓄積してきたので皆様とシェア致します。</p>
<p><a href="http://bimi.jpn.com/?p=188" title="こちら" target="_blank">こちらの</a>サイトを参考にしました。<br />
１．２，１．３ではqdmailを使っていたのですが、開発自体がすでに止まっているようなので<br />
標準で用意されているものも最近は利用されている人が多いようなのでこちらでやってみました。</p>
<p>app/Config/email.phpにはこんなかんじで設定。gmail経由で送ってみたよ。<br />
インストールしたばっかりんときはemail.php.defaultみたいなファイル名なので名前をちゃんと変えよう。<br />
すでにdefaultの項目があるのでこんなかんじに変えてみました。お好みで変えてみてください。<br />
<pre class="brush: php;">
	public $default = array(
		'transport' =&gt; 'Smtp',
		'from' =&gt; array('yash@xxx.com' =&gt; 'メールでの表示名'),
		'host' =&gt; 'ssl://smtp.gmail.com',
		'port' =&gt; 465,
		'timeout' =&gt; 30,
		'username' =&gt; 'hogehoge@hogehoge.com',
		'password' =&gt; 'hogehoge',
		'log' =&gt; true//ここをtrueにするとtmp/debug.logにメールのログが書かれる。
	);
</pre></p>
<p>を冒頭にセット。<br />
使う側のコントローラーには<br />
<pre class="brush: php;">
App::uses('CakeEmail', 'Network/Email');
</pre></p>
<p>そんでもって実際に送る場所こんなかんじで。<br />
テンプレートやらのセットは<a href="http://book.cakephp.org/2.0/en/core-utility-libraries/email.html" title="本家" target="_blank">マニュアル</a>にあるので読むべし。cakePHP2.1から？ではないと思うけどテンプレートの構成が若干1.2と変わっているんでつね・・<br />
<pre class="brush: php;">
$email = new CakeEmail('default');//ここ、ちゃんとdefaultを設定しないと送れませんでした・・。
$email-&gt;from(array('yashiro@XXX.com' =&gt; 'My Site'));
$email-&gt;to('yashiro@XXX.com');
$email-&gt;subject('テストです');
$email-&gt;send('日本語でおくれるかなー？');
</pre></p>
<p>こんなかんじで無事におくれました！(∩´∀｀)∩ﾜｰｲ<br />
Pluginも結構cakePHP2.1で動くもの多いですね。SearchPluginもACLPluginも。SoftDeleteビヘイビアとかArraySourceとかもぼつぼつ。</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/392/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/392/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/392/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=392&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2012/03/21/cakephp2-1%e3%81%a7cakeemail%e3%82%92%e4%bd%bf%e3%81%86%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>CakePHP Advent Calendar 2011　12/09</title>
		<link>http://yashio.wordpress.com/2011/12/09/cakephp-advent-calendar-2011%e3%80%801209/</link>
		<comments>http://yashio.wordpress.com/2011/12/09/cakephp-advent-calendar-2011%e3%80%801209/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 03:45:27 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=361</guid>
		<description><![CDATA[こんにちは。本日１２月９日担当の@yashioです。 来週はいよいよcake勉強会and忘年会ですね(∩´∀｀)∩ﾜｰｲ皆さんにあえるの楽しみにしています。 さて今回は、1.3系で・・しかも出尽くされていると思いますがViewキャッシュ導入について紹介したいと思います。 いろいろな方がこちらは紹介されていますが、私でもできるヨ！ってことで生暖かく見てください。 頑張って図つけたわ。。これが一番時間かかったとか・・・・。 ・登録者向けのサービスだが、ログイン前にランディングページなどの静的なページを多用している ・できるだけ、ウェブサーバーへの負荷を軽減したい などの時にぜひ。 レシピ：cake1.3、 https://github.com/mcurry/html_cacheからダウンロードしてきた一式 手順その１： https://github.com/mcurry/html_cache　からファイルをダウンロードしてapp/plugins/html_cache/の下につっこむ。 手順その２： App::import(&#8216;core&#8217;, &#8216;File&#8217;); をapp_controller.phpのbeforeFilterに記述する（これ重要です。忘れてすごい悩んだ・・） 特定のコントローラーだけに処理をさせたい場合は、該当するcontrollerのbeforeFilterに記述が望ましいでしょう。 手順その３：webroot/cache配下に静的に出力したいファイルのパスでディレクトリをつくる。app/webroot/cache/controller名/action名/のような。 手順その４： ３で作成したディレクトリにアクセス権限をつける。実際にここに静的なHTMLファイルが作成されます。 手順その５： 静的表示をしたいコントローラー、のアクションに、 $this-&#62;helpers[] = &#8216;HtmlCache.HtmlCache&#8217;; を追記する。 ※妙な怒りのデバッグが入っていますがおきになさらずに。ちゃんと表示されます。 これは、３の手順で作成したディレクトリのパスにcontroller,actionが一致している必要があります。 手順その６： webroot直下にある/htaccessを表1.のように変更する（簡単に言うと、webroot/cache配下に該当のファイルがある場合にはそちらを優先的参照する。ない場合は通常通りフレームワークのルールに則り、/controller/actionへ飛ぶ。） &#60;IfModule mod_rewrite.c&#62; RewriteEngine On RewriteCond %{REQUEST_METHOD} ^GET$ #追加部分 RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f #追加部分 RewriteRule ^(.*)$ /cache/$1/index.html [L]　　#追加部分 RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=361&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>こんにちは。本日１２月９日担当の<a href="https://twitter.com/yashio">@yashio</a>です。<br />
来週はいよいよcake勉強会and忘年会ですね(∩´∀｀)∩ﾜｰｲ皆さんにあえるの楽しみにしています。</p>
<p>さて今回は、1.3系で・・しかも出尽くされていると思いますがViewキャッシュ導入について紹介したいと思います。<br />
いろいろな方がこちらは紹介されていますが、私でもできるヨ！ってことで生暖かく見てください。<br />
頑張って図つけたわ。。これが一番時間かかったとか・・・・。</p>
<p>・登録者向けのサービスだが、ログイン前にランディングページなどの静的なページを多用している<br />
・できるだけ、ウェブサーバーへの負荷を軽減したい</p>
<p>などの時にぜひ。</p>
<p>レシピ：cake1.3、 https://github.com/mcurry/html_cacheからダウンロードしてきた一式</p>
<p><strong>手順その１：</strong></p>
<p>https://github.com/mcurry/html_cache　からファイルをダウンロードして<strong>app/plugins/html_cache/</strong>の下につっこむ。</p>
<p><a href="http://yashio.files.wordpress.com/2011/12/hoge12.png"><img class="alignnone size-medium wp-image-369" title="hoge1" src="http://yashio.files.wordpress.com/2011/12/hoge12.png?w=300&#038;h=200" alt="" width="300" height="200" /></a></p>
<p><strong>手順その２：</strong><br />
App::import(&#8216;core&#8217;, &#8216;File&#8217;); をapp_controller.phpのbeforeFilterに記述する（これ重要です。忘れてすごい悩んだ・・）<br />
特定のコントローラーだけに処理をさせたい場合は、該当するcontrollerのbeforeFilterに記述が望ましいでしょう。</p>
<p><a href="http://yashio.files.wordpress.com/2011/12/hoge2.png"><img class="alignnone size-medium wp-image-372" title="hoge2" src="http://yashio.files.wordpress.com/2011/12/hoge2.png?w=300&#038;h=200" alt="" width="300" height="200" /></a></p>
<p><strong>手順その３：</strong>webroot/cache配下に静的に出力したいファイルのパスでディレクトリをつくる。app/webroot/cache/controller名/action名/のような。<br />
<a href="http://yashio.files.wordpress.com/2011/12/hoge3.png"><img class="alignnone size-medium wp-image-374" title="hoge3" src="http://yashio.files.wordpress.com/2011/12/hoge3.png?w=150&#038;h=300" alt="" width="150" height="300" /></a></p>
<p><strong>手順その４：</strong><br />
３で作成したディレクトリにアクセス権限をつける。実際にここに静的なHTMLファイルが作成されます。</p>
<p><strong>手順その５：</strong><br />
静的表示をしたいコントローラー、のアクションに、</p>
<p>$this-&gt;helpers[] = &#8216;HtmlCache.HtmlCache&#8217;;</p>
<p>を追記する。<br />
※妙な怒りのデバッグが入っていますがおきになさらずに。ちゃんと表示されます。</p>
<p>これは、３の手順で作成したディレクトリのパスにcontroller,actionが一致している必要があります。<br />
<a href="http://yashio.files.wordpress.com/2011/12/hoge41.png"><img src="http://yashio.files.wordpress.com/2011/12/hoge41.png?w=300&#038;h=136" alt="" title="hoge4" width="300" height="136" class="alignnone size-medium wp-image-384" /></a></p>
<p><strong>手順その６：</strong><br />
webroot直下にある/htaccessを表1.のように変更する（簡単に言うと、webroot/cache配下に該当のファイルがある場合にはそちらを優先的参照する。ない場合は通常通りフレームワークのルールに則り、/controller/actionへ飛ぶ。）</p>
<p>&lt;IfModule mod_rewrite.c&gt;<br />
RewriteEngine On<br />
RewriteCond %{REQUEST_METHOD} ^GET$ #追加部分<br />
RewriteCond %{DOCUMENT_ROOT}/cache/$1/index.html -f #追加部分<br />
RewriteRule ^(.*)$ /cache/$1/index.html [L]　　#追加部分<br />
RewriteCond %{REQUEST_FILENAME} !-d<br />
RewriteCond %{REQUEST_FILENAME} !-f<br />
RewriteRule ^(.*)$ index.php?url=$1 [QSA,L]<br />
&lt;/IfModule&gt;</p>
<p><strong>手順その７：</strong><br />
美味しくいただく。　さあ該当ページにアクセスしてみましょう。ファイルが作成されない場合はパーミッションの確認をしてください。<br />
３で作られたディレクトリにファイルがつくられていますか？日付を見てみてくださいね。<br />
この場合、controllerも通らないので不必要なロードがされないので結構表示速度を体感できるのではないかと思います。<br />
（コンテンツにもよるでしょうが）</p>
<p><a href="http://yashio.files.wordpress.com/2011/12/hoge5.png"><img class="alignnone size-medium wp-image-378" title="hoge5" src="http://yashio.files.wordpress.com/2011/12/hoge5.png?w=300&#038;h=206" alt="" width="300" height="206" /></a><br />
試しに削除してもう一度作成してみましょう。【やったー！】<br />
<strong>注意すべきことは</strong>ctpファイルの中身に変更が合った場合などは、</p>
<p>こちらにあるキャッシュを一度削除しないと新しいファイルが作成されません。</p>
<p>そのため頻繁に変更するファイルに関してはあまり向かないかもしれませんが、キャッシュで表示する方が<br />
明らかに表示速度は上昇しますので、お手軽にできますし皆さん、試してみてはいかがでしょうか。</p>
<p>さて、明日はおなじみ<a href="http://twitter.com/mon_sat">@mon_sat</a>さんです。よろしくおねがいしまーす！</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/cakephp/'>cakephp</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/361/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/361/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/361/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=361&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2011/12/09/cakephp-advent-calendar-2011%e3%80%801209/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>

		<media:content url="http://yashio.files.wordpress.com/2011/12/hoge12.png?w=300" medium="image">
			<media:title type="html">hoge1</media:title>
		</media:content>

		<media:content url="http://yashio.files.wordpress.com/2011/12/hoge2.png?w=300" medium="image">
			<media:title type="html">hoge2</media:title>
		</media:content>

		<media:content url="http://yashio.files.wordpress.com/2011/12/hoge3.png?w=150" medium="image">
			<media:title type="html">hoge3</media:title>
		</media:content>

		<media:content url="http://yashio.files.wordpress.com/2011/12/hoge41.png?w=300" medium="image">
			<media:title type="html">hoge4</media:title>
		</media:content>

		<media:content url="http://yashio.files.wordpress.com/2011/12/hoge5.png?w=300" medium="image">
			<media:title type="html">hoge5</media:title>
		</media:content>
	</item>
		<item>
		<title>bootstrap.cssの対応(for Play framework）</title>
		<link>http://yashio.wordpress.com/2011/10/09/bootstrap-css%e3%81%ae%e5%af%be%e5%bf%9cfor-play-framework%ef%bc%89/</link>
		<comments>http://yashio.wordpress.com/2011/10/09/bootstrap-css%e3%81%ae%e5%af%be%e5%bf%9cfor-play-framework%ef%bc%89/#comments</comments>
		<pubDate>Sun, 09 Oct 2011 09:35:46 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=338</guid>
		<description><![CDATA[メモ。 ちょっと家庭内制作で「phpじゃないやつで！」ということになってjavaでrailsライクなplayframeworkいぢってんですが、 来月の某締切りにむけて画面周りで、Bootstrap　を使ってます。 で、playはそもそもrailsライクってことで、cakephpと非常に似ているので、ファイルの構成とかは分かりやすい。 まあおいおいいろいろかけたらと思うんですけど、ひとまず、今Bootstrapが流行っているので、playframeworkで使ってみたい！ってことで使ってたんですが、一点、pagenateについてがどうにも、見た目を変更する必要がありました。 なので、paginateの導入も含めてメモしときます。 ※試行錯誤なんで、自己責任でよろしくおねがいします＞＜ 1.2.2使っているので、コンソールでとりあえず play install paginate する。そうすると、コンソールで「いれちゃうぜ？」てきいてくるので、はいyて答える。 そうすると・・・playインストール場所/modulre/paginate-0.11 という構成になり、そこにモジュールが展開される。 そのあと、 conf/dependencies.ymlに ~ require: ~ play -&#62; paginate 0.11 これを追記して、さらに conf/application.confに # Import the pagenate module module.paginate=${play.path}/modules/paginate-0.11 こんな感じで、play再起動。起動時に、 Module paginate is available (/home/yashiro/play-1.2.2/modules/paginate-0.11) とかいうログが見えると、無事paginateモジュールが読み込まれています。 さて、そのモジュールの中に、htmlが入っていて、（playの雛形みたいな）paginateに対してどういう記述をするか が書かれているControls.htmlをいうソースを探し出します( paginate-0.11/app/views/にありました）。 それをコピーして、app/views/paginate/Controls.htmlという構成にします。 （やってることはcakephpで、helperを自分のappの配下にもってきて変更していることにそっくり。） それでそのファイルをこんな感じで修正してみました。そしたらデモで見えるようなpaginateが表示されたよ！ (実際はpaginateを表示させるところまで、これ以外にもいろいろ道のりがあったんですが・・それは割愛） app/views/paginate/Controls.html まあここまではよかったんだけど、lastページになると、PreviousとNextのあいだのページ数が一個減るという謎の 現象に・・まあこれは次回でもどうにか修正することにしましょう。 &#160; ※１０年ぶりにJavaとか見たら、「アノテーション」とかいう謎の識別子がついていて時代を感じた。 カテゴリー:Uncategorized<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=338&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>メモ。<br />
ちょっと家庭内制作で「phpじゃないやつで！」ということになってjavaでrailsライクなplayframeworkいぢってんですが、<br />
来月の某締切りにむけて画面周りで、<a title="Bootstrap" href="http://twitter.github.com/bootstrap/">Bootstrap</a>　を使ってます。<br />
で、playはそもそもrailsライクってことで、cakephpと非常に似ているので、ファイルの構成とかは分かりやすい。<br />
まあおいおいいろいろかけたらと思うんですけど、ひとまず、今Bootstrapが流行っているので、playframeworkで使ってみたい！ってことで使ってたんですが、一点、pagenateについてがどうにも、見た目を変更する必要がありました。</p>
<p>なので、paginateの導入も含めてメモしときます。</p>
<p>※試行錯誤なんで、自己責任でよろしくおねがいします＞＜</p>
<p>1.2.2使っているので、コンソールでとりあえず</p>
<address>play install paginate</address>
<p>する。そうすると、コンソールで「いれちゃうぜ？」てきいてくるので、はいyて答える。</p>
<p>そうすると・・・playインストール場所/modulre/paginate-0.11</p>
<p>という構成になり、そこにモジュールが展開される。</p>
<p>そのあと、</p>
<p>conf/dependencies.ymlに</p>
<address>~ require:</address>
<p>~ play -&gt; paginate 0.11<br />
これを追記して、さらに<br />
conf/application.confに<br />
# Import the pagenate module<br />
module.paginate=${play.path}/modules/paginate-0.11<br />
こんな感じで、play再起動。起動時に、<br />
Module paginate is available (/home/yashiro/play-1.2.2/modules/paginate-0.11)<br />
とかいうログが見えると、無事paginateモジュールが読み込まれています。<br />
さて、そのモジュールの中に、htmlが入っていて、（playの雛形みたいな）paginateに対してどういう記述をするか<br />
が書かれているControls.htmlをいうソースを探し出します( paginate-0.11/app/views/にありました）。<br />
それを<strong>コピーして</strong>、app/views/paginate/Controls.htmlという構成にします。<br />
（やってることはcakephpで、helperを自分のappの配下にもってきて変更していることにそっくり。）</p>
<p>それでそのファイルをこんな感じで修正してみました。そしたらデモで見えるようなpaginateが表示されたよ！</p>
<p>(実際はpaginateを表示させるところまで、これ以外にもいろいろ道のりがあったんですが・・それは割愛）</p>
<p>app/views/paginate/Controls.html</p>
<p><pre class="brush: xml;">
%{
int __firstPage = 1;
int __currentPage = _items.pageNumber;
int __pagesDisplayed = _items.pagesDisplayed;
int __pagesBeforeMiddle = __pagesDisplayed / 2;
int __maxPage = _items.pageCount;
if (__currentPage &gt; (__pagesDisplayed / 2)) {
	__firstPage = __currentPage - __pagesBeforeMiddle;
}
int __lastPage = __currentPage + (__pagesDisplayed - __pagesBeforeMiddle - 1);
if (__currentPage &lt; (__pagesDisplayed - __pagesBeforeMiddle)) {
	__lastPage = __pagesDisplayed;
}
if (__lastPage &gt; __maxPage) {
	__lastPage = __maxPage;
}
boolean __hasPrev = _items.hasPreviousPage;
boolean __hasNext = _items.hasNextPage;
String __firstURL = __hasPrev ? _items.getCallbackURL(1) : &quot;#&quot;;
String __prevURL = __hasPrev ? _items.getCallbackURL(__currentPage-1) : &quot;#&quot;;
String __nextURL = __hasNext ? _items.getCallbackURL(__currentPage+1) : &quot;#&quot;;
String __lastURL = __hasNext ? _items.getCallbackURL(__maxPage) : &quot;#&quot;;
%}
&lt;div class=&quot;pagination&quot;&gt;
	&lt;ul&gt;
%{ if (_items.boundaryControlsEnabled) { %}
		&lt;li class=&quot;${__currentPage == 1 ? 'disabled' : 'first'}&quot;&gt;&lt;a href=&quot;${__firstURL}&quot;&gt;&amp;{'play-paginate.first'}&lt;/a&gt;&lt;/li&gt;
%{ } %}
		&lt;li class=&quot;${__hasPrev ? 'previous' : 'disabled'}&quot;&gt;&lt;a href=&quot;${__prevURL}&quot;&gt;&amp;{'play-paginate.prev'}&lt;/a&gt;&lt;/li&gt;
%{
for (__idx = __firstPage; __idx &lt;= __lastPage; __idx++) {
boolean __active = __currentPage == __idx;
%}
		&lt;li class=&quot;${__active ? 'active' : 'inactive'}&quot;&gt;&lt;a href=&quot;${_items.getCallbackURL(__idx)}&quot;&gt;${__idx}&lt;/a&gt;&lt;/li&gt;
%{
}
%}
		&lt;li class=&quot;${__hasNext ? '' : 'disabled'}&quot;&gt;&lt;a href=&quot;${__nextURL}&quot;&gt;&amp;{'play-paginate.next'}&lt;/a&gt;&lt;/li&gt;
%{ if (_items.boundaryControlsEnabled) { %}
		&lt;li class=&quot;${__currentPage == __maxPage ? 'disabled' : ''} next&quot;&gt;&lt;a href=&quot;${__lastURL}&quot;&gt;&amp;{'play-paginate.last'}&lt;/a&gt;&lt;/li&gt;
%{ } %}
	&lt;/ul&gt;
&lt;/div&gt;
&lt;br style=&quot;clear:both;&quot;/&gt;
</pre></p>
<p>まあここまではよかったんだけど、lastページになると、PreviousとNextのあいだのページ数が一個減るという謎の</p>
<p>現象に・・まあこれは次回でもどうにか修正することにしましょう。</p>
<p>&nbsp;</p>
<p>※１０年ぶりにJavaとか見たら、「アノテーション」とかいう謎の識別子がついていて時代を感じた。</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/uncategorized/'>Uncategorized</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/338/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/338/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/338/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=338&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2011/10/09/bootstrap-css%e3%81%ae%e5%af%be%e5%bf%9cfor-play-framework%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>mysqlバックアップ</title>
		<link>http://yashio.wordpress.com/2011/04/23/mysql%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97/</link>
		<comments>http://yashio.wordpress.com/2011/04/23/mysql%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 08:18:47 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=321</guid>
		<description><![CDATA[テーブルを丸ごとバックアップする方法で今までバックアップをとってきたんだが、 ある特定の業務アプリで、データが膨大なものが存在してた。 エディタでいちいちひらいてテーブルの名前から探して…みたいなことをしてたみたいで、 ちょっと手間がかかるなと。で、緊急時にリストアする際に、特定のテーブルだけしたいという リクエストをうけたので探してみた。 それっぽいのはあったんだけどまあ、１００％ってものがなかったのでとりあえず自作。 一週間で上書きっていう簡単なやつにしてみたよ。 Shellスクリプトもいろいろ面白いでつね。 カテゴリー:mysql<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=321&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<pre>テーブルを丸ごとバックアップする方法で今までバックアップをとってきたんだが、<br />
ある特定の業務アプリで、データが膨大なものが存在してた。<br />
エディタでいちいちひらいてテーブルの名前から探して…みたいなことをしてたみたいで、<br />
ちょっと手間がかかるなと。で、緊急時にリストアする際に、特定のテーブルだけしたいという<br />
リクエストをうけたので探してみた。<br />
それっぽいのはあったんだけどまあ、１００％ってものがなかったのでとりあえず自作。<br />
一週間で上書きっていう簡単なやつにしてみたよ。</p>
<p>Shellスクリプトもいろいろ面白いでつね。<br />
<pre class="brush: bash;">
#!/bin/sh
#DAYは数字で曜日。
DAY=`date '+%w'`
WORK_DIR=バックアップするディレクトリ
FILE_NAME=dump_$DAY
BACKUP_DIR=/tmp/
USER=DBのユーザ名
PASS=DBのパスワード
DB_NAME=データベース名

#バックアップディレクトリに移動
cd $BACKUP_DIR
#バックアップディレクトリがなかったら
if [ ! -d $WORK_DIR ]; then

	#ディレクトリを作成する
	mkdir $WORK_DIR
fi

#そのディレクトリに入る
cd $WORK_DIR
#事前にあったファイルは全部消す
rm ./*

#データベース内にあるテーブルリストを作成し、個別にテーブルのダンプデータを作成する
#-eはその後コマンドを実行するというオプション。
#-Bは余計な表示をせずに一覧を出力させる。
#-Nは一番上の見出しを削除する
for TABLENAME in ` mysql -u $USER -p$PASS -B -N -e 'show tables' $DB_NAME`
do
	#echo $TABLENAME
	mysqldump --opt -c -u $USER -p$PASS -x $DB_NAME $TABLENAME &gt; $TABLENAME.sql
done

#移動する
cd $BACKUP_DIR

#該当する日付のディレクトリをまるごと圧縮する
tar -czf $DB_NAME$DAY.tar.gz $WORK_DIR
</pre></p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/mysql/'>mysql</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/321/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/321/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/321/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=321&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2011/04/23/mysql%e3%83%90%e3%83%83%e3%82%af%e3%82%a2%e3%83%83%e3%83%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>Containable Behaviorを追いかけてみました。</title>
		<link>http://yashio.wordpress.com/2010/12/21/containable-behavior%e3%82%92%e8%bf%bd%e3%81%84%e3%81%8b%e3%81%91%e3%81%a6%e3%81%bf%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/</link>
		<comments>http://yashio.wordpress.com/2010/12/21/containable-behavior%e3%82%92%e8%bf%bd%e3%81%84%e3%81%8b%e3%81%91%e3%81%a6%e3%81%bf%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/#comments</comments>
		<pubDate>Mon, 20 Dec 2010 15:00:32 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[cakephp]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=296</guid>
		<description><![CDATA[cakephp 1.3.3で開発しております。 今回は先日わたくしがハマった事象についてお話します。多少書きなぐり気味ですが＞＜許してください。 前提条件 １．A_controllerでpaginateしている ２．paginate対象のモデル(User)には色々なモデルが関連付けられているが、その1部であるHogehogeというモデルをLEFTJOINではなく、INNERJOINで連結したいので一度unbindする ３．このメソッドが呼ばれる前にapp_controllerのbeforeFilter()にUserモデルで検索をかけている箇所がある。そこはContainableBehaviorが使われている という前提でした。 １．A_controllerのpaginateの箇所はこんなかんじ。 でハッピー！　にならなかった・・・というお話。 &#160; まず、unbindModelの第2引数にfalseを渡すことで永続的にモデルのアソシエーション状態を保持してる、つもり。 ブログ記事でよく見かけますが、ここにfalseを設定しないと、paginateでは ・件数 ・欲しいレコード を段階的に取得するため、2回目のクエリでアソシエーションがもどってしまうという。という記事がじゃんじゃん、でてくる。 だがしかし。 falseにしてるのにどーやってもあーやってもHogehogeテーブルがLEFTJOINされ、上記のINNERJOINのHogehogeテーブルまでくっついてくるので「 Not unique table/alias: &#8216;Hogehoge&#8217; 」って怒られます。憤ります。ぷるぷる。別名とか別にLEFTJOINでもいいなとか色々選択肢はあったのですが、最近「ソースコードよめよ」なので一念発起してソースの旅に出てみることにしました。cakeフォルダのなかにダイヴします。 まずコアソースのcontroller.phpでpaginate()をあさります。ださいこと極まりないですが、ここでかたっぱしからdebug($object-&#62;belongsTo);を出力して、どうやら ここの前後で、belongsToの中身が、もともとのモデルにセットされているアソシエーションにもどってしまうことが分りました。つまり、falseにしているにも関わらず件数取得時にアソシエーションがリセットされていることになります。なので、こんどはmodel::find()をあさります。 すると、今度はmodel::findにある この箇所でbelongsToの内容が変化してしまうことがわかりました。そんな感じでソースをぐるぐるを追いかけていったところ結局、ここではcallback関数がよばれていて、model_behavior.phpにいき、 のようなtriggerメソッドから、afterFind()がよばれていることに。結論からいうと、app_controller.phpで ３。のメソッドが実行される →ここで、Userモデルの変数に__backAssociationという、いわば「モデルの既存アソシエーション」がバックアップのような意味合いでセットされる。 次に、paginate処理を行う →ここで、paginateのINNERJOINを実行したいためunbindする(INNER JOIN対象のモデルを、Userモデルから切り離す） →paginate実行 内部処理：カウントを取得　　→ここで、カウントを取得。この時点はアソシエーションはunbind状態が保持されている →count取得時のfindのafterFindが実行。その際、既にUserモデルにセットされている__backAssociationの値を参照しておりここに値が入っていると明示的にモデルのアソシエーションをデフォルトに戻してしまう →実際のレコードを検出(findが実行) →既にアソシエーションがもどっているため、unbindされたモデルなんぞは無視され、同じモデルが2回JOINされる有様。 なんで、model_behavior.phpのafterFindなのかというと、app_controller側で呼び出したメソッド内でUserモデルにビヘイビアがセットされるため、paginateではBehaviorは使っていないにもかかわらずここのafterFindが呼ばれる・・・らしい。ここだけはちょっとあやふや。もし「ここおかしいよ」って思われる方がいらっしゃったらご指摘いただけると。 対処方法：app_conrtollerのbeforeFilter()のクエリをContainableBehaviorを使わずに普通にjoinした。 とりあえずこの対応方法で行ったのですが…根本的ではないですね。 そもそも、事前に実行されるメソッドで利用したモデルの構成は引き継がれるという当たり前なことに気が付かず、　app_controllerにこのメソッドを追加する前まではpaginate処理が動作していたので非常にデバッグに時間がかかってしまいました。 一度Userモデルを使っているわけですから、そういう意味では原因がわかって「そりゃそうだな・・・」という気持ちになったのも事実です・・が 事前にＡモデルをContainableBehaviorを使って実行し、そのまま続けてＡモデルのモデル構成を変更（bind/unbind)しpaginateを行った場合に第2引数のfalseは役に立たない　という結論で・・・よろしいか？ こういう状況って皆さんあまりない・・かな。不具合とはいえないかもなんですが、ちょっと気になったのでネタにしてみました。　鼻の黒い人にこんな記事を見つけてもらったのですが同じ事をいってる・・かな。そう考えると、同じモデルのメソッドを別々のところで呼び出しているのもどうなのかなーって事もあるのかもですが、 ContainableBehaviorとpaginateの相性はそこまでウフフな関係にはいたっていないということでしょうか。 アソシエーションを密接にしておくと、思わぬところで意識していなかったモデルの姿形がかわっとる！という事があるかもしれないですね・・ カテゴリー:cakephp<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=296&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>cakephp 1.3.3で開発しております。<br />
今回は先日わたくしがハマった事象についてお話します。多少書きなぐり気味ですが＞＜許してください。</p>
<p><strong>前提条件</strong></p>
<p>１．A_controllerでpaginateしている<br />
２．paginate対象のモデル(User)には色々なモデルが関連付けられているが、その1部であるHogehogeというモデルをLEFTJOINではなく、INNERJOINで連結したいので一度unbindする<br />
３．このメソッドが呼ばれる前にapp_controllerのbeforeFilter()にUserモデルで検索をかけている箇所がある。そこはContainableBehaviorが使われている</p>
<p>という前提でした。</p>
<p>１．A_controllerのpaginateの箇所はこんなかんじ。</p>
<p><pre class="brush: php;">
$this-&gt;User-&gt;unbindModel(array('belongsTo'=&gt;array('Hogehoge')), false);//第2引数をfalseにすることでモデルの関連性を維持させる

			'joins'=&gt;array(
				array(
					'type'	=&gt;'INNER',
					'fields'=&gt;array('Hogehoge.name'),
					'table'=&gt;'`Hogehoges`',
					'alias'=&gt;'`Hogehoge`',
					'conditions'=&gt;array(
						'Hogehoge.id = Hogehoge.user_id',
					),
				),
			),
//このあとpaginate実行

</pre></p>
<p>でハッピー！　にならなかった・・・というお話。</p>
<p>&nbsp;</p>
<p><span id="more-296"></span></p>
<p>まず、unbindModelの第2引数にfalseを渡すことで永続的にモデルのアソシエーション状態を保持してる、つもり。<br />
ブログ記事でよく見かけますが、ここにfalseを設定しないと、paginateでは<br />
・件数<br />
・欲しいレコード<br />
を段階的に取得するため、<strong>2回目のクエリでアソシエーションがもどってしまうという。</strong>という記事がじゃんじゃん、でてくる。</p>
<p><strong>だがしかし。</strong></p>
<p>falseにしてるのにどーやってもあーやってもHogehogeテーブルがLEFTJOINされ、上記のINNERJOINのHogehogeテーブルまでくっついてくるので<strong>「 Not unique table/alias: &#8216;Hogehoge&#8217;	」</strong>って怒られます。憤ります。ぷるぷる。別名とか別にLEFTJOINでもいいなとか色々選択肢はあったのですが、最近「ソースコードよめよ」なので一念発起してソースの旅に出てみることにしました。cakeフォルダのなかにダイヴします。</p>
<p>まずコアソースのcontroller.phpでpaginate()をあさります。ださいこと極まりないですが、ここでかたっぱしからdebug($object-&gt;belongsTo);を出力して、どうやら</p>
<p><pre class="brush: php;">
$count = $object-&gt;find('count', array_merge($parameters, $extra));
</pre></p>
<p>ここの前後で、belongsToの中身が、もともとのモデルにセットされているアソシエーションにもどってしまうことが分りました。つまり、falseにしているにも関わらず件数取得時にアソシエーションがリセットされていることになります。なので、こんどはmodel::find()をあさります。</p>
<p>すると、今度はmodel::findにある</p>
<p><pre class="brush: php;">
$results = $this-&gt;__filterResults($results);
</pre></p>
<p>この箇所でbelongsToの内容が変化してしまうことがわかりました。そんな感じでソースをぐるぐるを追いかけていったところ結局、ここではcallback関数がよばれていて、model_behavior.phpにいき、</p>
<p><pre class="brush: php;">
$this-&gt;Behaviors-&gt;trigger($this, 'afterFind', array($results, $primary), array('modParams' =&gt; true));
</pre></p>
<p>のようなtriggerメソッドから、afterFind()がよばれていることに。結論からいうと、app_controller.phpで</p>
<p>３。のメソッドが実行される<br />
→ここで、Userモデルの変数に__backAssociationという、いわば「モデルの既存アソシエーション」がバックアップのような意味合いでセットされる。</p>
<p>次に、paginate処理を行う<br />
→ここで、paginateのINNERJOINを実行したいためunbindする(INNER JOIN対象のモデルを、Userモデルから切り離す）<br />
→paginate実行<br />
内部処理：カウントを取得　　→ここで、カウントを取得。この時点はアソシエーションはunbind状態が保持されている<br />
→count取得時のfindのafterFindが実行。<strong>その際、既にUserモデルにセットされている__backAssociationの値を参照しておりここに値が入っていると明示的にモデルのアソシエーションをデフォルトに戻してしまう</strong></p>
<p>→実際のレコードを検出(findが実行)<br />
→既にアソシエーションがもどっているため、unbindされたモデルなんぞは無視され、同じモデルが2回JOINされる有様。</p>
<p>なんで、model_behavior.phpのafterFindなのかというと、app_controller側で呼び出したメソッド内でUserモデルにビヘイビアがセットされるため、paginateではBehaviorは使っていないにもかかわらずここのafterFindが呼ばれる・・・らしい。ここだけはちょっとあやふや。もし「ここおかしいよ」って思われる方がいらっしゃったらご指摘いただけると。</p>
<p><strong>対処方法</strong>：app_conrtollerのbeforeFilter()のクエリをContainableBehaviorを使わずに普通にjoinした。<br />
とりあえずこの対応方法で行ったのですが…根本的ではないですね。<br />
そもそも、事前に実行されるメソッドで利用したモデルの構成は引き継がれるという当たり前なことに気が付かず、　app_controllerにこのメソッドを追加する前まではpaginate処理が動作していたので非常にデバッグに時間がかかってしまいました。<br />
一度Userモデルを使っているわけですから、そういう意味では原因がわかって「そりゃそうだな・・・」という気持ちになったのも事実です・・が</p>
<p>事前にＡモデルをContainableBehaviorを使って実行し、そのまま続けてＡモデルのモデル構成を変更（bind/unbind)しpaginateを行った場合に第2引数のfalseは役に立たない　という結論で・・・よろしいか？<br />
こういう状況って皆さんあまりない・・かな。不具合とはいえないかもなんですが、ちょっと気になったのでネタにしてみました。　鼻の黒い人に<a href="http://cakephp.lighthouseapp.com/projects/42648/tickets/1246-containable-should-keep-assoc-conditions">こんな記事</a>を見つけてもらったのですが同じ事をいってる・・かな。そう考えると、同じモデルのメソッドを別々のところで呼び出しているのもどうなのかなーって事もあるのかもですが、</p>
<p>ContainableBehaviorとpaginateの相性はそこまでウフフな関係にはいたっていないということでしょうか。<br />
アソシエーションを密接にしておくと、思わぬところで意識していなかったモデルの姿形がかわっとる！という事があるかもしれないですね・・</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/cakephp/'>cakephp</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/296/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/296/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/296/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=296&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2010/12/21/containable-behavior%e3%82%92%e8%bf%bd%e3%81%84%e3%81%8b%e3%81%91%e3%81%a6%e3%81%bf%e3%81%be%e3%81%97%e3%81%9f%e3%80%82/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
		<item>
		<title>javascriptでtextareaに値をセットしたい</title>
		<link>http://yashio.wordpress.com/2010/12/15/javascript%e3%81%a7textarea%e3%81%ab%e5%80%a4%e3%82%92%e3%82%bb%e3%83%83%e3%83%88%e3%81%97%e3%81%9f%e3%81%84/</link>
		<comments>http://yashio.wordpress.com/2010/12/15/javascript%e3%81%a7textarea%e3%81%ab%e5%80%a4%e3%82%92%e3%82%bb%e3%83%83%e3%83%88%e3%81%97%e3%81%9f%e3%81%84/#comments</comments>
		<pubDate>Tue, 14 Dec 2010 15:15:40 +0000</pubDate>
		<dc:creator>yashio</dc:creator>
				<category><![CDATA[CSS]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://yashio.wordpress.com/?p=292</guid>
		<description><![CDATA[ビールのんで帰ってきたので放置せずにこれだけは書いて寝よう。 やりたいこと。 ＤＢ上で登録したテンプレートなる文書のデータを、subjectだけ一覧で見せたい。 そんで、その一覧のsubjectをクリックしたら、テンプレートの内容をtextareaにセットしたい。 …たったこれだけ。 やってみたことはリンククリック時にわざわざＤＢ通信するのもなんなので…ちょっとダサいけど、ページ出力時にテンプレートの内容はＤＩＶで区切ってどっかに出力させて、かつ表示させない(display=none)にして、リンククリックしたらそのＤＩＶの中身をテキストエリアにセットする、という流れ。 ところが、Ｃｈｒｏｍｅだとちゃんと見えるのにＩＥ（７）だと、テンプレート内の改行が全部、すっ飛ばされてしまう！ で、ググると出てくる、出てくる。そもそもinnerHTMLには適用されないだの、textareaがＵＮＫＯだとか、ＩＥ・・・？とか色々でてくるんですけど、これ！っていう情報が出てこない。なんつーか文字コードと混同してる（私が）感じで情報が切り分けられず、phpで文字コードを変換してみたりとか色々したけどもうだめびーるのみたいしさいきん体組成系かってふとったしビールのみたいし。 で、ＤＩＶタグなのがいけないのかと思ってたので、仕方ないのでinputタグで出力し、それを見せない、みたいなことをやってみたんだけど、どうにもこうにもダメ。text()でやるとうまくいった、とかいろいろあったんだけどもうだめぽ…と思ったんですが最終的に一番楽そうな手段が見つかったので、備忘録的にメモ。これが最適手段ではないと思いますが、もし他の方法をご存知の方がいらしたら「っへ！こんなのもあるでよ！」って教えてくれるとありがたい。 結論からいうとですね、ＤＩＶタグではなくて、テンプレートの内容をあらかじめtextareaに書き出しました。そして上記のようにdispayをnoneにして非表示にし、この値をjQueryで言うところのval()で取得し、セットもval()で行いました。そうするとＩＥだろうがＣｈｒｏｍｅだろうが、改行がきちんと判断されるようになりましたとさ。 $(document).ready(function() { // bind 'Form' and provide a simple callback function $(".template").click(function(event){ $('.comment').val($("textarea.setText" + $(this).attr('id')).val()); return false; }); }); こんなかんじで、セットする元のテンプレート内容は こんなかんじで対処しました。他にもっと良い方法あるよ！って人は是非。いやーこれ解決するのにすんごい時間かけてしまったよ…とほほ。 ※２１日はCakeAdvent2010 なんで最近はまったcontainableとunbindのくだりを書く予定です。よろしくお願いします。 カテゴリー:CSS, javascript<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=292&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>ビールのんで帰ってきたので放置せずにこれだけは書いて寝よう。<br />
やりたいこと。</p>
<p>ＤＢ上で登録したテンプレートなる文書のデータを、subjectだけ一覧で見せたい。<br />
そんで、その一覧のsubjectをクリックしたら、テンプレートの内容をtextareaにセットしたい。</p>
<p>…たったこれだけ。<br />
やってみたことはリンククリック時にわざわざＤＢ通信するのもなんなので…ちょっとダサいけど、ページ出力時にテンプレートの内容はＤＩＶで区切ってどっかに出力させて、かつ表示させない(display=none)にして、リンククリックしたらそのＤＩＶの中身をテキストエリアにセットする、という流れ。</p>
<p>ところが、Ｃｈｒｏｍｅだとちゃんと見えるのにＩＥ（７）だと、テンプレート内の改行が全部、すっ飛ばされてしまう！<br />
で、ググると出てくる、出てくる。そもそもinnerHTMLには適用されないだの、textareaがＵＮＫＯだとか、ＩＥ・・・？とか色々でてくるんですけど、これ！っていう情報が出てこない。なんつーか文字コードと混同してる（私が）感じで情報が切り分けられず、phpで文字コードを変換してみたりとか色々したけどもうだめびーるのみたいしさいきん体組成系かってふとったしビールのみたいし。</p>
<p>で、ＤＩＶタグなのがいけないのかと思ってたので、仕方ないのでinputタグで出力し、それを見せない、みたいなことをやってみたんだけど、どうにもこうにもダメ。text()でやるとうまくいった、とかいろいろあったんだけどもうだめぽ…と思ったんですが最終的に一番楽そうな手段が見つかったので、備忘録的にメモ。これが最適手段ではないと思いますが、もし他の方法をご存知の方がいらしたら「っへ！こんなのもあるでよ！」って教えてくれるとありがたい。</p>
<p>結論からいうとですね、ＤＩＶタグではなくて、テンプレートの内容をあらかじめtextareaに書き出しました。そして上記のようにdispayをnoneにして非表示にし、この値をjQueryで言うところのval()で取得し、セットもval()で行いました。そうするとＩＥだろうがＣｈｒｏｍｅだろうが、改行がきちんと判断されるようになりましたとさ。</p>
<p><code><br />
$(document).ready(function() {<br />
	// bind 'Form' and provide a simple callback function<br />
		$(".template").click(function(event){<br />
			$('.comment').val($("textarea.setText" + $(this).attr('id')).val());<br />
			return false;<br />
		});<br />
});<br />
</code><br />
こんなかんじで、セットする元のテンプレート内容は</p>
<p><pre class="brush: php;">
	if(isset($document)){
		//改行処理があるため、セットする要素と同じtextareaで対処する
	    foreach($template as $key=&gt;$value) {
			echo &quot;&lt;textarea style='display:none' class='setText{$value['Template']['id']}'&gt;&quot;;
	    	echo $value['Template']['content'];
			echo '&lt;/textarea&gt;';
	    	
	    }
	}
</pre><br />
こんなかんじで対処しました。他にもっと良い方法あるよ！って人は是非。いやーこれ解決するのにすんごい時間かけてしまったよ…とほほ。</p>
<p>※２１日はCakeAdvent2010 なんで最近はまったcontainableとunbindのくだりを書く予定です。よろしくお願いします。</p>
<br />カテゴリー:<a href='http://yashio.wordpress.com/category/css/'>CSS</a>, <a href='http://yashio.wordpress.com/category/javascript/'>javascript</a>  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/yashio.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/yashio.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/yashio.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/yashio.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/yashio.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/yashio.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/yashio.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/yashio.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/yashio.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/yashio.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/yashio.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/yashio.wordpress.com/292/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/yashio.wordpress.com/292/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/yashio.wordpress.com/292/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=yashio.wordpress.com&amp;blog=7885922&amp;post=292&amp;subd=yashio&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://yashio.wordpress.com/2010/12/15/javascript%e3%81%a7textarea%e3%81%ab%e5%80%a4%e3%82%92%e3%82%bb%e3%83%83%e3%83%88%e3%81%97%e3%81%9f%e3%81%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/c879ceb3c641ee022179f885d29c1d9d?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">yashio</media:title>
		</media:content>
	</item>
	</channel>
</rss>
