我的网站显示一组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}'"))}
等
问题是我们正在为每个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 中使用它?
在 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}
希望这能传达出这个想法。
您将 mysql_fetch_array 返回的数组分配给一个 smarty 变量,然后使用 smarty 循环
下面是一个示例:
你的 PHP 文件:
<?php
$arr = array(1000, 1001, 1002);
$smarty->assign('myArray', $arr);
?>
您的智能模板
{foreach from=$myArray item=foo}
{$foo}
{/foreach}
编辑:
对于您的要求,您应该使用多提及/嵌套数组,请查看以下问题:PHP智能循环多维数组
在你的 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 中。