Posts tagged age

Smarty のマルチバイト対応

0

マルチバイトの文字列を指定行数で強制改行する仕様があって、wordwrap 関数をマルチバイト化してさらに Smarty のプラグインを作ろうと思っていたらありました。

Smarty のマルチバイト対応
Artisan Version管理システム

マルチバイト処理に弱いとされる、Smartyをマルチバイト対応とし、よりアプリケーション内で役立てることができるよう、オリジナルの関数や、関数に改造を行っています。

7月に読んだ本

0

7月に読んだ本のメモ
一番のお勧めは一番下に書いた「ビーサン屋げんべい物語」。
葉山にあるビーチサンダル専門店「げんべい」さんが出した本です。
たかがビーサンと侮れませんね。私も1年中愛用させていただいております。

Lifehacker インターネット時代のワークスタイル改善術!

Lifehacker インターネット時代のワークスタイル改善術!

2ちゃんねるはなぜ潰れないのか? (扶桑社新書 14)

2ちゃんねるはなぜ潰れないのか? (扶桑社新書 14)

「1日30分」を続けなさい!人生勝利の勉強法55

「1日30分」を続けなさい!人生勝利の勉強法55

PHPによるデザインパターン入門

PHPによるデザインパターン入門

WordPress標準ガイドブック―導入&基本操作からフルチューンまで

WordPress標準ガイドブック―導入&基本操作からフルチューンまで

モバゲータウンがすごい理由 ~オジサンにはわからない、ケータイ・コンテンツ成功の秘けつ~

モバゲータウンがすごい理由 ~オジサンにはわからない、ケータイ・コンテンツ成功の秘けつ~

WEB+DB PRESS 総集編 [Vol.1~36]

WEB+DB PRESS 総集編 [Vol.1~36]

レバレッジ・シンキング 無限大の成果を生み出す4つの自己投資術

レバレッジ・シンキング 無限大の成果を生み出す4つの自己投資術

ネットで人生、変わりましたか?

ネットで人生、変わりましたか?

iPhone 衝撃のビジネスモデル

iPhone 衝撃のビジネスモデル

ビーサン屋げんべい物語―葉山の片隅から世界を狙うオンリーワン商店


PEAR::Pager ページ番号を PATH_INFO で渡す

3

ページング処理を行ってくれる PEAR::Pager 、かなり便利です。
通常は
index.php?pageID=2
のようにしてページ番号を渡すのですがこれをPATH_INFO で渡すには下記のようにオプションパラメータを指定します。

$params = array(
...
'path' => 'http://localhost/foo/',
'fileName' => '%d',
'append' => false,
cuurentPage => 現在のページ
);

ポイント

append = false なら fileName の %d にpageID を埋め込む。
currentPage を指定しないと Pager が現在のページが分からない。

fileName

'path' => 'http://localhost/',
'fileName' => 'foo/%d'

なども可能。append=false なら fileName の %d にpageID を埋め込むということ。

現在のページを取得するには

