トップページ > ホームページ作成 > 動的リンク
PHPを利用した動的リンクリストの作成方法です。ここでは、CSVファイルのリンク用データを配列に読み込んでからSmartyでデザインして表示しました。
動的リンクリストの作成方法
動的リンクリストを作成するにはいろいろな方法があると思いますが、なるべく汎用的で使いやすい方法を考えてみました。
リンクリストは、Smartyでデザインが自由になるようにCSVファイルに基本データだけを書き込みます。リンクリストは、2階層まで考えました。応用すれば、3階層でも作ることが出来ます。そして、PHPからCSVファイルのリンクリストを読み込み、Smartyに渡すように加工するだけです。これで、リンクの数だけページが自動生成されます。
応用すれば、色々な動的リンクを作成することが出来ます。今回用意したファイルは、次のとおりです。
- リンクリスト用のCSVファイル「smpl_links_smarty.csv」
- Smartyテンプレートファイル「smpl_links_smarty.tpl」
- 実行ファイル「smpl_links_smarty.php」
動的リンクリストのサンプルリスト
サンプルリストは次の通りです。
リンクリスト用のCSVファイル「smpl_links_smarty.csv」
「 , 」で区切って、データを並べます。データは、「リンク階層」、「リンクページの名前」にしました。今回は、「リンクページの名前」を「urlエンコード」して動的ページにしています。リンクページのアドレス項目をデータに追加すれば、通常のリンクも簡単に出来ます。
実行ファイル「smpl_links_smarty.php」と同じディレクトリにおいてください。
0,電車
1,JR
1,京王
1,小田急
0,バス
1,JRバス
1,京王バス
1,小田急バス
Smartyテンプレートファイル「smpl_links_smarty.tpl」
実行ファイルから渡された、ページのタイトル{$title}とリンクリスト{$list.kyw}を表示します。リンクリストは、階層0は、<h4></h4>、1は<ul><li></li></ul>としました。階層の切り替わりを、「chng_ck」で判定しています。最後のリストデータの判定は、「foreach」が返す「$smarty.foreach.lists.last 」で判定しています。
余りスマートに出来ませんでしたが、タグを変更したい時も応用が利きます。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{$title} - リンクリストページ(サンプル)</title>
</head>
<body>
<div id="main">
このページは、リンクリストのサンプルです。</br>
</br>
現在のページは、<strong>{$title}</strong>です。</br>
</br>
</div>
{* リンクリストをあるだけ表示 $list.knw:0は<h4></h4>、1は<li></li> *}
<div id="side">
{foreach name=lists from=$lists item=list}
{* 階層が一つ上になったか? *}
{if $list.chng_ck == (-1) }
</ul>
{/if}
{if $list.knw == 0 }
<h4>{$list.kyw}</h4>
{else}
{* 階層が一つ下になったか? *}
{if $list.chng_ck == 1 }
<ul>
{/if}
<li>{$list.kyw}</li>
{/if}
{* 階層が一つ下でかつ最後のデータか? *}
{if ($list.knw == 1) and $smarty.foreach.lists.last }
</ul>
{/if}
{/foreach}
</div>
</body>
</html>
実行ファイル「smpl_links_smarty.php」
基本的には、CSVファイル「smpl_links_smarty.csv」を読んで、リンク用に加工したリストをSmartyに渡しているだけです。階層の変化は、「$chng_ck」に入力しています。
リンクキーワードと呼ばれたurlの引数が一致した時は、リンクをはずしています。また、このような動的ページの場合は、Smartyのキャッシュを有効にすると、表示データも一緒にキャッシュされ表示が変らなくなりますので、注意してください。
<?php
//引数を読む
$title = htmlspecialchars($_GET['ttl']); //タイトルキーワードurlencode
$thispg = "smpl_links_smarty.php";//このページ
//リンクリストを$fnameファイルから読みリンクデータを配列$lists[]にセット
$fname = "smpl_links_smarty.csv";//リンクリストCSVファイル
//ファイルを開く
$file = fopen($fname,"r");
//データを二次元アレイに格納
$knw_ck = 0 ;//リンクリストの階層判定用
while ($arry = fgetcsv($file,1000,",")){
$chng_ck = $arry[0]-$knw_ck;
$kyw = ( $title == $arry[1] ) ? ($arry[1]) : ( "<a href = \"$thispg?ttl=" .urlencode($arry[1])."\">" .$arry[1]. "</a>"); //リンクキーワードと等しい時はリンクしない
$lists[] = array(
"knw" => $arry[0],//リストの階層
"kyw" => $kyw,
"chng_ck" => $chng_ck,//0:変化なし,1:階層一つ下,-1:一つ上
);
$knw_ck = $arry[0];//次の判定用に現在の階層を記憶
}
//ファイルを閉じる
fclose($file);
//Smartyで結果表示
require_once("/usr/local/lib/php/Smarty/Smarty.class.php);
$smarty = new Smarty();
$smarty -> caching = false;//動的ページなのでキャッシュしないようにする
$smarty -> assign("title",$title);
$smarty -> assign("lists",$lists);
$smarty -> display("./sample/php/smpl_links_smarty.tpl");
?>
動的リンクリストの動作サンプル
これで、動的リンクリストが出来ました。動作サンプルは、動的リンクリストサンプルにあります。
レンタルサーバーのロリポップでは、動作確認できています。