2

私のサイトには一連の div が表示されており、それぞれが 5 つの異なるタイプのコンテンツを保持するコレクションを表しています。各 div は、そのコレクション内の各タイプのコンテンツの項目数を示します。

現在、次のようにデータベースから各タイプの番号を取得しています。

{section name=res loop=$results}

{assign var='wn' value=$db->num_rows($db->query("select * from content where type='1' and collection_id='{$results[res].collection_id}'"))}
{assign var='nn' value=$db->num_rows($db->query("select * from content where type='2' and collection_id='{$results[res].collection_id}'"))}

問題は、div ごとに 5 つのデータベース クエリを実行していることです。これらを 1 つにまとめたいと考えています。php を使用すると、単純に行うことができます

$w=$db->query("select type, count(*) as number from content where collection_id='".$val['collection_id']."' GROUP by type");

次に、「mysql_fetch_array」で「while」ループを使用して、変数にタイプ量を割り当てます。

Smarty で同様のことを行うことは可能ですか? Smarty が結果セットにアクセスするための mysql_fetch_array の代替手段はありますか?

前もって感謝します!

編集: php からこれを行うべきであることが提案されていますが、それがどのように機能するかは明確ではありません。私のphpファイルには、次のものがあります。

<?php


$c=$db->query("select * from ".USERS_PIN."");

$cdata = array();

while ($row = mysql_fetch_array($c))
    {
        $cdata[] =  $row;
    }

$smarty->assign("results", $cdata); 

$smarty->display('stack.tpl');  

?>

次に、stack.tplに次のものがあります。

<!DOCTYPE html>
<html lang="en">
<head>
</head>
<body >

<div id="ColumnContainer">

{if count($results) > 0}

            {section name=res loop=$results}

            {assign var='wn' value=$db->num_rows($db->query("select * from pinrest_users_pin where type='4' and board_id='{$results[res].board_id}'"))}
            {assign var='nn' value=$db->num_rows($db->query("select * from pinrest_users_pin where type='5' and board_id='{$results[res].board_id}'"))}
            {assign var='in' value=$db->num_rows($db->query("select * from pinrest_users_pin where (type='1' or type='2') and board_id='{$results[res].board_id}'"))}
            {assign var='vn' value=$db->num_rows($db->query("select * from pinrest_users_pin where type='3' and board_id='{$results[res].board_id}'"))}


<div class='item' style="height:70px;width:350px;float:left;border:2px solid aqua" data-id="{$results[res].id}">

    <div class="datadiv" >

<div style="margin-top:3px;width:40%;float:left;margin-left:15px">{$nn} news {$vn} videos {$in} images {$wn} webpages</div>

          </div>

  </div>

 {/section}

{/if}     

</div>

</body>
</html>

Smarty ループから一度に 1 つずつ div を構築しているので、ループ内で各 div の mysql データを一度に 1 つずつ取得するしかないと考えました。php ファイルの各 div のデータを取得し、それを割り当てて、ループ中に Smarty で使用する方法はありますか?

4

3 に答える 3

4

Smarty テンプレートで SQL を実行すると、そもそもテンプレート システムを使用する目的が無効になります。これをコントローラーファイルで処理します。

私はPHPのSQLメソッドに少し慣れていないので、実装に適したメソッドでこれを調整してください. 解決策 1:

$smarty->display('beginning_of_view.tpl');
$q = $db->query('your query for all the divs');

while($row = mysql_fetch_assoc($q))
{
  $smarty->assign('row', $row);
  $smarty->display('my_div.tpl');
}
$smarty->display('end_of_view.tpl');

解決策 2 (おそらくより良い方法):

$rows = array();
$q = $db->query('your query for all the divs');

while($row = mysql_fetch_assoc($q))
{
  $rows[] = $row;
}
$smarty->assign('rows', $rows);
$smarty->display('template.tpl');

//In your template
{foreach $rows as $row}
{$row}
{/foreach}

うまくいけば、これでアイデアが伝わります。

于 2012-08-16T22:45:44.060 に答える
2

mysql_fetch_array によって返された配列を smarty 変数に割り当ててから、smarty でループします

次に例を示します。

あなたのphpファイル:

<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>

あなたの賢いテンプレート

 {foreach from=$myArray item=foo}
     {$foo}
 {/foreach}

編集:

あなたの要件については、多項/ネストされた配列を使用する必要があります。この質問を見てください: php smarty loop multidimensional array

于 2012-08-16T22:46:17.527 に答える
0

PHP で、メインのクエリ ループ内で 4 つのクエリ ( tpl からのクエリ) を実行し、結果を $row のフィールドとして追加します。

<?php

$c=$db->query("select * from ".USERS_PIN."");        
$cdata = array();

while ($row = mysql_fetch_array($c))
            {
            $d = $db->query("select * from pinrest_users_pin where type='4' and     board_id=".$row['board_id']);
            $row['wn'] = mysql_fetch_array($d); // repeat 4X
            $cdata[] =  $row;
            }

$smarty->assign("results", $cdata);        
$smarty->display('stack.tpl');        
?>

次に、tpl で div で $results[res].wn を使用します。

于 2012-08-17T06:26:23.733 に答える