人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

現在Smartyを使っています。
<?php
for($i = 1; $i <= 8; $i++){
?>
<tr>
<th align="right">画像の登録0<?php echo $i; ?></th>
<td>
<?php
$uid = $g_data['gid'];
$img_file = "../images/girl/".$uid."/0".$i.".jpg";
if(file_exists($img_file)){
?>
<img src="<?php echo $img_file; ?>" width="150" height="200"/>
<input type="file" name="upfile0<?php echo $i; ?>"/></br>
<?php
}else{
?>
<img src="../images/girl/noimage.jpg" width="150" height="200"/>
<input type="file" name="upfile0<?php echo $i; ?>"/></br>
</td>
file_exists関数を使って
$img_file = "../images/girl/".$uid."/0".$i.".jpg";
ファイルが存在すれば画像を表示、無ければnoimage画像を表示していました。

で、繰り返しはSmartyのsectionを使うことにしました。

{section name=cnt start=0 loop=8}
{/section}

画像が無ければ前のバージョンのときのように、no-image画像を出力したいのですが、
{section name=cnt start=0 loop=8}
{/section}
この中にどうやって書いたらよいのか分かりません。
当然、file_exists関数はPHPファイル内に書きたいです。.tpl内には{php}は使いたくありません。



●質問者: goodbabies
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:.jpg CNT GID LOOP name
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Lhankor_Mhy
●35ポイント

動作確認未済ですが、これでたぶん普通に動くと思うんですがダメですか。

一応、ここを参照。

http://www.phppro.jp/phpmanual/smarty/variable.security.html

あとコメント欄でもありましたが、テンプレートをあまり汚くするのはどうかなあ、と思います。

◎質問者からの返答

?????

これは普通にうごきます。これをSmarty使って切り離すにはどうしたらよいかを質問しているんですけど。.


2 ● うぃんど
●100ポイント ベストアンサー

【1】対応例

今回のようなものであれば、配列変数にファイル名を入れておいて「この変数を使え」とだけテンプレートの作者に指示を出すようにします

そうすれば、テンプレート側は下記のようにするだけで済みますので簡単です

(いきなり書いてますので誤記などあるかもしれません)

(1)tplの例

{foreach from=$filename item=value name=pictureList}
 <tr>
 <th align="right">画像の登録0{$smarty.foreach.pictureList.iteration}</th>
 <td>
 <img src="{$value}" width="150" height="200"/></br>
 <input type="file" name="upfile0{$smarty.foreach.pictureList.iteration}"/>
 </td>
 </tr>
{foreachelse}
 <tr><th>データがありません</th></tr>
{/foreach}

sectionを使ってもよいですよ(両方使えるにこしたことはありませんので、練習してみてもいいとは思います)

関係ない話ですがalign="right"はcssでまとめてしまうほうがさらにスッキリしますね

(2)phpの例

<?php
require_once(環境によるので省略);

$uid = $g_data['gid'];
$filename = array();
for($i = 1; $i <= 8; $i++){
 $img_file = "../images/girl/" . $uid . "/0" . $i . ".jpg";
 if(file_exists($img_file)){
 $filename[] = $img_file;
 } else {
 $filename[] = "../images/girl/noimage.jpg";
 }
}

$smarty->display(テンプレート)

if{}else{}ではなく三項演算にしてもいいですよ

【2】Smartyのようなテンプレートエンジンを使う意味

コード部分(ロジック)とデザイン部分(テンプレート)を分離することによって、それぞれの負担を減らすことが目標

テンプレートの中でifを使うような処理が入るのは「デザイナに対してプログラマのような技能を要求することになる」だけでなく、

「本来であればコードの変更だけですむような事でも、テンプレートまで含めて改修が必要になる(逆の場合もある)」などして、

Smartyなどの採用によって手間が増えるだけになる場合もありますので、id:Lhankor_Mhy さんもおっしゃるように「汚くするのはどうだかなぁ」になります

上記の例の場合であればロジックとテンプレートの間での決め事は「ファイル名は配列変数$filenameに入れる/入っているものとする」だけになります

テンプレート側は「ファイルはどこにあるのか?」や「if文でどのような条件分岐をすれば良いのか?」などを考える必要がなくなり、デザインに専念できます

最初に「$filename」とだけ決めてしまえば、ロジックの完成を待つことなくテンプレートの作成ができますし、逆もまたしかりとなり分業も楽になります

【3】phpの汚さ

HTMLの中にphpのコードを埋め込むという形では「パっと見て、どこからどのようになっているのかが判りづらい」という欠点があります

HTMLの中でphpをちょっとだけ使いたいという場合であれば問題ありませんが、phpが主体となる場合はphpのヒアドキュメントやechoなどでHTMLを生成したほうが良いように思います

(はてなの回答欄でコードを大きく書き直していたりするのも、理解しやすくし、ミスの可能性を減らすためだったりします)

一般に「見た目が整っていて美しいコードは処理時間も短い」ですし「メンテナンスも当然楽」になりますので常に整理整頓を心がけましょう

◎質問者からの返答

すばらしいです!できました!ありがとうございます。

実はSmartyを使うことに面倒さしか感じなくて、いっそのことやめてしまいたい!とすら思っていたのですが、この回答を見てやる気がでました。

配列操作、とても勉強になりました。ありがとうございます!!!

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