Frage

eine Kategorie (Eltern) Gegeben und Produkt (Kind) Tabellen in einer Datenbank, sagen wir, ich will Smarty Block-Plugins erstellen, die Vorlage dieses ähnliche Schnipsel ermöglichen würde:

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

Ich glaube, Plugins wie diese helfen würden wiederholt Teile des Codes zu vermeiden, die eine Datenbank zu lesen und zu tun auf dem Ergebnis in meinem Controller ein Smarty-zuweisen.

Ich weiß, wie dies als eine Smarty-Funktion zu schreiben. Aber ich bin auf der Suche für einen Block Version Vorlagendesigner die Flexibilität zu geben, die einzelnen Spalten in was auch immer, um Stil, wie er will. Ich bin seit langer Zeit eines Perl-Programmierer und neu zu Smarty. Perl Benutzer so etwas wie dies in der Movable Type Template-System zum Beispiel erkennen, und ich frage mich, ob eine Smarty-Version ist möglich.

Ist so etwas möglich in Smarty überhaupt? Ist es eine gute Sache, einen DB-Aufruf aus dem Innern einer Smarty-Plugin zu machen?

War es hilfreich?

Lösung

Mein Vorschlag ist die Verwendung Konfigurations Array ($ conf) mit der SQL-Abfrage-Vorlage innerhalb der Plug-In für einfache Modifikation zu verwenden. Natürlich ist keine gute Sache, eine DB-Aufruf innerhalb des Smarty-Plugin machen. Stattdessen können Sie die Ergebnisse in dem $ conf Array laden Sie den DB-Aufruf in dem PHP-Skript zu machen und im Plugin entladen, wie Sie wollen.

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 Smarty Template:

{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');
?>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top