読者です 読者をやめる 読者になる 読者になる

letsspeak's diary

世界を大いに盛り上げるためのletsspeakの日記。

初心者がFuelPHPで動的リンクを張ってみた

前回のFuelPHPの記事でスタートアップは完了したのですが、FuelPHP+mod_rewriteでのURI指定は把握したけれど、リンクをうまく貼れない!というところで少し詰まってしまいましたので、記事にしておきます。

f:id:letsspeak:20120312081541p:plain

 動的なリンクアンカーの生成

今回はbootstrapを使用しつつ、ナビゲーションバーをheaderとして共通で読み込んでいます。ブランドロゴ部分では最初、次のようにリンクアンカーを貼っていました。

<a class="brand" href="admin">charag Admin</a>

一見うまく動作するようにも思えるのですが、相対リンク指定となってしまう為、下層であるroot/admin/storydb/からロゴを選択すると、localhost/~eveningsun/charag/public/admin/storydb/adminに移動しようとしてしまい、404エラーが発生します。

FuelPHPでは動的なリンク生成を行ってくれるHtml::anchorを使用し、下記のように記述するのが正解のようです。

<?php echo Html::anchor('admin', 'charag Admin', array('class' => 'brand')); ?>

 

階層構造の定義

Html::anchorを使用すると、並列なcontroller構造に対しても、構成図のような階層構造を定義することができます。

/fuel/app/config/routes.phpの内容を次のように編集します。

return array(
'_root_'  => 'admin/index',  // The default route
'_404_'   => 'welcome/404',    // The main 404 route

'admin/storydb' => 'storydb/index',
'admin/storydb/add' => 'storydb/add', 
);

このように左辺に名前、右辺に実際の指定位置を定義することでHtml::anchorを次のように使用できました。

<?php echo Html::anchor('admin/storydb', 'storydb'); ?>
<?php echo Html::anchor('admin/storydb/add', 'addstory'); ?>

これで擬似的な階層構造(つまりエイリアス?)をどんどん定義することができますね。変数を渡すような場合は右辺でさらにarrayを使用するようですが、今回は解説を省略します。

 

mod_rewriteを設定済みの場合

リンク自体は問題なく動作するようになりましたが、既にmod_rewriteを設定しているにもかかわらず、初期設定のままだと、上記で生成されたリンクにpublic/index.php/adminという風にindex.phpが含まれてしまいます。

これを解決するために /fuel/app/config/config.phpを編集します。

/**
* index_file - The name of the main bootstrap file.
*
* Set this to false or remove if you using mod_rewrite.
*/
'index_file'  => false,

コメントにもありますが、mod_rewriteを設定した人は、falseを定義するか、設定自体を削除すれば良いようです。

 

以上でFuelPHPの基本的な動的リンク生成については終了です。これからDBへデータを追加するためのFormにも挑戦していく予定のため、また問題や難しい箇所があれば記事にしていこうと思います!