2009-08-03 6 views
1

Angesichts einer Kategorie (Eltern) und Produkt (Kind) Tabellen in einer Datenbank, sagen wir, Smarty Block Plugins, die Vorlage Schnipsel ähnlich wie diese aktivieren würde:Wie schreibe ich Smarty Block Plugins, die Datenbank Datensätze durchlaufen

Ich glaube Plugins wie diese würden helfen, wiederholte Stücke von Code zu vermeiden, die eine Datenbank lesen und eine Smarty-Zuweisung auf das Ergebnis in meinem Controller machen.

Ich weiß, wie man dies als Smarty-Funktion schreibt. Aber ich suche nach einer Block-Version, um dem Template-Designer die Flexibilität zu geben, die einzelnen Spalten so zu gestalten, wie er will. Ich bin ein langjähriger Perl-Programmierer und neu bei Smarty. Perl-Benutzer werden zum Beispiel im Movable Type Templating System so etwas erkennen, und ich frage mich, ob eine Smarty-Version möglich ist.

Ist so etwas in Smarty überhaupt möglich? Ist es eine gute Sache, einen DB-Aufruf von innerhalb eines Smarty-Plugins zu machen?

Antwort

2

Mein Vorschlag ist Verwendung Konfigurationsarray ($ conf) mit der SQL-Abfrage Vorlage im Plugin für einfache Modifikation zu verwenden. Natürlich ist es nicht gut, einen DB-Aufruf innerhalb des Smarty-Plugins zu machen. Stattdessen können Sie die Ergebnisse in das $ conf-Array laden, indem Sie den DB-Aufruf im PHP-Skript ausführen und das Plug-In nach Belieben entladen.

Dies ist die Smarty-Plugin:

<?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; 
} 
?> 

die Vorlage Smarty:

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

und die 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'); 
?> 
Verwandte Themen