2

我的站点显示一组 div,每个 div 代表一个包含五种不同类型内容的集合。每个 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}'"))}

ETC

问题是我们正在为每个 div 执行五个数据库查询,我们想尝试将它们合并为一个。使用 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 循环中一次构建一个 div,我别无选择,只能在循环中一次获取每个 div 的 mysql 数据。有没有办法让我获取 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 中使用 $results[res].wn 在您的 div 中。

于 2012-08-17T06:26:23.733 回答