CakePHP1.2でキャッシュが消えない

9月 9th, 2009 admin

CakePHP の自動キャッシュクリアが効くのは、コントローラ名=モデル名のときだけ : akiyan.com
↑という時用 behaviorsで指定すれば多少ましかもしれないと思った。

たとえばPostモデルってのがあるんだけど、Postモデルにsave()かdelete()があったときにはトップページのtopっていうアクションのビューも削除して欲しいって時には。

post.php

PHP:
  1. var $actsAs = array('ClearCache'=>array('names'=>array('top')));

として

以下のコードをclear_cache.phpとかで/models/behaviorsに保存しておけば

PHP:
  1. <?php
  2. /*
  3. *  キャッシュクリア
  4. */
  5. class ClearCacheBehavior extends ModelBehavior {
  6.  
  7.     var $names = array();
  8.  
  9.     function setup(&$model, $config = array()){
  10.         if(!empty($config['names']))
  11.             $this->names = $config['names'];
  12.     }
  13.  
  14.     function afterSave($created){
  15.         $this->_clear();
  16.     }
  17.  
  18.     function afterDelete(){
  19.         $this->_clear();
  20.     }
  21.  
  22.     function _clear(){
  23.         foreach($this->names as $name){
  24.             clearCache($name);
  25.         }
  26.     }
  27.  
  28. }
  29. ?>

Postモデルが更新されるたびにtopのビューキャッシュもクリアされて
いいと思います

まとめ

あと、CakePHPのビューのキャッシュはアクション名ベース(?)なので?id=99みたいなGETパラメータには対応していないとかもあるので、いっそビューのキャッシュはあきらめるというのも手です。

CakePHP1.2 Behaviorでモデルのメソッドキャッシュを行う : エクスギア Blog

CakePHP1.2で使えるテンプレート

2月 3rd, 2009 admin

CakePHPのサイトはカッコいいのに、CakePHPにデフォルトで入っているテンプレートはかっこ悪い。
もっと管理画面用のテンプレートってないのかなと思ったので、まず自分が一個公開します。
もとはフリーのテンプレートですがフォームやnotice,errorの部分などをCake風にアレンジしてあります。

見た目

cakephp001

cakephp002

ファイル

default.ctpとstyle.cssが入っているので、適切な場所に配置してください。
minimalistic.zip(9KB)
ライセンスはGPLです。

参考サイト

Minimalistic Design

CakePHP1.1のページングでGETパラメータを正しく引き継ぐ

9月 27th, 2008 admin

以前にCakePHP1.1用のPaginationコンポーネントを紹介したんですが、getパラメータに配列を使うと正しくリンクを作ってくれなかったのでそれの補足。

要するにhttp://example.com/?data[Search][name]=1とかって感じの配列がGETパラメータにある場合に、このパラメータを引き継いでくれない(data=Arrayとかってなる)バグを修正した。

/views/helpers/pagination.phpの_generateUrlってメソッドを修正する。
http_build_queryっていう関数を使ったんですが、これは配列もしくはオブジェクトからURL エンコードされたクエリ文字列を生成する関数で、なんと多次元配列にも対応している。さすがPHP!(オブジェクトに対応してるほうが変か)

PHP:
  1. function _generateUrl ($page=NULL,$pageDetails=NULL)
  2.     {
  3.         $pageDetails = $pageDetails?$pageDetails:$this->_pageDetails;
  4.         $getParams = $this->getParams; // Import any other pre-existing get parameters
  5.         if ($this->_pageDetails['paramStyle']=="pretty")
  6.         {
  7.             $pageParams=$pageDetails['importParams'];
  8.         }
  9.         $pageParams['show'] = $pageDetails['show'];
  10.         $pageParams['sortBy'] = $pageDetails['sortBy'];
  11.         $pageParams['direction'] = $pageDetails['direction'];
  12.         $pageParams['page'] = $page?$page:$pageDetails['page'];
  13.         if (isset($pageDetails['sortByClass']))
  14.         {
  15.             $pageParams['sortByClass'] = $pageDetails['sortByClass'];
  16.         }
  17.         $getString = Array();
  18.         $prettyString = Array();
  19.         if ($pageDetails['paramStyle']=="get")
  20.         {
  21.             $getParams = am($getParams,$pageParams);
  22.         }
  23.         else
  24.         {
  25.             foreach($pageParams as $key => $value)
  26.             {
  27.                 if (isset($pageDetails['Defaults'][$key]))
  28.                 {
  29.                     if (up($pageDetails['Defaults'][$key])<>up($value))
  30.                     {
  31.                         $prettyString[] = "$key{$pageDetails['paramSeperator']}$value";
  32.                     }
  33.                 }
  34.                 else
  35.                 {
  36.                     $prettyString[] = "$key{$pageDetails['paramSeperator']}$value";
  37.                 }
  38.             }
  39.         }
  40.  
  41.         $url = $this->url;
  42.         if ($prettyString)
  43.         {
  44.             $prettyString = implode ("/", $prettyString);
  45.             $url .= $prettyString;
  46.         }
  47.         if ($getParams)
  48.         {
  49.             $url .= "?". http_build_query($getParams);
  50.         }
  51.         return $url;
  52.     }

CakePHP1.1でキャリアごとの絵文字を表示

9月 5th, 2008 admin

