데이터베이스 레코드를 통해 루프하는 Smarty 블록 플러그인을 어떻게 작성합니까?

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

  •  11-07-2019
  •  | 
  •  

문제

데이터베이스에 카테고리 (부모) 및 제품 (자식) 테이블이 주어지면 다음과 유사한 템플릿 스 니펫을 활성화 할 수있는 Smarty 블록 플러그인을 만들고 싶습니다.

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

이와 같은 플러그인은 데이터베이스를 읽고 내 컨트롤러의 결과에 대해 Smarty-Assign을 수행하는 반복 된 코드 청크를 피하는 데 도움이 될 것이라고 생각합니다.

나는 이것을 똑똑한 기능으로 작성하는 방법을 알고 있습니다. 그러나 템플릿 디자이너에게 원하는 방식으로 개별 열을 스타일링 할 수있는 유연성을 제공하는 블록 버전을 찾고 있습니다. 저는 오랜 Perl 프로그래머이며 Smarty에 새로 익숙합니다. PERL 사용자는 예를 들어 이동식 유형 템플릿 시스템에서 이와 같은 것을 인식하고 Smarty 버전이 가능한지 궁금합니다.

Smarty에서 이와 같은 것이 가능합니까? Smarty 플러그인 내부에서 DB 호출을하는 것이 좋은가요?

도움이 되었습니까?

해결책

내 제안은 SQL 쿼리 템플릿과 함께 구성 배열 ($ conf)을 사용하여 단순한 수정을 위해 플러그인 내부에서 사용하는 것입니다. 물론 Smarty 플러그인 내부에서 DB 호출을하는 것이 좋지 않습니다. 대신, PHP 스크립트에서 DB를 호출하고 플러그인에서 언로드하는 $ conf 어레이에 결과를로드 할 수 있습니다.

이것은 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 Template :

{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