$path_info = explode("/", $_SERVER['PATH_INFO']);
if (isset($path_info[1]) {
    $currentPage = $path_info[1];
} else {
    $currentPage = 1;
}

PATH_INFO が使用できるか

サーバによっては PATH_INFO が使用できない。
使用できるかは $_SERVER["PATH_INFO"] が存在するかどうか。
ただし、http://localhost/index.php では $_SERVER["PATH_INFO"] には値はセットされないので、 http://localhost/index.php/1 などのようにして $_SERVER["PATH_INFO"] が設定されているか調べる。

PEAR::Page マニュアル

CakePHP flash メソッドでレイアウトを指定する

2

コントローラ毎にレイアウトを変えていていると flash メソッドは使えないなあと思っていたのですが、下記のようにすることによりレイアウトをコントローラで指定できますね。

/app/app_controller.php に下記の flash メソッドを追加

function flash($message, $url, $pause = 1) {
    $this->autoRender = false;
    $this->autoLayout = false;
    $this->set('url', $this->base . $url);
    $this->set('message', $message);
    $this->set('pause', $pause);
    $this->set('page_title', $message);

    if (file_exists(VIEWS . 'layouts' . DS . $this->layout.'_flash.thtml')) {
        $flash = VIEWS . 'layouts' . DS . $this->layout.'_flash.thtml';
    } elseif ($flash = fileExistsInPath(LIBS . 'view' . DS . 'templates' . DS . "layouts" . DS . 'flash.thtml')) {
    }
    $this->render(null, false, $flash);
}

これで、
/app/views/layouts/指定したレイアウト名_flash.thtml
というレイアウトファイルがあれば、それを使用して
なければ、デフォルトの flash.thtml を使用します。

やっていることはすごく単純でコントローラクラスの flash メソッドをオーバライドして、使用するレイアウトファイルを選択するところで

if (file_exists(VIEWS . 'layouts' . DS . 'flash.thtml')) {
    $flash = VIEWS . 'layouts' . DS . 'flash.thtml';
}

となっていたところを

if (file_exists(VIEWS . 'layouts' . DS . $this->layout.'_flash.thtml')) {
    $flash = VIEWS . 'layouts' . DS . $this->layout.'_flash.thtml';
}

に変更しただけです。

他にいい方法があれば教えてください。

CakePHP コントローラのflash メソッド

2

データを更新した後などに「更新しました」などのメッセージを簡単に出せるのがコントローラのflash メソッド。
コントローラで、
$this->flash('更新しました', '/users');
などとすることにより、メッセージを簡単に出せる。
2つ目の引数は飛び先URL を指定できる。

ちなみにこの flash メソッドは下記のようになっています。
/cake/libs/controller/controller.php

function flash($message, $url, $pause = 1) {
    $this->autoRender = false;
    $this->autoLayout = false;
    $this->set('url', $this->base . $url);
    $this->set('message', $message);
    $this->set('pause', $pause);
    $this->set('page_title', $message);

    if (file_exists(VIEWS . 'layouts' . DS . 'flash.thtml')) {
        $flash = VIEWS . 'layouts' . DS . 'flash.thtml';
    } elseif ($flash = fileExistsInPath(LIBS . 'view' . DS . 'templates' . DS . "layouts" . DS . 'flash.thtml')) {
    }
    $this->render(null, false, $flash);
}

上のソースを見ると分かるように、この flash メソッドのレイアウトは
$layout = "hoge";
とか指定しても指定したレイアウトでは表示されません。

flash メソッドでは flash.thtml というレイアウトを使用することしかできません。
/app/views/layouts/flash.thtml
を探してなければ、
/cake/libs/view/templates/layouts/flash.thtml
のデフォルトのレイアウトを使用します。

また、デフォルトの flash.thtml は

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><?php echo $page_title?></title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php if(Configure::read() == 0) { ?>
<meta http-equiv="Refresh" content="<?php echo $pause?>;url=<?php echo $url?>"/>
<?php } ?>
<style><!--
P { text-align:center; font:bold 1.1em sans-serif }
A { color:#444; text-decoration:none }
A:HOVER { text-decoration: underline; color:#44E }
--></style>
</head>
<body>
<p><a href="<?php echo $url?>"><?php echo $message?></a></p>
</body>
</html>

のようになっていて、
DEBUG モードで DEBUG = 0 を指定していると meta タグを利用して勝手に画面遷移します。DEBUG モードが 0 以外の場合はメッセージをクリックすると指定したURLに画面遷移します。

非常にシンプルなレイアウトですので、使用するときは、
/app/views/layouts/flash.thtml
にコピーしてカスタマイズした方がよいでしょう。

6月に読んだ本

0

6月に読んだ本のメモ

デジタル・ワークスタイル―小さなことから革命を起こす仕事術

デジタル・ワークスタイル―小さなことから革命を起こす仕事術

会社勤めでお金持ちになる人の考え方・投資のやり方―確実に儲けを生み出し続けることが、お金持ちへの第一歩

会社勤めでお金持ちになる人の考え方・投資のやり方―確実に儲けを生み出し続けることが、お金持ちへの第一歩

フューチャリスト宣言

フューチャリスト宣言

レバレッジ時間術―ノーリスク・ハイリターンの成功原則

レバレッジ時間術―ノーリスク・ハイリターンの成功原則

挫折なしで英会話ができる「英語耳」9つの法則

挫折なしで英会話ができる「英語耳」9つの法則

即戦力の磨き方

即戦力の磨き方

「伝説の社員」になれ! 成功する5%になる秘密とセオリー

「伝説の社員」になれ! 成功する5%になる秘密とセオリー

無理なく続けられる 年収10倍アップ勉強法

無理なく続けられる 年収10倍アップ勉強法

ウェブ仮想社会「セカンドライフ」 ネットビジネスの新大陸

ウェブ仮想社会「セカンドライフ」 ネットビジネスの新大陸

PHP で大きいJPEGやPNGファイルをPHPで扱うときのメモリエラー回避方法

0

GD でメモリエラー
に書かれているように GD で JPEG や PNG の大きな画像を扱うときに
Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 11648 bytes) in ...というようなエラーが出てしまいます。

上のエラーがは私が EOS5D で撮影した 2912×4368とかなり大きな画像です。

大きさで制限するのも一つの方法ですが、どうしても大きな画像を取り込みリサイズしなければいけないときなどのために以下の方法もあります。

PHP: imagecreatefromjpeg – Manual
PHP に割り当てられているメモリの範囲で必要なメモリを計算して
ini_set('memory_limit', 'xxM')と設定しれくれます。

function setMemoryForImage( $filename ){
    $imageInfo = getimagesize($filename);
    $MB = 1048576;  // number of bytes in 1M
    $K64 = 65536;    // number of bytes in 64K
    $TWEAKFACTOR = 1.5;  // Or whatever works for you
    $memoryNeeded = round( ( $imageInfo[0] * $imageInfo[1]
                                           * $imageInfo['bits']
                                           * $imageInfo['channels'] / 8
                             + $K64
                           ) * $TWEAKFACTOR
                         );
    //ini_get('memory_limit') only works if compiled with "--enable-memory-limit" also
    //Default memory limit is 8MB so well stick with that.
    //To find out what yours is, view your php.ini file.
    $memoryLimit = 8 * $MB;
    if (function_exists('memory_get_usage') &&
        memory_get_usage() + $memoryNeeded > $memoryLimit)
    {
        $newLimit = $memoryLimitMB + ceil( ( memory_get_usage()
                                            + $memoryNeeded
                                            - $memoryLimit
                                            ) / $MB
                                        );
        ini_set( 'memory_limit', $newLimit . 'M' );
        return true;
    }else
        return false;
    }
}

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 入力フォームで確認画面を表示する方法

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 でレイアウトを変更する

1

レイアウトを変更するには

/app/views/layouts/default.thtml

を変更すればOK。

コントローラ毎などにレイアウトを変更したいときは

/app/views/layouts/hoge.thtml

などとレイアウトを作成して、コントローラで

var $layout = "hoge.thtml";

とレイアウトを指定する。

このレイアウトの中でタイトルタグを

<title><?php echo $title_for_layout?></title>

としていれば、

$this->pageTitle('このページのタイトル');

とコントローラで指定すれば、アクション毎にタイトルを変更できる。

Go to Top