Home

memo-space

CakePHP日記:requestActionとSecurityコンポーネント

  • 2007-10-26
  • php

なるほど。viewからrequestAction()を呼びだすのか。 なかなかよさそう。 と思ってたらSecurityコンポーネントとの組み合わせでハマってしまいました。

どうやらSecurityコンポーネントのrequireAuthを使ってると、requestAction()が呼ばれた時にセッション側のトークンが書き換えられてしまうので絶対トークンが一致しない様子。うーん困った。

あと、セッションの中にはトークンのキーと同時に有効期限が セットされるんだけど、 Sessionコンポーネントの有効期限がCAKE_SECURITY * CAKE_SESSION_TIMEOUT なのに、トークンの有効期限はCAKE_SECURITYだけで決まっちゃってる気がする。

「すごいリロード対策」ってトランザクショントークンのことだよね

  • 2007-10-22
  • php

いや記事いいんだけど、すごい勢いでブックマークされていることに驚いた。

Continue reading

sortするならusort

  • 2007-10-21
  • php

個人的には、sortをするならusort()が好きです。 Perlをはじめ他の言語を使ったことがある人ならそう思うんじゃないかな。

PHPのarray_multisort関数が激便利だったので紹介 : akiyan.com

Continue reading

phpのinclude_pathのカレントディレクトリ

  • 2007-10-15
  • php

require("foo.php")とrequire("./foo.php")って意味違うって知ってました? cliから実行する場合以外はあまり関係無いかもしれませんが。

読み込むファイルはまずカレントのワーキングディレクトリからの相対パスとしてinclude_path で探され、それから、カレントのスクリプトのディレクトリからの相対パスとしてinclude_path で探されます。 (中略)ファイル名が ./ あるいは ../ で始まっている場合は、 カレントのワーキングディレクトリからの相対パスとして探されるのみとなります。 (PHP: include - Manual)

Continue reading

Smartyのtruncateはfunc_overloadでいいんじゃない

  • 2007-06-15
  • php

ずいぶん前からよく見かける話題だけど、また最近見かけたので。

いちばん手っ取り早いのは、mbstring.func_overloadを設定しちゃうことだと思いますよ。自分でプラグイン書く必要とか無いです。

ファイルの直リンクを防止する方法をもう少し考えてみる

  • 2007-05-31
  • php

Refererを使わずに直リンクを防止する方法を考えてみます。

元ネタ: cl.pocari.org - PHP の apache_setenv と virtual を利用して,ファイルへの直リンクを防止する

この foo.php のファイル名を時間によって変えるなどすれば,まあ,直リンクを防止することができる……のかな?ちと強引ですが.

つまり、「直リンクを防止する」ことを考えるより「ある一定時間しか有効でないURLを作る」ことを考えれば良いということじゃないでしょうか。

で、foo.phpのファイル名を変えちゃうと、外部からの直リンクは防げても、内部からの普通のリンクを貼る時に困りそうです(それならぶっちゃけ、画像のファイル名そのものを時間によって変えちゃってもいいわけだし)。

なので、時刻をパラメータとして渡す方針で。

フェーズ1

  1. foo.php?t=....のようにfoo.phpにタイムスタンプを渡す
  2. foo.phpの中で$_GET['t']と現在時刻を比較し、n分以上たっていればはじく
  3. でもこれじゃ簡単に偽装されちゃうYO!

なので、フェーズ2

  1. foo.phpにタイムスタンプと、(タイムスタンプ+秘密鍵)のHMACを渡す。
  2. foo.phpの中で、(タイムスタンプ+秘密鍵)のHMACを再計算して、渡ってきたHMACと一致するかチェック。
  3. foo.phpの中で$_GET['t']と現在時刻を比較し、n分以上たっていればはじく

な感じじゃないでしょうか。本当はapache moduleとかで書いた方が楽そうですが。

PHPを3ヶ所だけ直すとしたら

  • 2007-05-22
  • php

そろそろPHPに関して一言いっとくか

PHPについてはいろいろありますが手短に釣られて見ます。

PHPのあれが駄目とかじゃなく、 もし神様(何の?)が、今までのは無かったことにしてPHPをどこでも3ヶ所直していいよっていったらどうするかってのを聞いてみたいです。

Continue reading

CakePHP日記:PostgreSQLのportを指定する

  • 2007-04-16
  • php

app/config/database.phpのコメントに惑わされてはいけません。

/*
 ...
 * host =>
 * the host you connect to the database
 * MySQL 'localhost' to add a port number use 'localhost:port#'
 * PostgreSQL 'localhost' to add a port number use 'localhost port=5432'
 *
 */

実は'host' => 'localhost port=5432'ではなく'port' => 5432を追加すればOK。

CakePHP日記:CakePHPでSmartyを使う時のTips

  • 2007-04-11
  • php

2007-04-12 追記:※注意!結論の「バッククォートで括ると便利」というのはあってますが、そこまでの過程はほとんどウソでした。そのうち直します。

CakePHPでViewにSmartyViewを使う時、おおざっぱにいうとこんな動きになっています。

  • コントローラがビューに変数を渡す
  • ビューがSmartyに変数を渡す(ついでに自分自身をviewというSmarty変数に登録する)
  • レンダリング

このように、変数のコピーが2度発生します。

{$post.id}   // これはSmartyの変数
{$html->link('linkto', $post.id)}  // この$postはPHPの(SmartyViewがセットした)変数

ここで困るのは、レンダリング中にセットされた変数はSmartyの世界からしか見えないこうことです。 典型的な例としてはループで使われる変数です。

Continue reading

CakePHP日記:Model,View,Controllerを共有する

  • 2007-04-09
  • php

同じmodel/actionに対して、一般ユーザ向け画面と管理者向け画面を分けたい時、CakePHPではAdmin Routingという選択肢があります。

4.4. 高度な Routing 設定: Admin Routing と Webservices

なんだけども、アプリケーションを分けてしまった方がすっきりする場合もあります。 分けてしまった場合でも、特にModelのクラスは同じもの使うことが多いです。こういう場合はファイルをコピーしなくても、app/config/bootstrap.phpでModelを検索するパスを$modelPaths 複数指定することができます。

Continue reading

文字列の先頭と末尾を表わす正規表現

  • 2007-04-08
  • php

そういう時は普通、\zを使うんだと思う(元記事のコメント欄でも言及されてるみたいだけど)。

という話を書こうと思ったらPerl6では\Aと\zは廃止だそうです。

^と$が\Aと\z相当の動作をするらしい。

CakePHP日記:insertかupdateか

  • 2007-04-05
  • php

Model#save()は、idがセットされているかどうかでinsertかupdateかを判断しているようです(さらに、lidがセットされていれば、本当に存在するかをSELECTしてみています)。

ですが、一般的なコントローラのeditアクションは、

A.12. Posts の編集:CakePHP プログラマーズ リファレンスガイド

    function edit($id = null)
    {
        if (empty($this->data))
        {
            $this->Post->id = $id;
            $this->data = $this->Post->read();
        }
        else
        {
            if ($this->Post->save($this->data['Post']))
            {
                $this->flash('投稿を更新しました。','/posts');
            }
        }
    }

こんな感じで、データがpostされた場合はidをセットしていません。 ではなぜこれをupdateと判断するかというと、URLの1つめのパラメータは暗黙でデフォルトのモデルのidにセットされるからです。 じゃなくってこのドキュメントの例では、idをhiddenで渡しているからでした。 で、このhiddenが無い場合の話が以下に続きます。

しかし、コントローラでvar $uses = array('Model1', 'Model2')などと明示的に使うモデルを指定していると、この暗黙のidのセットは動作しないようです。

なので、uses を指定している時や、URLの1つめのパラメータをデフォルトのモデルのidとして使いたくない場合は、明示的にidをセットしましょう。

CakePHP日記:SmartyからHTMLヘルパーの属性を指定する

  • 2007-04-03
  • php

前回の続き。 実は、

<p>Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}</p>

こんなことしなくても、HTMLヘルパーのメソッドはたいてい、attributeにarrayじゃなく文字列を渡すこともできるらしく、

<p>Title: {$html->input('Post/title', 'size="40" class="classname"')}</p>

でいいんじゃないかということに気づいた。

2007-04-03 追記

やっぱダメだった。inputみたいなフォームの部品に関しては、valueとかidを付けてくれない。$html->image() なんかには使ってもいいかもしれない。

CakePHP日記:Smaryテンプレート内での配列生成

  • 2007-03-29
  • php

CakePHPからSmartyを使うのは一見いいとこどりのようで、実際結構大変かもしれない。

素のCakePHPだと

<p>Title: <?php echo $html->input('Post/title', array('size'=>40, 'class'=>'classname'))}</p>

みたいな感じのものを、Smartyテンプレート内では配列を生成できないので、

{assign_assoc var='ArrayName' value='size=>40,class=>classname'}
<p>Title: {$html->input('Post/title', $ArrayName)}</p>

と書こうという話。そんなassignは個人的に許せないわけですよ。 CakePHPのbasic.phpにはaとかaaとかhとかprとか色々便利な関数があるのと、 Smartyテンプレート内では関数を自由に呼び出すことはできないけど、 テンプレート変数のメソッドなら治外法権という性質を利用して、 SmartyViewにラッパーメソッドを追加。

function aa() {
    $args = func_get_args();
    return call_user_func_array('aa', $args);
}

SmartyViewのインスタンスは$viewとしてテンプレート内から参照できるので、

<p>Title: {$html->input('Post/title', $view->aa('size', 40, 'class', 'classname'))}</p>

と書くことができる。邪道な気もしますが。あと、同様にprも追加しておいた。

あと、テンプレート変数をヘルパーの引数に渡したい時とかどうしよう(ループカウンタとか)。 $view->Smarty->get_template_vars()かなぁ。どんどん道を外れていく気がする。

2007-04-03 追記:CakePHP日記:SmartyからHTMLヘルパーの属性を指定する

CakePHP日記:radioにlabelを付ける

  • 2007-03-27
  • php

デフォルトのHtmlHelper::radio()が出力するラジオボタンにラベルが無いので付けた。 誰もがやりたくなる改造だと思います。

ヘルパーが出力するHTMLタグは、app/config/tags.ini.phpでカスタマイズできますが、 <label for="...">と書くにはヘルパー側に手を入れる必要があるので、 安易にapp/config/tags.ini.phpをこんな感じにしてみました。

radio =  <label><input type="radio" name="data[%s][%s]" id="%s" %s />%s</label>

Home

Search
Feeds
Profile
石田@苫小牧市と名乗りつつ札幌の某社に勤務するプログラマ
書いた本
Links

Page Top