从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>