Как мне написать Smarty Block Plugins, которые зацикливаются на записях базы данных - PullRequest
1 голос
/ 04 августа 2009

Учитывая таблицы Category (родительский) и Product (дочерний) в базе данных, скажем, я хочу создать подключаемые модули Smarty Block, которые бы включали фрагменты шаблонов, подобные этому:

{products category="Some Category"}
    <h1>{products_name}</h2>
    <p>{products_description}</p>
{/products}

Я полагаю, что подобные плагины помогут избежать повторяющихся фрагментов кода, которые читают базу данных и выполняют smarty-assign для результата в моем контроллере.

Я знаю, как написать это как умную функцию. Но я ищу блочную версию, чтобы дать дизайнеру шаблонов возможность гибко стилизовать отдельные столбцы так, как он хочет. Я давний программист на Perl и новичок в Smarty. Например, пользователи Perl узнают что-то подобное в системе шаблонов Movable Type, и мне интересно, возможна ли умная версия.

Возможно ли что-нибудь подобное в Smarty? Это хорошая вещь, чтобы сделать вызов БД изнутри умный плагин?

1 Ответ

2 голосов
/ 04 августа 2009

Мое предложение - использовать массив конфигурации ($ 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');
?>
...