現在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}は使いたくありません。

回答の条件
  • URL必須
  • 1人3回まで
  • 13歳以上
  • 登録:2010/11/16 12:19:46
  • 終了:2010/11/18 10:27:55

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/17 21:50:28

ポイント100pt

【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を生成したほうが良いように思います

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

 

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

id:goodbabies

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

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

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

2010/11/18 10:26:39

その他の回答(1件)

id:Lhankor_Mhy No.1

Lhankor_Mhy回答回数775ベストアンサー獲得回数2302010/11/17 12:15:54

ポイント35pt

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

 

 一応、ここを参照。

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

 

 

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

id:goodbabies

?????

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

2010/11/17 14:45:50
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/11/17 21:50:28ここでベストアンサー

ポイント100pt

【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を生成したほうが良いように思います

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

 

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

id:goodbabies

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

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

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

2010/11/18 10:26:39
  • id:windofjuly
    うぃんど 2010/11/16 13:05:01
    その程度ならsectionではなくシンプルなforeachのほうが望ましいですね
    (sectionは細かい制御が出来る分だけ若干ですが処理が重くなります)
    しかしながら、その程度以外の部分が見えないのでループ制御方法は適宜きめてください
     
    もっとも楽な考え方としては以前の「1行分読み取って表示、そしてまた次の行」という流れではなくて、
    「phpで1ページ分を読み取って配列に入れてしまい、そのあとSmartyのループで表示する」という流れのほうが楽でしょう
     
    ついでみたいになっちゃいますが、ループの中でもifによる制御はできますよ
    (今回のような案件ならばphpの配列のほうにファイル名を入れてしまうほうが楽なので使わないと思いますけど)
  • id:Lhankor_Mhy
    あ、ちょっと回答ミスった。
  • id:Lhankor_Mhy
    うーん、なぜかソースが表示されていないので、転記しときます。
    {section name=cnt start=0 loop=8}
    {assign val=filename value="../images/girl/`$uid`/0`$smarty.section.cnt.index`.jpg"}
    {if file_exists($filename)}
    <img src="{$filename}" width="150" height="200"/>
    {else}
    <img src="../images/girl/noimage.jpg" width="150" height="200"/>
    {/if}
    <input type="file" name="upfile0<?php echo $i; ?>"/></br>
    {/section}
  • id:Lhankor_Mhy
    pre記法で書いたソースが表示されないとか、はてなのバグですかね。

    それはそれとして、下から2行目は間違ってますので、適宜直してくださいねー
  • id:goodbabies
    {assign val=filename value="../images/girl/`$uid`/0`$smarty.section.cnt.index`.jpg"}
    {if file_exists($filename)}

    なるほど、このように書けばよろしいですね。参考になりました!ありがとうございます。
    foreachでもやってみたいと思います。
  • id:goodbabies
    windofjulyさん、これってどういう意味ですか??


    もっとも楽な考え方としては以前の「1行分読み取って表示、そしてまた次の行」という流れではなくて、
    「phpで1ページ分を読み取って配列に入れてしまい、そのあとSmartyのループで表示する」という流れのほうが楽でしょう
     
    ついでみたいになっちゃいますが、ループの中でもifによる制御はできますよ
    (今回のような案件ならばphpの配列のほうにファイル名を入れてしまうほうが楽なので使わないと思いますけど)
  • id:windofjuly
    うぃんど 2010/11/17 21:55:23
    >これってどういう意味
    長くなったので回答欄のほうに書かせていただきました
     
    >pre記法で書いたソースが表示されない
    たまにあるようです
    確認画面で表示されないようであれば一度戻ってから再投稿することで投稿できる場合もあるようです
    確認画面で表示されたのに、最終的に表示されていないという場合も時にあるようなので、その場合はどうしようもないです
    下書きの無いときは泣き寝入りです。「失われた回答文と失われた何かを返せ」と言いたいですね(泣)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません