如何编写循环数据库记录的Smarty Block Plugins

时间:2009-08-03 20:08:20

标签: php plugins smarty

给定数据库中的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中有可能是这样吗?从一个聪明的插件中进行数据库调用是一件好事吗?

1 个答案:

答案 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');
?>