すでにいろいろな方法があるようです。
CakePHPで3キャリア携帯の絵文字を表示する :: Webプログラマー+WebデザイナーなZARU日記(DB使用)
ひでぶろぐ CAKEPHP絵文字入力・出力ヘルパー(DB使用)
EmojiHelper - キャリアを意識せずに絵文字を出力できるCakePHPのHelperクラス - 芋ではない日記(JSON使用)

僕はDBを使うのが嫌だったのとJSONは使ったことがなかったのでMobilePictogramConverterという絵文字ライブラリがあるのでそれを使いました。

特徴
* DoCoMo, au, SoftBankの絵文字を相互変換可能
* 端末からサーバーへ送信された絵文字の変換が可能(掲示板など)
* SJIS/UTF-8に対応
* PCでの絵文字表示が可能(画像)
* 絵文字画像は全て透過GIFでアニメーションに対応
* DoCoMo隠し絵文字一部対応
* バイナリコード, Web入力コード, imgタグからの変換が可能
* 絵文字の削除が可能
* 文字列に含まれる絵文字の数を検出
* UserAgentからキャリアを判別し、キャリアに合った絵文字に自動変換が可能

すごいです。作った人。

手順

(1)MobilePictogramConverterを取得して解凍
(2)MobilePictogramConverterを/app/vendorsにいれる
(3)MobilePictogramConverterのimgをWEBROOT_DIR/img/m/にいれる
(4)/app/app_controller.phpを編集

PHP:
  1. <?php
  2. vendor('MobilePictogramConverter/MobilePictogramConverter');
  3.  
  4. class AppController extends Controller {
  5.  
  6.         //app_controllerのいろいろは省略
  7.  
  8.         function beforeFilter() {
  9.             ob_start();
  10.             parent::beforeFilter();
  11.         }
  12.  
  13.         function afterFilter() {
  14.             parent::afterFilter();
  15.  
  16.             // バッファを取得して、出力バッファをクリア
  17.             $out = ob_get_clean();
  18.  
  19.             if ((isset($this->params["webservices"]) && $this->params["webservices"] == "Mobile")) {
  20.                 $out = mb_convert_kana($out,"k","UTF-8");
  21.                 $mpc =& MobilePictogramConverter::factory($out, MPC_FROM_EZWEB, MPC_FROM_CHARSET_UTF8, MPC_FROM_OPTION_WEB);
  22.                 $mpc->setImagePath(WEBROOT_DIR . 'img/m/');
  23.                 $out = $mpc->autoConvert();
  24.             }
  25.  
  26.             echo $out;
  27.         }
  28. }
  29. ?>

バッファをためて一括で変換しています。絵文字と一緒に全角カナも半角カナに直してしまいます。
$this->params["webservices"]で判別しているのはShin x blogさんの「CakePHP 携帯用ビューを表示する」を使用して携帯のビューを切り替えているからです。

これで携帯のビュー内で>img localsrc="180"/<とかってやると絵文字が表示されます。

デザイナーのためのCakePHP1.1メモ

5月 18th, 2008 admin

デザイナーのためのCakePHP入門」というエントリを書いていたのですが、さしあたって1.1の説明が必要になったのでデザイナーさん向けのメモ。主にビューでのHTMLヘルパーの説明になります。

どこを編集すればいいのか?

/app/views

テンプレートファイルがあります

/app/webroot

Stylesheet、Javascript、画像、そのほかのファイルなどはこちらにおきます。css,js,imgというディレクトリがあらかじめ用意されています。大変申し訳ないのですがディレクトリ名はこのまま使ってください。(変えたい場合はプログラマに相談してください)

テンプレートの構造

ここからは/app/views以下の話になります。
まずレイアウトが/layout以下にあり、layoutファイルの中の

<?php echo $content_for_layout ?>

という記述のところに中身が差し込まれます。

<?php echo $this->renderElement('なんとか'); ?>

という記述を見つけたら、それは「/views/element/なんとか」ってファイルを取り込んでいますので、そちらを見てください(layoutファイル以外でも使われます)

各種タグなど

各種外部ファイルの読み込み

PHP:
  1. <?php echo $html->css('import'); ?> //スタイルシートを読み込む
  2. <?php echo $javascript->link('prototype');?> //Javascriptを読み込む

拡張子は省略できます。それぞれ/app/webroot/css,/app/webroot/jsに入れておいてください。

画像を表示

PHP:
  1. <?php echo $html->image("logo.gif") ?>

これで/app/webroot/imgにあるlogo.gifを表示します。

PHP:
  1. $html->image('logo.gif',array("id"=>"logo","alt"=>"会社ロゴ"));

第2引数にハッシュを渡してやることでimgタグにid="logo",alt="会社ロゴ"が追加されます。

リンク

PHP:
  1. <?php echo $html->link("トップ" , "/top"); ?>

とやると、/topへのトップというリンクを表示します。

PHP:
  1. <?php echo $html->link("トップ" , "/top",array("target"=>"_blank")); ?>

このタグもハッシュで属性を追加できます。この場合はtarget="_blank"が追加されます。

画像でのリンク

PHP:
  1. <?php echo $html->link($html->image("/logo.gif",array("id"=>"logo")),"/top",false,false,false)?>

画像でのリンクは画像とリンクのタグを組み合わせるとできます。後半にfalseが3つも並んでいて無駄に見えますがこれは必要なので書くようにしてください。

まとめ

この他にもフォームを書くときなども専用のコードを書く必要があります。面倒くさいですね・・・