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

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

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>  


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

0 件のコメント:

コメントを投稿

人気のエントリー