Khai báo [set] trong Smarty Template

Smarty Engine 16/03/2017 07:00 1271
Tiếp tục chủ đề về Smarty. Thì mình và các bạn sẽ cùng nhau tìm hiểu hàm {set} trong Smarty là gì. Khai báo mảng ngoài template với hàm {set}

Trong Smarty Template Engine khi bạn muốn khai báo một biến ngoài template thì bạn sử dụng hàm assign.

{assign var="name" value="Nguyến Văn A"}
{assign var="age" value="20"}

Nếu trong ứng dụng của bạn có sử dụng Smarty. Đặc biệt là Smarty 2.x bạn không thể khai báo một biến mảng, hoặc kiểm tra điều kiện nào đó trước khi khởi tạo và gán giá trị của biến ngoài Template được. Do đó bạn chỉ có thể khai báo trong PHP rồi assign chúng ra ngoài template.

<?php 
    global $smarty;
    $skills = array('PHP', 'MySQL', HTML);
    // Smarty assign
    $smarty->assign('skills',$skills);
?>

Do nhu cầu công việc đôi khi bạn cần khai báo biến, hoặc một mảng ngoài template, hơn nữa là kiểm tra biến đó có tồn tại hay không trước khi khai báo biến ngoài template thì hàm assign không thể đáp ứng được việc đó.

{assign var = skills value = array('PHP','MySL','PHP')}
// Hoặc
{assign var = skills value = array(1=>'PHP',2=>'MySL',3=>'PHP')}
// Hoặc
{assign var = skills value = [1=>'PHP',2=>'MySL',3=>'PHP']}

Hàm {set} ngoài tính năng như một hàm assign thông thường. Nó còn cho phép bạn kiểm tra một số điều kiện đầu vào trước khi nó khởi tạo và gán giá trị cho biến đó. Hỗ trợ các hàm ('empty', '!empty', 'is_null', '!is_null', 'isset', '!isset', 'is_void')

P/s: Có thể phiên bản Smarty 3.x đã hỗ trợ những tính năng này nhưng vì một số lý do bạn không thể nâng cấp nó thì sử dụng phương án này sẽ đáp ứng được yêu cầu của bài toán của bạn.

Cú pháp

{set var=$[Tên_Biến] value = [Giá_Trị]}

Trong đó:

  • [Giá_Trị]: Có thể là một chuỗi, một số,array.

Ví dụ 01:

{set var=$name value = 'Nguyến Văn A'}
{set var=$age value = '20'}

// Hoặc kiểm tra điều kiện và gán giá trị
// Nếu $foo==NULL thì $foo = bar
{set var=$foo value="bar" if=is_null}

// Hoặc khai báo mảng
{set var=$skills value=array('PHP','MySQL','HTML')}

Trong thư mục plugins của Smarty. Bạn tạo một file compiler.set.php với tên là và copy và dán đoạn code bên dưới hoặc bạn có thể tải về từ đây:

<?php
/**
 * Smarty {set} compiler function plugin
 *
 * File:     compiler.set.php<br>
 * Type:     compiler function<br>
 * Name:     set<br>
 * Purpose:  Set a value to a variable (also arrays).<br>
 * The optional parameter "if" is used to set the value if the test is true. The test can be: 'empty', '!empty', 'is_null', '!is_null', 'isset', '!isset', 'is_void'.
 * The new command 'is_void' test if the variable is empty and != 0, very useful for test $_REQUEST parameters.
 *
 * @param array parameters "var": variable. "value": value to assign. "if": assign the value only if this test is true (tests avaiables: 'empty', '!empty', 'is_null', '!is_null', 'isset', '!isset', 'is_void').
 * @param Smarty_Compiler object
 * @return void|string
 */
function smarty_compiler_set($params, &$smarty) {
	// Extract if "value" parameter contain an array
	$regularExpression = '/ value=array\([\'"]?.*[\'"]?\)/';
	if (preg_match($regularExpression, $params, $array)) {
		$array = substr($array[0], 7);
		$params = preg_replace($regularExpression, '', $params);
	}

	$params = $smarty->_parse_attrs($params);
	// Functions permitted in "if" parameter.
	$functionsPermitted = array('empty', '!empty', 'is_null', '!is_null', 'isset', '!isset', 'is_void'); 

	if (!isset($params['var'])) {
		$smarty->_syntax_error("set: missing 'var' parameter", E_USER_WARNING);
		return;
	}
	if (!empty($array)) {
		$params['value'] = $array;
	}

	if (!isset($params['value'])) {
		// Clean setting
		return "{$params['var']} = null;";
	} elseif (isset($params['if'])) {
		// Setting with "if" parameter
		$params['if'] = substr($params['if'], 1, -1);
		if (in_array($params['if'], $functionsPermitted)) {
			if ($params['if'] == 'is_void') {
				// "is_void" command
				return "if (empty({$params['var']}) and ({$params['var']} !== 0) and ({$params['var']} !== '0')) {$params['var']} = {$params['value']};";
			} else {
				// others commands
				return "if ({$params['if']}({$params['var']})) {$params['var']} = {$params['value']};";
			}
		} else { 
			// "if" parameter not correct
			$smarty->_syntax_error("set: 'if' parameter not valid", E_USER_WARNING);
			return;
		}
	} else {
		// normal setting
		return "{$params['var']} = {$params['value']};";
	}
}
?>

Tổng kết.

Mình hy vọng bài viết sẽ giúp ích cho các bạn làm chủ được Smarty Template Engine.

Xem Thêm

Profile photo of adminTheHalfHeart

B.V.T

Sinh ra và lớn nên ở Bắc Giang. Hiện tại thì tôi đang là một lập trình viên tại VietISO. Tôi lập website này với mục đích là bookmark những gì tôi đã đọc qua và mong muốn chia sẻ những gì tôi biết.