首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何编写循环遍历数据库记录的Smarty Block插件

如何编写循环遍历数据库记录的Smarty Block插件
EN

Stack Overflow用户
提问于 2009-08-03 20:08:20
回答 1查看 3.5K关注 0票数 1

假设数据库中有一个Category (父)表和Product (子)表,假设我想创建Smarty Block Plugins来启用类似如下的模板片段:

代码语言:javascript
复制
{products category="Some Category"}
    <h1>{products_name}</h2>
    <p>{products_description}</p>
{/products}

我相信这样的插件将有助于避免重复的代码块读取数据库,并在我的控制器中对结果进行智能赋值。

我知道如何把它写成一个聪明的函数。但我正在寻找一个块版本,让模板设计师以他想要的任何方式灵活地设计单个列的样式。我是一名资深的Perl程序员,对Smarty来说还是个新手。例如,Perl用户会在可移动的Type模板系统中识别出类似这样的东西,我想知道是否有可能有一个聪明的版本。

在Smarty中,这样的事情是可能的吗?从智能插件内部进行DB调用是一件好事吗?

EN

Stack Overflow用户

回答已采纳

发布于 2009-08-03 21:04:44

我的建议是使用配置数组($conf)和SQL查询模板,以便在插件内部进行简单的修改。当然,在Smarty插件中进行DB调用并不是一件好事。相反,您可以将结果加载到$conf数组中,在PHP脚本中调用DB,然后在插件中卸载。

这是Smarty插件:

代码语言:javascript
复制
<?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模板:

代码语言:javascript
复制
{products category="Some Category" item=product}
    <h1>{$product.name}</h2>
    <p>{$product.description}</p>
{/products}

和PHP:

代码语言:javascript
复制
<?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');
?>
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1224350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档