Posts tagged PHP

CakePHP キャッシュファイルの使用

1

CakePHP でキャッシュを使用するときに便利なグローバル関数があります。

cache($path, $data, $expires, $target)
$data のデータをキャッシュします。
キャッシュする場所は
$target==”cache” なら /app/tmp/cache/ + $path
$target==”public” なら /webroot/ + $path
になります。$target を指定しなければ $target==”cache” です。
$expires はキャッシュの有効期間です。
内部で
$expires = strtotime($expires, time());
が行われるので、strtotime の Data input formats 形式に準拠したものでなければいけません。
デフォルトは $expires = ‘+1 day’ です。
clearCache($params, $type, $ext)
$paramsが文字列でキャッシュディレクトリかファイル名にマッチする場合はキャッシュから削除されます。
$params が配列の場合は配列内の文字列全てに対して上記の処理が行われます。
対象のディレクトリは $type で指定します。
$type のデフォルトは ‘views’ です。
対象ディレクトリは /app/tmp/cache/ + $type になります。
cache 関数で ‘public’ を指定した場合のクリアはこの関数ではできないようです。

結構簡単にキャッシュ処理ができそうです。

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 のグローバル定数とグローバル関数

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 をロードする必要があります。

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のみ表示されます。

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

CakePHP 入力フォームで確認画面を表示する方法

3

フォームを入力後、すぐに保存ではなく一度確認画面を表示させたい場合のやり方。

こちらに詳しいやり方が書いてあります。
http://www12.atwiki.jp/nezox/pages/6.html

ポイントは

  • 入力フォームで
    <input type="hidden" name="mode" value="confirm">

    とする。

  • コントローラの add アクションでバリデーションチェック後に
     if (@$_POST["mode"]=="confirm") {
        // 確認画面を表示する
        $this->render('confirm');
    } else {
        // 保存処理
        if ($this->User->save($this->data)) {
            $this->flash('Your post has been saved.', '/users');
        }
    }
  • 確認画面の view を confirm.thtml を作成
     <h1>確認画面</h1>
    <form action="<?php echo $html->url('/users/add'); ?>" method="post">
    ログインID:
    <?php echo $html->tagValue('Users/login_id'); ?
    <?php echo $html->hidden('Users/login_id', array('value'=>$html->tagValue('Users/login_id'))); ?>
    <input type="button" value="戻る" onclick="history.back();">
    <input type="submit" value="新規登録">
    </form>

CakePHP で Smarty を使用するメモ

3

Smarty を CakePHP で使用する方法を調べたメモ

Smarty の用意

Smarty ディレクトリを/vendors ディレクトリへコピー

/vendors/smarty/Smarty.class.php

のようになる。

Smarty が使用するディレクトリを作成

/app/tmp/smarty/cache/
/app/tmp/smarty/compile/

Smarty 用の View クラスの準備

レンダリングを任せる Smarty View Class を設定します。
Smarty View Class をダウンロードして smarty.php とリネームして

/app/views/

に配置する。

smarty という名前のサブディレクトリを使用しないなら
$this->subDir = 'smarty'.DS;
をコメントアウトする。
また、
$this->Smarty->assign_by_ref('view', $this);

$this->Smarty->assign_by_ref('this', $this);
に変更する。
この変更はテンプレートの中で $this を .thtml と同じように使用したい場合に必要。

AppController の設定

/app/app_controller.php

を作成

class Appcontroller extends Controller{
    var $view = "Smarty";
}

実際の使用

view に .tpl があれば Smarty テンプレートとして処理を行い、なければデフォルトの .thtml を表示するようになる。

.tpl の中では .thtml で使用できるヘルパーも使用できる。
.thtml の「<?php echo」を「{」、「;?>」を「}」にすればほぼそのまま利用できる。

ただ、.thtml で HTMLヘルパーを使用している場合

{$html->input('Post/name', array('size'=>'30'))}

のままでは、array(…) でエラーになる。

これを修正するには、Smarty のプラグインを使用して解決する。
プラグインをダウンロードして function.assign_assoc.php にリネームして

/vendors/samrty/libs/plugins/

に配置する。

テンプレートの先頭で

{assign_assoc var='ArrayName' value='size=>30'}

などとして

{$html->input('Post/name', $ArrayName)}

とすればOK.

ただ結構最後のやつが面倒かも。。。

CakePHP テンプレートファイルの拡張子を変更する方法

1

CakePHP のテンプレートファイルはデフォルトでは拡張子が .thtml です。
これを変更するには、コントローラのメンバ変数 $ext に変更したい拡張子を設定する。例えば .html にする場合は

var $ext = '.html';
Go to Top