01/10/2018, 16:59

Render Template String Resource trong Smarty

Nếu như bạn đã từng sử dụng hệ thống của WHMCS hoặc thuần việt một chút là Bizweb thì các bạn sẽ thấy một điểm khá là đặc biệt là các mẫu E-Mail có chứa mã nguồn của Smarty Template Engine. Trước đây khi mình nhìn thấy nó thì trong đầu mình có một ý nghĩ là thực chất các mẫu E-Mail đó được lưu vào ...

Nếu như bạn đã từng sử dụng hệ thống của WHMCS hoặc thuần việt một chút là Bizweb thì các bạn sẽ thấy một điểm khá là đặc biệt là các mẫu E-Mail có chứa mã nguồn của Smarty Template Engine. Trước đây khi mình nhìn thấy nó thì trong đầu mình có một ý nghĩ là thực chất các mẫu E-Mail đó được lưu vào trong CSDL cũng đồng thời được lưu vào một File Template nào đó.

Thực chất nếu làm vậy cũng không sao đúng không bạn? Vì trước đó mình chỉ nghĩ Smarty chỉ có thể hiển thị view là các file và có đuôi mở rộng là .html hoặc .tpl và chúng được đặt trong một folder được chỉ định chứa templates. Nhưng từ phiên bản 3.x trở nên thì Smarty đã hỗ trợ cho phép bạn đăng ký mới một resources hay đăng ký mới một tài nguyên.

Để tìm hiểu rõ hơn bạn có thể tham khảo tại đây: https://www.smarty.net/docsv2/en/api.register.resource.tpl

Cú pháp: void register_resource(string name, array resource_funcs);

Ví dụ 01: Đăng ký resource

<?php
$smarty->register_resource('db', array(
                                'db_get_template',
                                'db_get_timestamp',
                                'db_get_secure',
                                'db_get_trusted')
                                );
?>

Điểm mà các bạn cần quan tâm chính là các Resource plugins và Resources template. Cái mà mình khá ấn tượng là chúng ta có thể custom được cái resource này theo ý mà chúng ta muốn.

Ví dụ 02: Tùy chỉnh resources

<?php
// put these function somewhere in your application
function db_get_template ($tpl_name, &$tpl_source, &$smarty_obj){
    // do database call here to fetch your template,
    // populating $tpl_source with actual template contents
    $tpl_source = "This is the template text";
    // return true on success, false to generate failure notification
    return true;
}
function db_get_timestamp($tpl_name, &$tpl_timestamp, &$smarty_obj){
    // do database call here to populate $tpl_timestamp
    // with unix epoch time value of last template modification.
    // This is used to determine if recompile is necessary.
    $tpl_timestamp = time(); // this example will always recompile!
    // return true on success, false to generate failure notification
    return true;
}
function db_get_secure($tpl_name, &$smarty_obj){
    // assume all templates are secure
    return true;
}
function db_get_trusted($tpl_name, &$smarty_obj){
    // not used for templates
}
// register the resource name "db"
$smarty->register_resource("db", array("db_get_template",
                                       "db_get_timestamp",
                                       "db_get_secure",
                                       "db_get_trusted"));

// using resource from php script
$smarty->display("db:index.tpl");
?>

Ngoài ra Smarty còn có thể render templates từ một chuỗi bằng cách sử dụng string: và eval: resources.

Bạn có thể xem chi tiết tại: https://www.smarty.net/docs/en/resources.string.tpl

string: resource hoạt động giống như tệp mẫu. Mẫu được biên soạn từ một chuỗi và mã mẫu được lưu trữ và được biên dịch để sử dụng lại. Mỗi chuỗi mẫu sẽ được tạo một tệp mẫu biên dịch mới. Nếu chuỗi mẫu của bạn được truy cập thường xuyên, thì đây là một lựa chọn tốt. Nếu bạn thường xuyên thay đổi chuỗi mẫu, eval: resource là một lựa chọn tốt hơn vì nó không lưu mẫu đã biên dịch.

eval: Xem xét lại mẫu gốc mỗi khi một trang được hiển thị. Đây là một lựa chọn tốt cho các chuỗi có giá trị tái sử dụng lại thấp. Nếu cùng một chuỗi được truy cập thường xuyên, string:resource là một lựa chọn tốt.

Ví dụ 03: Sử dụng Template String

<?php
	$smarty->assign('name','Guest');
	$template_string = 'Chào mừng bạn {$foo} tới www.chiasephp.net';
	$smarty->display('string:'.$template_string); // biên dịch để sử dụng lại sau này
	$smarty->display('eval:'.$template_string); // biên dịch mỗi lần
?>

Hoặc bạn có thể include từ bên trong template.

{include file="string:$template_string"} {* biên dịch để sử dụng lại sau này *}
{include file="eval:$template_string"} {* biên dịch mỗi lần *}

Ví dụ 04: Ví dụ hoàn chỉnh.

<?php 
	error_reporting(E_ALL);
	ini_set('display_errors',1);
	
	require_once("../smarty/Smarty.class.php");
	// Khởi tạo đối tượng Smarty
	$smarty = new Smarty; 
	
	// Assign variables
	$smarty->assign('name','Guest');
	$languages = array('PHP', 'MySQL','Javascript');
	$smarty->assign('languages',$languages);
	
	$template_string = 'Xin chào {$name} tới www.chiasephp.net. <br /><br />
	Học lập trình online các ngôn ngữ lập trình: 
	{section name = i loop = $languages}
	{$languages[i]},
	{/section}
	';
	$smarty->display('eval:'.$template_string);
?>

Kết luận:

Bằng việc này mình đã nảy sinh rất nhiều ý tưởng để hoàn thiện mã nguồn các ứng dụng của mình. Hy vọng với bài viết nhỏ này sẽ giúp ích cho bạn có thêm nhiều kiến thức về Smaty Template Engine.

0