Переменная от PHP до Smarty и Javascript

У меня есть объект в php, который передается Smarty как $ smarty-> assign ('o', $ o). Затем мне нужно получить доступ к этому объекту и его свойствам в javascript.

Как вы это делаете, без javascript в tpl. Я хочу, чтобы все они были во внешнем файле.

Если это невозможно, как это сделать?

Чтобы комбинировать ответы zerkms и Didozavar, вот функция повторного использования модификатора:

<?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} с помощью настраиваемой функции.

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

Нет, это невозможно. Метод assign Smarty просто передает данные с php на шаблоны.

Вы можете создать собственную функцию smarty, которая выведет необходимые js и будет использовать его как модификатор в ваших шаблонах:

 {$o|jsify} 

<script type="text/javascript"> var variable = {variable}; </script>

Я использовал следующий метод, и он работает для меня, используя двойную цитату arround smarty variable (одинарная кавычка не работает в моем случае)

 var base_dir = "{$base_dir}"; 

Я считаю, что нашел решение таким образом, что ..content не появится в .tpl и, следовательно, html

передать переменную php переменной javascript непосредственно в .php, она будет работать, а не … содержимое появится в .tpl и html

Я использовал следующую технику, и это сработало для меня довольно хорошо.

В файле test.php.

  $t = new template(); $t->assign("testVar", $testVar); $t->fetch("test.tpl"); 

В файле test.tpl. создать div с grabMe.

  <div id="grabMe">{$testVar}</div> {literal} <script language="javascript" type="text/javascript"> var testVar = $("#grabMe").text(); </script> {/literal} 

Он работает нормально.