cakephperの日記(CakePHP, Laravel, PHP) Twitter


継続的WebセキュリティテストサービスVAddyを始めました!

2010-12-01

画像にリンクをはる簡単な方法 (CakePHP Advent Calendar 1日目)

今年、CakePHP Advent Calendarをやるの?と日本語と英語でつぶやいたところ、特に反応がなかったので主催してみることにしました。

詳しくは下記のリンクを参照。興味がある人はお気軽に参加下さい。

http://cakephp.jp/modules/newbb/viewtopic.php?topic_id=2510&forum=16&post_id=6333

こんなネタ誰でも知ってるだろ?というものも、他の人の興味を引くものが意外とあります。ですので躊躇せず空気を読まずとりあえず参加してみてください。

イベントなので楽しみましょう! ネタが無くても、どの日に書くか宣言してしまえば、何かしら出てくるから大丈夫。




CakePHP1.3を利用してます。この方法は1.2でも動くはず。

画像表示はHTMLヘルパーのimageメソッドを使いますが、それにリンクをつけたい場合(aタグで囲みたい場合)の話。

1.2の最初の頃はよくimageヘルパーの出力をhtml::link()の第1引数に渡すということをやってました、たぶん古いバージョンの1.2はこの方法しかなかった気がします。

この場合はlinkの表示箇所がエスケープされるため、linkメソッドの第5引数でエスケープfalseをセットする必要があります。

参考: http://blog.livedoor.jp/k1LoW/archives/54654684.html

<?php echo $html->link($html->image("test.png"), '/posts/index',null,null,false);?>

最近の1.2と1.3では下記の方法でちょっとだけ簡単にできます。

imageメソッドの第2引数オプション配列urlキーを指定するだけです。

<?php echo $this->Html->image("test.png", array('url' => '/posts/index'));?>

参考: http://api.cakephp.org/class/html-helper#method-HtmlHelperimage


将来、URL構造の変化に柔軟に対応できるように、urlの値は下記のようにしておいたほうが幸せになれます。

<?php echo $this->Html->image("test.png", 
           array('url' => array('controller' => 'posts', 'action' => 'index'))
           );
?>

例えば、/posts/indexを/inquiry/indexにしたくなったらroutesファイルの変更のみで対応可能になります。

jj 2010/12/02 12:28 1.2でもできるよ
マニュアルには書いてなかったと思うけど

kanonjikanonji 2010/12/09 20:36 > 例えば、/posts/indexを/inquiry/indexにしたくなったらroutesファイルの変更のみで対応可能になります。

これって、コントローラーそのものやHtmlHelper->image()を使った箇所を買えずに、routesだけで出来るってことですか?

cakephpercakephper 2010/12/09 21:39 > kanonjiさん
そうです! そこがRoutesの良いところ。見た目のURLと実際のコントローラ名やアクション名を分離して管理できます。

> jさん
Thanks!

kanonjikanonji 2010/12/11 19:33 やってみました。Router::connect()の設定って一方行だと勘違いしてました。
ちゃんと書けばViewを書き換えなくても良いんですね。
どう書くかがちょっと難しいというか、ちゃんとした仕組を頭の中に入れておきたいですね。

Router::connect('/inquiry', array('controller' => 'posts'));
これだと array('url' => array('controller' => 'posts', 'action' => 'index')) は変換されたけど、array('url' => array('controller' => 'posts', 'action' => 'add')) は変換されませんでした。

Router::connect('/inquiry/:action', array('controller' => 'posts', 'action'=>':action'));
たぶんこのケースだとこうでしょうか。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証