Get Smarty

Donate

Smarty Icon

You may use the Smarty logo according to the trademark notice.

Smarty Template Engine Smarty Template Engine

For sponsorship, advertising, news or other inquiries, contact us at:

Sites Using Smarty

Buy cheap glasses from Cheapglasses123.com and save up to 80%.

Where to buy prescription glasses? EyewearCanada.com is your best choice!

Visit www.sport-kick.com for cheap soccer cleats, sneakers and Soccer Jerseys updates

Advertisement

对象

Smarty可以在模板内使用PHP的 对象

Note

当你赋值/注册一个对象到模板使用时,请确保在模板内使用的属性和方法都是仅为了显示。 要通过对象在模板中嵌入应用逻辑是很容易的事情,但是这样会导致较差的设计而且难以管理。 请参见Smarty网站上最佳实践的文章。

这里有两个方法来使用对象:

  • 第一个方法是注册对象到模板中, 然后按自定义函数相似的方法来使用。

  • 另一个方法是通过assign()将对象赋值给模板, 这种方法对象用起来比较像其他的赋值变量。

第一种方法看起来语法结构更好。而且也更安全,因为注册对象需要限定其方法或者变量的使用。 然而, 注册对象不能进行循环,或者赋值到对象数组,等等。 请根据你的需要来选择用哪种方法,但是首先尽可能保证模板语法的简洁。

如果开启了安全机制,私有方法和函数都不能使用(以'_'开头)。 如果有相同名称的方法或属性,那么该方法将会被使用。

你可以通过将方法或属性列在注册函数的第三个数组参数内,来对它们进行限定。

默认情况下,传递参数给对象的方式和传递给 自定义函数的方式一样。 关联数组作为第一个参数,第二个参数是Smarty对象。 如果你需要一次一个地传递参数,就像传统类的参数传递一样, 那么就设置第四个参数为FALSE

第五个参数是可选的,仅在formatTRUE的时候生效, 而且包含了一个方法的列表,需要按区块的方式使用。 意味着这些方法在模板内有个关闭的标签(如:{foobar->meth2}...{/foobar->meth2}) 而且它们的参数必须按 区块插件函数一样: 它们有四个参数: $params, $content, $smarty&$repeat 而且它们有着和区块插件函数相同的行为。

Example 17.9. 注册或赋值一个对象


<?php
// 类定义

class My_Object {
	function meth1($params, $smarty_obj) {
		return 'this is my meth1';
	}
}

// 注册对象(引用传递)
$smarty->registerObject('foobar',$myobj);

// 列出我们需要限定的部分方法和属性
$smarty->registerObject('foobar',$myobj,array('meth1','meth2','prop1'));

// 如果你需要用传统的对象参数格式,设置第四个参数为false
$smarty->registerObject('foobar',$myobj,null,false);

// 还可以用assign_by_ref将对象赋值给模板
$smarty->assign_by_ref('myobj', $myobj);

$smarty->display('index.tpl');
?>

  

然后在index.tpl内使用对象:


{* 访问注册的对象 *}
{foobar->meth1 p1='foo' p2=$bar}

{* 同样可以赋值给output *}
{foobar->meth1 p1='foo' p2=$bar assign='output'}
the output was {$output}

{* 访问赋值的对象 *}
{$myobj->meth1('foo',$bar)}

  

参见 registerObject()assign().

Comments
No comments for this page.

Advertisement