2012-04-18 6 views
2

複数行のSQLクエリ結果のレンダリングを高速化するために、PHPでデータプロバイダクラスを作成しています。基本的に、このクラスには、ページング、並べ替え、最終的にデータのレンダリングを支援するSQL関連のプロパティとメソッドがあります。後者については、私は行を簡単にテンプレートすることができますので、パラメータとして行テンプレートファイルを持つビューファイル(MVCモデル内)から呼び出せるrender()というメソッドを記述しました。それは次のようになります。DB行テンプレートのループに()を含める代わりに?

public function render($row_template_file) { 
    if($result = mysql_query($this->query)) { 
     while($row = mysql_fetch_array($result)) { 
      include $row_template_file; 
     } 
    } 
} 

実際の方法は、(それは、テンプレートファイルが存在するかどうかをチェックするなど、データの抽象クラスではなく、mysql_ *関数を使用しています)それよりも、より洗練されていますが、一般的なアイデアを得ます。行テンプレートファイルには、すなわち、基本的にストレート出力に行くHTMLです:ループ内で)このアプローチはうまく動作します

<div class="row"> 
    <div class="foo"><?php echo $row['foo']; ?></div> 
    <div class="bar"><?php echo $row['bar']; ?></div> 
</div> 

、唯一の問題は(含まれているレンダリングする場合は特に、素晴らしいアイデアのパフォーマンスは賢明ではありません多数の行。そのようにテンプレートの行を維持しながら、それを置き換えることができるものはありますか?ここには似たような質問はほとんどありませんでしたが、私が避けたいプレゼンテーションとロジックを混在させることを提案するすべての解決方法がありました。最初の反復で無名関数を作成し、それ以降のすべての反復で呼び出すことを考えていましたが、おそらく私はそれを思慮しすぎているか、ここでその輪を再発明しています。何か案は?

+3

あなたはテンプレートファイルの中でループすることができますか? –

答えて

0

これはあまりにも簡単な解決策のように思えるかもしれませんが、大きな問題は何も得られないかもしれませんが、PHP関数を使用するとどうなりますか?

function outputRow($row) { 
    echo '<div class="row">'; 
    echo '<div class="foo">' . $row['foo'] . '</div>'; 
    echo '<div class="bar">' . $row['bar'] . '</div>'; 
    echo '</div>'; 
} 

そして代わりに含まれ、あなたはおそらく、代わりに、PHP言語のprintf()/ sprintf()機能を使用outputRow($row)

1

を呼びますか?ループの前に、あなたが唯一の変数に一度ロード

<div class="row"> 
    <div class="foo">%s</div> 
    <div class="bar">%s</div> 
</div> 

このように、あなたのテンプレートファイルには、次のようなコードが含まれます

$tmpl = file_get_contents($row_template_file); 

をループ内であなただけのテンプレートに変数を入れます:

"Argument swapping" - 上記のリンクの例3および4を参照してくださいテンプレート内の番号付きの位置を使用する - 異なるテンプレート内の引数の順序が異なることを心配する必要はありません。

希望はあなたのために働く。

0

テンプレートをプレースホルダ付きの文字列として作成し、値をその文字列に置き換えます。それをrender()メソッドに渡します。

次に、file_get_contentsを使って文字列を取得する方法(私はこのために行く)または単純にそれをいくつかの "テンプレート"クラスにハードコードして、そこから外に出て、それを渡してください。提案

1

printf()/sprintf()ソリューションは、例えば、同じように、きちんとしていますが、テンプレート内のプレゼンテーション固有のロジックを含むすることができません。

<div class="gender"> 
    <?php if($row['gender'] == 'f') : ?> 
    <img src="female_icon.gif" /> 
    <?php else : ?> 
    <img src="male_icon.gif" /> 
    <?php endif; ?> 
</div> 

私が知っている、私が書かれているべきではありませんテンプレートは「基本的にHTML」です:-)

私は私の質問で言及した匿名関数の解法で遊んできましたが、それほどきれいに見えませんが、それは働き、複数の包含よりもはるかに高速ですこれを可能な回答の1つとして追加しています:

public function render($row_template_file) { 
    if($result = mysql_query($this->query)) { 
     $render_row = create_function('$row', '?>'.file_get_contents($row_template_file).'<?php '); 
     while($row = mysql_fetch_array($result)) { 
      $render_row($row); 
     } 
    } 
} 
+0

FYI:単純な['include'](http://php.net/include)がその仕事をします。パフォーマンスは無関係です。キャッシュされます。それ以外の場合は['eval'](http://php.net/eval)を参照してください。これはPHPの' include'の文字列です。 – hakre

0

eval関数で試してみてください。 php.netへのこのコメントはあなたを助けるかもしれません: http://www.php.net/manual/ru/function.eval.php#108091

+0

他の人が教えてくれたように:evalは通常、解決するよりも多くの問題を作り出します。また、彼はそれをどうすればよいでしょうか?どのように使用する必要がありますか? "評価関数で試してみてください"とはあまり言わない。 –

+1

技術的には、正解です。あなたがインクルードしていれば、評価することができます.PHPではこの2つの違いはあまりありません。実際、内部的には、それは同じ「機能」です。 – hakre

関連する問題