从PHP传递到Smarty和Javascript的变量
问题描述:
我在php中有一个对象,该对象像$ smarty-> assign('o',$ o)一样传递给Smarty.然后,我需要访问该对象及其在javascript中的属性.
I have an object in php, which is passed to Smarty like $smarty->assign('o',$o) Then I need to access that object and it's properties in javascript.
您如何做到这一点,而在tpl中没有任何JavaScript.我希望它们都在一个外部文件中.
How do you do it, without having any javascript in tpl. i want them all in an external file.
如果不可能,该怎么办?
If not possible, how to do it?
答
要结合zerkms和Didozavar的答案,下面是一个可重用的修饰函数:
To combine zerkms's and Didozavar's answers, here's a reusable modifier function:
<?php
function jsify($object, $name = 'foo'){
$json_object = json_encode($object);
return "<script type=\"text/javascript\"> var $name = $json_object; </script>";
}
$smarty->register_modifier("jsify", "jsify");
$smarty->assign("foo", $foo);
$smarty->assign("bar", $bar);
?>
{* In Template *}
{$foo|jsify}
{$bar|jsify:bar}
{* Verify *}
<script type="text/javascript">
// assuming you're using a browser that supports console
console.log(foo);
console.log(bar);
</script>
考虑了这一点之后,将其与自定义函数镜像模板函数 {assign}
可能会更加一致.
After thinking about this, it might be more consistent to make it mirror the template function {assign}
with a custom function.
<?php
function assign_to_javascript($params, $template){
// validate params values
$name = $params['var'];
$json_object = json_encode($params['value']);
echo "<script type=\"text/javascript\"> var $name = $json_object; </script>";
}
$smarty->register_function("assign_to_javascript", "assign_to_javascript");
$smarty->assign("foo", $foo);
$smarty->assign("bar", $bar);
?>
{* In Template *}
{assign_to_javascript var="foo" value=$foo}
{assign_to_javascript var="bar" value=$bar}
{* Verify *}
<script type="text/javascript">
// assuming you're using a browser that supports console
console.log(foo);
console.log(bar);
</script>