给定数据库中的Category(父级)和Product(子)表,比方说,我想创建Smarty Block Plugins,它将启用与此类似的模板片段:
{products category="Some Category"}
<h1>{products_name}</h2>
<p>{products_description}</p>
{/products}
我相信这些插件有助于避免重复读取数据库的代码块,并对我的控制器中的结果进行智能分配。
我知道如何将其写成一个聪明的功能。但我正在寻找一个块版本,以便模板设计人员能够灵活地按照他想要的方式设置各个列的样式。我是一名长期的Perl程序员,也是Smarty的新手。例如,Perl用户会在Movable Type Templating System中识别出这样的东西,我想知道是否有可能是一个聪明的版本。
在Smarty中有可能是这样吗?从一个聪明的插件中进行数据库调用是一件好事吗?
答案 0 :(得分:2)
我的建议是使用配置数组($ conf)和SQL查询模板在插件中使用以进行简单修改。 当然,在Smarty插件中进行数据库调用并不是一件好事。相反,您可以将结果加载到$ conf数组中,在PHP脚本中进行数据库调用,并根据需要在插件中卸载。
这是Smarty插件:
<?php
function smarty_block_products($params, $content, &$smarty, &$repeat)
{
global $conf;
$category = $params['category'];
$md5 = md5($category);
if (empty($content))
{
if (empty($category))
{
$smarty->trigger_error("products: missing 'category' parameter");
}
$sql = str_replace('{$category}', $category, $conf['get-products-sql-template']);
$query = mysql_query($sql);
$result = array();
while ($row = mysql_fetch_assoc($query))
{
$result[] = $row;
}
if (count($result) == 0)
{
$result = false;
}
$GLOBALS['__SMARTY_PRODUCTS'][$md5] = $result;
}
if (is_array($GLOBALS['__SMARTY_PRODUCTS'][$md5]))
{
$field = "product";
if (isset($params['item']))
{
$field = $params['item'];
}
$product = array_shift($GLOBALS['__SMARTY_PRODUCTS'][$md5]);
$smarty->assign($field, $product);
if (count($GLOBALS['__SMARTY_PRODUCTS'][$md5]) == 0)
{
$GLOBALS['__SMARTY_PRODUCTS'][$md5] = false;
}
$repeat = true;
} else {
$repeat = false;
}
echo $content;
}
?>
Smarty模板:
{products category="Some Category" item=product}
<h1>{$product.name}</h2>
<p>{$product.description}</p>
{/products}
和PHP:
<?php
require 'Smarty/Smarty.class.php';
$smarty = new Smarty;
$conf['get-products-sql-template'] = 'SELECT product.* FROM product INNER JOIN category ON category.id = product.category_id WHERE category.title = \'{$category}\'';
$smarty->display('test.tpl');
?>