新しいブログに引っ越しました

tomotomoSnippetは新しいブログに移動しました
https://develtips.com/

2010-01-29

[CakePHP]ヘルパーを改造する!ただし、コアは書き換えない

CakePHP1.2のお話(最近、この一言を書き忘れていた)

携帯サイトを作っていると既存のHtmlHelperでは不十分だと思い、
思い切って、HtmlHelperを書き変えてやろうという事に。

ただし、コア(LIBS/views/helpers/html.php)は書き換えない方針で!

試しに、コアのHtmlHelperをAPP内にコピーしてみる。
  1. // app/views/helpers/html.php  
  2.   
  3. // メソッド内のどこかで  
  4. echo 'new helper';  

  1. // app/controllers/example_controller.php  
  2.   
  3. // 普通に定義してやる  
  4. var $helpers=array('Html');  


ページにアクセスしてみると、new helperが表示されました。

結論:
ヘルパーを改造する際は
LIBS/views/helpers/someone.php

APP/views/helpers/someone.php
にコピーするだけ。

ってことは、コンポーネントも同じ事が出来るのか?

2010-01-26

EclipseにJStyleプラグインをインストールする

JStyleプラグインって何?
http://mergedoc.sourceforge.jp/index.html#/jstyle.html
Eclipse のエディタで全角空白、半角空白、タブ、改行(LF、CRLF、CR)を表示可能にするプラグインです。
他に太字を通常文字と同じ幅で表示するオプションがあります。


コードインデントがタブなのか、半角スペースなのか、ぱっと見で分からなくて不便だったのでインストールしました。

JStyleからダウンロードしたファイルを、/eclipseインストールフォルダ/plugins/にコピーして、-cleanオプションを付けてeclipseを起動すれば、インストール完了。
Windowsならコマンドプロンプトから起動すればOK!
  1. C:\(eclipseインストールフォルダ)>eclipse.exe -clean  


JStyleの設定は、[ウィンドウ]->[設定]->[一般]->[JStyle]から変更できます。

2010-01-22

[CakePHP]モバイルヘルパーを改善する

CakePHPで携帯サイトを制作するには、文字コードの変換、カタカナの変換が必要です。
それを実行するためのヘルパーは既に
コントローラの afterFilter で文字コードを変換する方法で紹介されています。

もう一つ改良して、ビューの行頭のインデントを削除したいと思います。

  1. class MobileHelper extends Helper {  
  2.     function afterRender() {  
  3.         $out = ob_get_clean();  
  4.         // 次の一行を追加  
  5.         $out = preg_replace('/\n[\s]+/'"\n"$out);  
  6.         $out = mb_convert_kana($out"rak""UTF-8");  
  7.         $out = mb_convert_encoding($out"SJIS""UTF-8");  
  8.         ob_start();  
  9.         echo $out;  
  10.     }  
  11. }  

preg_replace('/\n[\s]+/', "\n", $out)で、改行した後のインデント(タブ、半角スペース、改行)を改行コードに置換しています。
置き換え後の文字は必ず、”(ダブルクオート)で囲ってください。
’(シングルクオート)だとちゃんと改行コードになってくれません。

これで、十数バイトの容量節約になると思います。

2010-01-18

[CakePHP]Javascriptヘルパーを拡張したい

CakePHP1.2で外部Javascriptファイルを読み込むのに、Javascriptヘルパーを使って出力しますが、元のヘルパーだと、charset属性を指定できません。


View:
  1. $javascript->link('http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX', false);  


Html:
  1. <script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX"></script>  


という事で、さっさとヘルパーを拡張することにしました。
CakePHP Formヘルパの拡張 その1日本語日付選択プルダウンを参考にすると、継承元のクラス名は必ずしもAppHelperでなくて良いようだ。

これなら必要な機能だけ拡張、または上書きすれば良さそう。
という事で、早速Javascriptヘルパーのlinkメソッドをコピーして、ちょちょっと書きなおしたコードがコレ。
  1. // APP/views/helpers/ex_javascript.php  
  2.   
  3. class ExJavascriptHelper extends JavascriptHelper  
  4. {  
  5.     function link($url$inline = true, $attr = array())  
  6.     {  
  7.         // (省略)  
  8.   
  9.         $htmlattributes = '';  
  10.         foreach ($attr as $k => $v) {  
  11.             $htmlattributes .= ' '.$k.'="'.$v.'"';  
  12.         }  
  13.   
  14.         //$out = $this->output(sprintf($this->tags['javascriptlink'], $url));  
  15.         $out = $this->output(sprintf('<script type="text/javascript" src="%s"%s></script>'$url$htmlattributes));  
  16.   
  17.         // (省略)  
  18.     }  
  19. }  

第3引数にHTML属性を指定できるようにしました。


これでよし!と思ったら一つ問題が・・・
コントローラで、元のJavascriptヘルパーも併せてセットしないと動かないことが発覚。
  1. var $helpers = array('Javascript','ExJavascript');  


継承してるのに2つともインスタンス化しちゃうのはなんだかなぁ
ということで、先ほどのコードをちょっと書き換えます。

  1. // APP/views/helpers/ex_javascript.php  
  2.   
  3. // まずは元のJavascriptヘルパーファイルを読み込む  
  4. require_once CAKE.'libs'.DS.'view'.DS.'helpers'.DS.'javascript.php';  
  5.   
  6. class ExJavascriptHelper extends JavascriptHelper  
  7. {  
  8.     function link($url$inline = true, $attr = array())  
  9.     {  
  10.         // (省略)  
  11.   
  12.         $htmlattributes = '';  
  13.         foreach ($attr as $k => $v) {  
  14.             $htmlattributes .= ' '.$k.'="'.$v.'"';  
  15.         }  
  16.   
  17.         #$out = $this->output(sprintf($this->tags['javascriptlink'], $url));  
  18.         $out = $this->output(sprintf('<script type="text/javascript" src="%s"%s></script>'$url$htmlattributes));  
  19.   
  20.         // (省略)  
  21.     }  
  22. }  


Controller:
  1. var $helpers = array('ExJavascript');  


View:
  1. $exJavascript->link('http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX', false, array('charset'=>'UTF-8'));  


Html:
  1. <script type="text/javascript" src="http://maps.google.com/maps?file=api&v=2&hl=ja&sensor=false&key=XXXX" charset="UTF-8"></script>  


期待通りの動きが実現できました。

2010-01-15

[CakePHP]アソシエーションを設定したモデルのデータも削除する

Model::del()でアソシエーションを設定したモデルのデータの削除の仕方をド忘れしたのでメモ。

用意するモデル:
*Company model 企業データ
*User model 社員データ
*Post model 投稿データ


  1. // company.php  
  2.   
  3. class Company extends AppModel  
  4. {  
  5.     var hasMany = array(  
  6.         'User' => array'dependent' => true ),  
  7.         'Post' => array'dependent' => true )  
  8.     );  
  9. }  


アソシエーションを設定するときにdependentTRUEに設定してやれば、Company::del($id)を実行すれば、アソシエーション相手も削除されます。
一時アソシエーションを設定するときも同様なり。

  1. // companies_controller.php  
  2.   
  3. class Companies extends AppController  
  4. {  
  5.     function del($id) {  
  6.         $this->Company->bindModel(  
  7.             array(  
  8.             'hasMany' => array(  
  9.                 'User' => array'dependent' => true ),  
  10.                 'Post' => array'dependent' => true )  
  11.             )),  
  12.             false  
  13.         );  
  14.   
  15.         $this->Company->del($id);  
  16.     }  
  17. }  

人気のエントリー