假设数据库中有一个Category (父)表和Product (子)表,假设我想创建Smarty Block Plugins来启用类似如下的模板片段:
{products category="Some Category"}
<h1>{products_name}</h2>
<p>{products_description}</p>
{/products}我相信这样的插件将有助于避免重复的代码块读取数据库,并在我的控制器中对结果进行智能赋值。
我知道如何把它写成一个聪明的函数。但我正在寻找一个块版本,让模板设计师以他想要的任何方式灵活地设计单个列的样式。我是一名资深的Perl程序员,对Smarty来说还是个新手。例如,Perl用户会在可移动的Type模板系统中识别出类似这样的东西,我想知道是否有可能有一个聪明的版本。
在Smarty中,这样的事情是可能的吗?从智能插件内部进行DB调用是一件好事吗?
发布于 2009-08-03 21:04:44
我的建议是使用配置数组($conf)和SQL查询模板,以便在插件内部进行简单的修改。当然,在Smarty插件中进行DB调用并不是一件好事。相反,您可以将结果加载到$conf数组中,在PHP脚本中调用DB,然后在插件中卸载。
这是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');
?>https://stackoverflow.com/questions/1224350
复制相似问题