CakePHP/Smartyとのつきあい方 - CakePHP Advent Calendar 2010 9日目
CakePHP Advent Calendar2010 9日目です。
軽い気持ちで参加したので、みなさんが濃いネタでがっつり書かれているので、
おびえてます。。。
さて、今まで、Smartyをさんざん使ってきたので、
癖でCakePHPでも、SmartyViewClassを使って、
Viewの部分は、Smartyを使って書いてます。
ヘルパーの呼び出しなんかも楽で、
{$html->css('home', null, null, false)} {$javascript->link('jquery', false)}
こんな感じで、さくさくっと呼び出しができちゃいます。
でも、ヘルパーに配列を渡すとなると、困ったことになってしまいます。
{assign_assoc var='ArrayImage' value='class=>image'} {$html->image('image/image.gif', $ArrayImage)}
と、事前に配列を作らないといけないんです。
2つも渡すとなると、さらに大変。
{assign_assoc var='ArrayImage' glue="::" value='class=>image::alt=>test'} {$html->image('image/image.gif', $ArrayImage)}
見た目もきれいではないし、間違いそうで嫌なのです。
そこで、必要な部分はヘルパーを拡張しています。
<?php class ExhtmlHelper extends HtmlHelper { function img ($path, $class = null) { $opt = Array(); if ($class) { $opt['class'] = $class; } return $this->image($path, $opt); } }
といったヘルパーを作成して、コントローラーに追加し、
ビューで呼び出します。
{$exhtml->img('image/image.gif', 'image')}
ちょっとすっきり。
必要な物が出来ると、都度拡張しないといけないので、
悩ましいのですが。
誰かいい方法があれば、伝授してください。
すいません、もう少し深いネタを用意しておくべきでした・・・
次のCakePHP Advent Calendar 2010の担当は、mon_satさんです。
よろしくお願いしま〜す。
session_cache_limiter
session_cache_limiter("none");
と誰かが書いていたので、マニュアルを見てみたのですが、noneなんてパラメータはない。
しかし、検索すると出てくるので、どういう挙動になるのかと調べてみました。
規定のパラメータ(public・private_no_expire・private・nocache)だと、
start_session()を行ったときに、Cache-Control:ヘッダが送られます。
送られる内容については、
http://php.net/manual/ja/function.session-cache-limiter.php
を参照してください。
PHPのソースを読んだところ、public・private_no_expire・private・nocache以外の
場合は、ヘッダが送られないとなっています。
<?php session_cache_limiter('none'); session_start(); echo "a";
上記の場合は、Cache-Control:ヘッダは付加されませんでした。
というか、public・private_no_expire・private・nocacheこれ以外だと、
何の文字入れても送られない。'aaaa'でも期待する結果は得られました。
PostgreSQL継承機能
PostgreSQLを長く使っておりますが、こんな機能があるとは知りませんでした。
たまにパーティショニングしたいな〜と思っていたのですが、まだ8.1系には手を出せないので、
これをうまく使えば、楽しくなりそうです。
下記のメインのテーブルを作ります。
create table t_sales (id serial primary key not null, name varchar(500), number int);
次に、t_sales を継承したテーブルを作成します。
create table t_sales_01 () INHERITS (t_sales);
実際のデータに関しては、継承したテーブルにいれます。
insert into t_sales_01 (name, number) values ('test', 1); insert into t_sales_01 (name, number) values ('test', 2);
データを参照する場合は、親のテーブルに対しておこなうことで取り出すことができます。
select * from t_sales; id | name | number
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
さらにもう一つ継承したテーブルを作ってみます。
create table t_sales_02 () INHERITS (t_sales);
こっちにもデータを入れてみます。
insert into t_sales_01 (name, number) values ('test', 3);
親のテーブルで参照します。
select * from t_sales; id | name | number
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
両方の子テーブルから取り出すことができます。
もちろん、子テーブルだけを参照することもできます。
select * from t_sales_01; id | name | number
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
こんなこともできるみたいです。
update t_sales set number=4 where id=3; select * from t_sales; id | name | number
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
意外に知られていない機能な気もします。
大きなテーブル扱うときは、便利だな〜
これからはこいつで、実装してみよう。
Safariブラウザでの、window.locationの挙動
後輩がはまっていたので、調査していると、Safari・MacIEに関しては、
独特の挙動を持っていました。
Safariで、window.locationが動かないと言われたので、
なんで動かへんねんと思いつつ調査。
確かに、動かないわけなのですが、なんで動かないのかのわからない状態。
色々と調査をしていると、下記のサイトにたどり着きました。
http://snook.ca/archives/javascript/windowlocation/
<script type="text/javascript"> function test3(){ window.location = 'http://snook.ca/'; } </script> <p><a href="#" onclick="window.location = 'http://snook.ca'"> test 1</a></p> <p><a href="#" onclick="window.location = 'http://snook.ca'; return false;">test 2</a></p> <p><a href="#" onclick="test3();">test 3</a></p> <p><a href="#" onclick="test3();return false;">test 4</a></p> <p><a href="javascript:window.location = 'http://snook.ca';">test 5</a></p>
上記の中で、Safariならびに、MacIE5.2で正常に動くのは、どれでしょうというものでした。
正解は、2と4と5が動いて、1と3は動きません。
なぜかと言いますと、新しいURLとして、window.locationがセットされるのですが、
onclickイベントのあとで、アンカータグのhrefがセットされるため、新しいURLは、「#」となってしまいます。
アンカータグのhrefがセットされるのを回避するために、return false;が必要となります。
こうやって調べて、ブログに載せるってやっぱり重要ですね。
日本語の情報がなかったので、こうやって公開しておきます。
システムテスター
最近は、開発せずにテスト役に回ってます。
新サービスのリリース間近なので、他の人が開発しているサービスのチェック役です。
テストは大変ですけれども、やっていると楽しいですね。
特に、人の裏をかくテストが通ったときはニンマリしてます。
たとえば、2月31日がとおるとか。
チェックしとけよ、と思いつつ、はいバグゲット〜!
って報告あげてます。
ま、これが次の自分の開発にも役立つわけで、
自分が作ったものでは、こんなものはもちろんとおしません。
何か書こう
さて、またまた間が空いてしまいましたが。
何か書くことを続けようと思います。
って、説得力はありませんが。
今の私に書けているもの、アウトプットすることです。
なので、何か書こうと思います。
書かないと何も始まりませんので。