كيف يمكنني كتابة مكونات Smarty Block التي تحلق على سجلات قاعدة البيانات

StackOverflow https://stackoverflow.com/questions/1224350

  •  11-07-2019
  •  | 
  •  

سؤال

بالنظر إلى جداول الفئة (الوالد) والمنتج (الطفل) في قاعدة بيانات ، على سبيل المثال ، أريد إنشاء مكونات Smarty Block التي من شأنها أن تتيح قصاصات القالب مماثلة لهذا:

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

أعتقد أن الإضافات مثل هذه ستساعد في تجنب قطع الكود المتكررة التي تقرأ قاعدة بيانات وتقوم بتعيين ذكي على النتيجة في وحدة التحكم الخاصة بي.

أنا أعرف كيف أكتب هذا كدالة ذكية. لكنني أبحث عن إصدار كتلة لإعطاء مصمم القالب المرونة لتنظيم الأعمدة الفردية بأي طريقة يريدها. أنا مبرمج بيرل منذ فترة طويلة وجديدة ل Smarty. سيتعرف مستخدمو Perl على شيء مثل هذا في نظام Templating Type المنقص على سبيل المثال ، وأتساءل عما إذا كان إصدار Smarty ممكنًا.

هل شيء من هذا القبيل ممكن في Smarty على الإطلاق؟ هل من الجيد إجراء مكالمة DB من داخل مكون إضافي Smarty؟

هل كانت مفيدة؟

المحلول

اقتراحي هو استخدام مجموعة التكوين ($ conf) مع قالب استعلام SQL لاستخدامه داخل المكون الإضافي للتعديل البسيط. بالطبع ليس شيئًا جيدًا قم بإجراء مكالمة DB داخل المكون الإضافي Smarty. بدلاً من ذلك ، يمكنك تحميل النتائج في صفيف $ conf جعل استدعاء DB في البرنامج النصي 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;
}
?>

القالب الذكي:

{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');
?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top