Nasıl Smarty Blok eklentiler veritabanı kayıtları üzerinde bu döngü yazıyorum

1 Cevap php

Kategori (ana) ve bir veritabanında Ürün (çocuk) tablolar göz önüne alındığında, diyelim, ben şablonu sağlayacak Smarty Blok Plugins oluşturmak istiyorsanız bu benzer parçacıkları:

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

Ben bu gibi eklentileri bir veritabanı okumak kod tekrarlanan parçaları önlemek ve yapacağını inanıyorum benim denetleyicisi sonucu smarty-atamak.

Ben bir smarty işlevi olarak bu yazmak için biliyorum. Ama şablon tasarımcı istediği ne şekilde olursa olsun bireysel sütunları stil esneklik vermek için bir blok sürümü arıyorum. Ben uzun süre Perl programcısı ve Smarty yeni duyuyorum. Perl kullanıcılar örneğin Taşınır Tip Şablon Sistemde böyle bir şey tanıyacak ve bir smarty versiyonu mümkün olup olmadığını merak ediyorum.

Hiç Smarty olası böyle bir şey mi? Bir smarty eklenti içindeki bir DB arama yapmak için iyi bir şey midir?

1 Cevap

My suggestion is use configuration array ($conf) with the SQL query template to use inside the plugin for simple modification. Of course is not a good thing make a DB call inside the Smarty plugin. Instead, you can load the results in the $conf array making the DB call in the PHP script and unload in the plugin, as you wish.

Bu Smarty eklentisi:

<?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 şablon:

{products category="Some Category" item=product}
    <h1>{$product.name}</h2>
    <p>{$product.description}</p>
{/products}

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