画像にリンクをはる簡単な方法 (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ファイルの変更のみで対応可能になります。