PHPの便利なライブラリでSmartyがありますが

{while ($row=mysql_fetch_array($result)}
<tr><td>{$row[name]}</td></tr>
{/while}

テンプレート内に上記の様な記述をし、データベースの値を取得しながら、出力させる事は可能ですか?
または、このような動作をさせることは可能でしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2006/07/20 13:18:59
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答5件)

id:nandedarou No.1

回答回数230ベストアンサー獲得回数34

ポイント20pt

{php}と{/php}で囲むことで、普通にPHPのコードが書けます。

http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/langu...

{include_php}関数でPHPスクリプトをインクルードできます。

http://sunset.freespace.jp/smarty/SmartyManual_2-6-6J_html/langu...

 

しかし、このようなコードは望ましくありません。データの取得は通常のPHPスクリプトで行い、画面表示のみテンプレートで行うべきです。その為にテンプレートを導入するわけですから。

id:nandedarou No.2

回答回数230ベストアンサー獲得回数34

ポイント20pt

ご質問の最後の一文「または、このような動作をさせることは可能でしょうか?」というのは、データの個数に応じてループすることは可能か?

という意味ですね。可能です。典型例を示します。

※下記の例のように、データの取得は通常のPHPファイルで行い、HTMLとしてのデザインは、テンプレートでやるのが推奨されています。

 

sample.php

<?php
  //SmartyクラスからSmartyオブジェクトを作成(例)
    require_once("../MySmarty.class.php");
    $o_smarty=new MySmarty();

    //ここでデータベースに接続
    //(コードは省略します)

    //以下でデータを取得し、配列$dataに格納
    $data=array();
    while($row=mysql_fetch_array($result)){
        $data[]=array("name"=>$row['name'],"address"=>$row['address']);
    }

    //テンプレート変数($DATA)に値(配列$data)をセット
    $o_smarty->assign("DATA",$data);
    
    //テンプレートを実行
    $o_smarty->display("sample.tpl");
?>

テンプレートsample.tpl

<html>
<head>
<title>Smartyテンプレートの例</title>
</head>
<body>
<table border="1">
    <tr><th>名前</th><th>住所</th></tr>

{* ループ処理 以下の3行がデータの個数分繰り返されます *}
{foreach from=$DATA item=datum}
    <tr><td>{$datum.name}</td><td>{$datum.address}</td></tr>
{/foreach}

</table>
</body>
</html>

http://q.hatena.ne.jp/answer ダミー

id:spits No.3

回答回数11ベストアンサー獲得回数0

ポイント20pt

結論から言うと、「できるけどやらないほうがいい」だと思います。

理由は 1の方が言われているようにデザインとロジックを分けるためにsmartyを使うからです。

例えば、{while ($row=mysql_fetch_array($result)} の $result が

nullだったりした場合、エラー処理ができないですよね。

なので、phpでいったんすべての処理を終えた上で smartyを使って出力するのがいいと思います。

具体的にどうするかは2の回答がそのもののようです。

http://mikilab.doshisha.ac.jp/dia/research/report/2005/0915/004/...

id:makocan

皆さんありがとうございます。

なるほど。

エラー処理に対する事はおっしゃるとおりですね。

ただ、ご質問なのですが、この場合は二度のループを行わなければならないため、相当量のデータを出力する際は、PHP内の一度のループで文字列として、変数に入れ込み、それを純粋にテンプレート内ではループさせずに、{$data}という様に埋め込んだほうがよろしいのでしょうか?

2006/07/17 02:52:14
id:nany No.4

回答回数5ベストアンサー獲得回数1

ポイント20pt

>PHP内の一度のループで文字列として、変数に入れ込み、それを純粋にテンプレート内ではループさせずに、{$data}という様に埋め込んだほうがよろしいのでしょうか?

とは、phpファイルで、htmlのタグとデータを文字列として1つの変数に格納し、テンプレートで、その変数のみを出力するという意味ですか?

 

結論からいうと、

そのようにすることは、実質的にデザインとロジックがphpファイル内でだけで処理されている為、Smartyを使うメリットが全くなくなりますので、止めた方がいいでしょう。2番の回答のコードの様にするとをお勧めします。スピードがそれ程変わるとは思えないし、スピードを上回るメリットがあるからです。

  

デザインとロジックを分けると

デザイナーとプログラマの役割分担ができると言うメリットがあります。また、1人の人が両方やるにしても、データ取得、エラー処理、認証など非常にロジカルな機械的な思考と、ユーザーの使い易いデザインという実際使う人間を想像しながらやる思考を分けてファイルにした方が考え易いし、メインテナンスもし易いのです。バグの原因究明も早くなります。

 

このようなメリットと引き換えに、スピードは多少落ちるでしょう。しかし、スピードよりも正確さ、わかり易さ、メインテナンスのし易さなどの方がよほど大きな価値があります。

 

※phpやSmartyには、スピードを上げる為のチューニング方法もありますので、実際やってみて遅すぎるようであれば研究してみてください。

 

http://q.hatena.ne.jp/1152987218

ダミーです

id:spits No.5

回答回数11ベストアンサー獲得回数0

ポイント20pt

WEBの画面で相当量(数万件とか)を表示することってあまりないですよね?

1000件くらいでしたら2回ループしてもさほどパフォーマンスには影響ないと思います。

想定される件数で実際に試してみてはいかがでしょうか。

http://www.yahoo.co.jp/ (ダミー)

id:makocan

ありがとうございます。

RSS関連で思い処理になってしまった経験があったため、若干、敏感になってしまっていたのかもしれません。

2006/07/20 13:18:43

コメントはまだありません

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

トラックバック

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

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

回答リクエストを送信したユーザーはいません