Archive for 7月, 2007

CakePHP グローバル関数

0

PHP のネイティブ関数の短縮表記には下記のようなものがあります。

a() => array()
e() => echo()
low() => strtolower()
up => strtoupper()
r() => str_replace()
am() => array_merge()
h() => htmlspecialchars()

このような短縮表記の関数を独自に定義して開発に使用されている方も多いと思いますが、CakePHP として定義されていると使用しやすいですね。(特に複数人で開発しているときなど、標準であると助かります。)

このほかにも CakePHP には便利な関数が定義されています。

debug($var, $showHtml);
DEBUGレベルが0以外のときに、$varが出力される。
print '<pre>';
print_r($var);
print '</pre>';

のようなことをしてくれます。$showHtmlが TRUE ならブラウザで見やすいように出力してくれます。
aa(‘a’,'b’)
連想配列を作成する。
array('a'=>'b')
をやってくれます。
h($mixed)
文字列を指定して htmlspecialchars をやってくれるが、配列も指定できる。
配列を指定すると再帰的に h() を呼び出している。
pr($var)
print_r をブラウザでみやすいように <pre> で囲んでくれます。echo "<pre>";
print_r($var);
echo "</pre>"
env($key)
環境変数を取得できます。
一番の特徴は PHP_SELF, DOCUMENTO_ROOT をサポートしていないサーバでも動作をエミュレートして値を返してくれます。コードを再配布するときには重宝しそうです。
params($mixed)
文字列を返してくれます。
配列なら一番最初の値、文字列なら文字列、値がなければ NULL を返します。
setUri()
現在のURI を返してくれます。
file_get_contents()
file_put_contents()
この関数が実装されていない PHP4.3 未満のためにエミュレートされています。
stripsslashes_deep($array)
$array は配列を指定。配列の全ての値に対して再帰的に stripslashes を行います。
countdim($array)
$array の配列の次元数を返します。
LogError($message)
CakeLog::write を実行します。
fileExistsInPath($file)
現在のinclude パスから $file で指定されたファイル名があるか探します。
見つかればそのパスを返し、見つからなければ false を返します。
ife($condition, $var1, $var2)
$condition が true なら $var1 を返し、false なら $var2 を返す。

使用しすぎると読みにくいコードになりかねませんが、うまく使用すれば開発効率が上がりそうです。

日本語マニュアル:Chapter 11. Cake のグローバル定数とグローバル関数

阪神岡田監督の黄色い時計が気になる

0

今年のタイガースの不甲斐なさも気になるが、テレビ中継を見ていて岡田監督がアップになったときの黄色い時計も気になる。。。

なんか子供がつけるような黄色いベルトで文字盤に緑色まで見える。かなり派手だ。
うちの相方なんか「阪神グッズじゃないの?」とか言っているし。それは絶対ないだろうな。

で、調べてみたところスイス製の時計でした。
ゾディアックのシードラゴンという商品のようです。
価格も25,000円前後と岡田監督がしている時計としては割りとお手ごろですね。

ゾディアック シードラゴン ZO2241

CakePHP でビューでメール本文を作成する方法

0

前回の記事でメール用のビューを管理する方法を書きましたが、
今回はビューを使用してメール本文を作成する方法です。

前提として

  • メール用のレイアウト名は /app/views/layouts/email.thtml で管理
  • メール本文に使用するビューは /app/views/email/hoge.thtml

だとすると
ob_start();
$this->render(null, 'email', '/path/to/app/views/email/hoge.thtml');
$body = ob_get_clean();
という感じで、$body に本文が入ります。

ちなみにレイアウトを指定しないと default.thtml が使用されHTMLタグが入ってしまいます。

emial.thtml

ここにメールの共通ヘッダなどなど

<?php echo $content_for_layout; ?>

-----------------------------------
ここに署名などなど
-----------------------------------

としておけば、HTMLタグも入らずに署名やヘッダなども読み込めてよいかと思います。

CakePHP でコントローラ名以外の view を指定する方法

3

CakePHP では HogeController::foo() に対するビューは
/app/views/hoge/foo.thtml
になります。

このときに、/app/views/hoge/foo2.thtml というビューを使用したいときは
HogeController::foo() で
$this->render('foo2');と指定すればOKです。

今回違うコントローラ名で管理しているビューを使用できないものかと
/cake/libs/view/view.php
を調べてみたところ
$this->render(null, 'layout', '/path/to/app/views/email/register.thtml');という方法で
/app/views/email/register.thtml
のビューを HogeController::foo() から使用できました。

render の第3引数に絶対パスで使用したいビューを指定すればOKです。
第1引数でビュー名を指定しますが、第3引数が指定されていると無視されます。
また、レイアウトは第2引数でそのまま指定できます。

あまり他のコントローラのビューを使用することはないと思いますが、
例えば、メール送信時に使用するビューを
/app/views/email/
などのディレクトリ名で管理するなどが用途として考えられます。

PEAR の DB から MDB2 への移行メモ

0

やっとMDB2 へ移行したので、その時のメモ。

DBからMDB2への移行は結構いろいろなサイトで書かれていますね。
PHPのテクメモ | pearのDBとMDB2の違い
DB-2-MDB2

これらを参考にさせていただいたのですが、
私はよくプレイスホルダをよく使用しています。

$db->getOne('SELECT * FROM users WHERE id=?", array($id));

MDB2では queryOneメソッドではプレイスホルダが使用できないので(queryRow,queryAllなども同様)移行に手間がかかってしまいます。

少し調べてみると下記のようにすることにより、MDB2 でもプレイスホルダが使用でき、しかも getOne や getAll などのメソッド名もそのまま使用できます。

$db->getOne('SELECT * FROM users WHERE id=?", array($id));
$mdb2->getOne('SELECT * FROM users WHERE id=?", null, array($id));

ただ、

require_once 'MDB2.php';
require_once 'MDB2/Extended.php';

と Extended をロードする必要があります。

瞬間接着剤が指についたときの取り方

1

昨日、瞬間接着剤のフタから液が漏れているのを気がつかずにつかんでしまい、左手の指が3本くっついてしまうというトラブルが発生しました。。。

あ、私ではなく、相方です。

最初はお湯につけて指をもんでみたのですがまったく取れそうにないので、
車を飛ばしてホームセンターで瞬間接着剤のリムーバを購入。
早速指に垂らして様子を見たのですが、まったく取れない。。。

自分自身が情けないって相方はもう泣きそうですよ。

実は車でリムーバを購入に行く前にネットで調べたのですが、
リムーバの他に除光液が書かれていたのを思い出しました。

マニキュアの除光液を指に垂らしてみると、今度は少し指が離れた感じがあると!
それからビンの半分くらいの量を少しづつ垂らしながら30分かけて無事引き離すことができました。

専用リムーバより除光液が効くって。。。がんばってくれリムーバ。
まあ、指はリムーバが留まらずに落ちていってしまうから不利かもしれない。
物とかなら専用リムーバが効くのでしょう。きっと。。。

CakePHP SQL を書いて実行する方法

1

CakePHP ではSQL を書かなくてもだいたいなんでもできるのですが、
ちょこっとSQLを書いて実行したいことがあり調べたメモです。

/cake/libs/model/model_php5.php
を眺めていると findBySqlメソッドがありました。
引数はSQLを文字列で受け取ります。
これだ!っと思ったらただ単に

function findBySql($sql) {
return $this->query($sql);
}

となっている。。。
queryメソッドにSQLを投げればいいんですね。

$sql = "SELECT NOW()";
$foo = $this->HogeModel->query($sql);

CakePHP 実行したSQL を表示する方法

1

開発中に実行されたSQLを表示したいことは多いと思います。

/app/config/core.php
の52行目あたりにある
define('DEBUG', 1);

define('DEBUG', 2);
と、デバッグレベルを2以上にするとブラウザの一番下にSQLが表示されます。
デバッグレベル3にすると「Controller dump」と表示され
そのときのコントローラの print_r と実行されたSQLが表示されます。

デバッグレベル2だと実行されたSQLのみ表示されます。

開発時には重宝しそうです。

Go to Top