こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Smartyを用いたコードの書き方について質問です

Smartyを用いたコードの書き方について質問です

お世話になります。
MySQLから得たデータをできるだけシンプルなコードで以下のように表示したいのですが、
smarty(PHPも)初心者なので苦戦しています。
完成イメージはこんな感じです。

「~件」は登録されているデータ数です。
-------------------
■北海道、東北(全1件)
北海道(0件) 青森(0件) 岩手(0件) 宮城(0件) 秋田(1件) 山形(0件) 福島(0件)

■関東(全8件)
茨城(1件) 栃木(0件) 群馬(1件) 埼玉(1件) 千葉(1件) 東京(5件) 神奈川(0件)

■中部(全5件)
新潟(0件) 富山(0件) 石川(0件) 福井(0件) 山梨(0件) 長野(1件) 岐阜(0件) 静岡(0件) 愛知(4件)
---以下省略---
-------------------

都道府県だけなら{foreach}で問題なく表示できるのですが、
その途中に「■北海道、東北」や「■関東」など地域を挟み込もうとしているため、
普通にループさせることができません。
こういった場合、どのようにすればシンプルにできるのでしょうか。
ご教授いただけたら幸いです。

現在ここでストップしています。とりあえず参考までに。。。
---area.php---
---前省略---
$rst = $DB->execute("SELECT * FROM prefec");
//都道府県を取得(47都道府県の番号、名前、登録データ数)
while($row=$rst->FetchRow()){
$prefec[] = array(
"prefecid"=>$row['prefecid'],
"prefecname"=>$row['prefecname'],
"prefeccnt"=>$row['cnt'],
);
}
//地域を取得(7地域の番号、名前、登録データ数)
$rst = $DB->execute("SELECT * FROM tblarea");
while($row=$rst->FetchRow()){
$area[] = array(
"areaid"=>$row['areaid'],
"areaname"=>$row['areaname'],
"areacnt"=>$row['cnt'],
);
}
$smarty->assign("area", $area);
$smarty->assign("prefec", $prefec);
$smarty->display("area.tpl");
------

---area.tpl---
-中略-
//地域を表示
{{foreach from=$area item="area"}}
<a href=hoge.php?areaid={{$area.areaid}}">{{$area.areaname}}</a>
(全{{$area.areacnt}}件)</div>
{{/foreach}}

//都道府県を表示
{{foreach from=$prefec item="prefec"}}
<a href="hoge.php?prefecid={{$prefec.prefecid}}">{{$prefec.prefecname}}</a>
({{$prefec.prefeccnt}}件)</div>
{{/foreach}}

------

とうぞよろしくお願いいたします。

投稿日時 - 2010-01-17 21:13:37

QNo.5600883

暇なときに回答ください

質問者が選んだベストアンサー

prefecに地域の番号を持たせて、$areaのループの中で現在の地域の番号と一致する$prefecデータのみを表示させていく方法もありますが、私ならテンプレート側は極力制御構文を書きたくないので、地域毎の配列をそれぞれ用意するか、$都道府県名['データ数'] の連想配列をテンプレに渡して、テンプレ側は47都道府県をベタに書きます。
都道府県は頻繁にかわるものではありませんのでベタ書きの方がデザイナーにも優しいかと多います。

投稿日時 - 2010-01-18 11:06:51

お礼

ご回答いただいた内容をもとに、都道府県に地域データを持たせて試行錯誤した結果、以下のコードにたどり着きました。

---area.tpl---
//地域をループ
{{section name=area loop=$area}}
<a href='search.php?areaid={{$area[area].areaid}}'>{{$area[area].areaname}}</a>
(全{{$area[area].areacnt}}件)</div>
//地域の中で都道府県をループ
{{section name=prefec loop=$prefec}}
{{if $area[area].areaid == $prefec[prefec].areaid}}
<a href='search.php?prefecid={{$prefec[prefec].prefecid}}'>{{$prefec[prefec].prefecname}}</a>
({{$prefec[prefec].prefeccnt}}件)</div>
{{/if}}
{{/section}}
{{/section}}
--------

初心者なのでこの書き方でいいのかどうかはよくわかりませんが、一応イメージ通りの形にはなりました。
ベタ書きのほうも試したのですが、あまりに冗長になってしまうため上記のほうが個人的にはしっくりきます。

ともあれ、ご回答ありがとうございました。

投稿日時 - 2010-01-19 19:41:40

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問