【问题标题】:smarty variables inside javascriptjavascript中的smarty变量
【发布时间】:2011-03-25 04:54:48
【问题描述】:

我正在尝试在 tpl 中的 javascript 中使用 smarty 变量

{literal}
<script language="javascript">
  google.load('visualization','1',{'packages': ['geomap']});
  google.setOnLoadCallback(drawMap);


  function drawMap() {
    var data = new google.visualization.DataTable();
    data.addRows(4);
    data.addColumn('string', 'Location');
    data.addColumn('number', 'Number of links');

{/literal}{foreach from=$last5 item=link name=links key=index}
    data.setValue({$index},0,'{$link.location|replace:'\'':'\\\''}');
    data.setValue({$index},1,{$link.location_count});
{/foreach}{literal}

    var options = {};
    options['dataMode'] = 'regions';
    options['region'] = 'world';

    var container = document.getElementById('map');
    var geomap = new google.visualization.GeoMap(container);

    geomap.draw(data, options);
  };
</script>
{/literal}

你能建议我一个解决方案吗

【问题讨论】:

  • 您的问题是什么?什么不起作用?
  • 这不起作用,语法正确吗?
  • -1 --- 您的链接已过期 - 这真的让我无法使用这篇文章!

标签: javascript smarty


【解决方案1】:

只需在插入 smarty 变量之前关闭 {literal} 标签,然后重新打开它。

或者将 {ldelim} 和 {rdelim} 用于您从 Smarty 分配值的代码片段。

【讨论】:

  • 我是否需要为 smarty 的 foreach 标签这样做
  • 不能在 {literal}{/literal} 中放置 Smarty 标签。当您需要在 Smarty 中放置 foreach、变量、if 或其他任何内容时,您必须在 {literal} 之外进行。如果 JS 很少,最好省略 {literal},而使用 {ldelim} 和 {rdelim} 作为 JS 中需要的文字花括号。
  • 我真的很困惑,我尝试了很多东西,但我无法工作,你能帮我编辑代码并粘贴它
  • 实际上,您的代码应该可以运行。我改变的唯一真实的事情是在一个地方转义了单引号。 pastebin.com/J4ibLz1m也整理了一下。
  • 还有别的。使用 php.net/manual/en/function.json-encode.php 在服务器端生成 JSON 是一个非常非常好的做法。这样你就不必逃避任何东西,你只需要将 JSON 分配给一个 JS 变量,然后在纯 JS 中使用它,用 JS for,绝对没有 Smarty。
【解决方案2】:
{literal}
function doSomething(myNumber){
  var result = myNumber/{/literal}{$myDivider}{literal};
  // rest of code...
}
// more functions...
{/literal}

{literal}
function doSomething(myNumber){
{/literal}
   var result= myNumber/{$myDivider};
{literal}
  // rest of code...
}
// more functions...
{/literal}

function doSomething(myNumber){ldelim}
   var result= myNumber/{$myDivider};
   // rest of code below...
{rdelim}

function doSomeMore(another){ldelim}
   alert('{$myHello}');
   // more code
{rdelim}

OR(Smarty 3.x 及更高版本,不需要文字等)

function doSomething(myNumber){
   var result = myNumber/{$myDivider};
   // rest of code 
}

在 Smarty 3 中,带有空格字符(空格、制表符或换行符)的左大括号不应再与 Smarty 逻辑混淆。使用新版本解决的问题:)

【讨论】:

  • 我在这里也有类似的情况,但有点复杂,看看@我的代码。 {literal}&lt;iframe src="http://www.facebook.com/plugins/registration.php?client_id=2343434234&amp;fb_only=true&amp;redirect_uri=http://localhots/POC/manage_users.php?reg_type={/literal}{$regtype}{literal}&amp;act_action=save_profiledata&amp;fields=[{'name':'name'}, {'name':'email'}, {'name':'gender'}, {'name':'location'}, {'name':'birthday'}]" scrolling="auto" frameborder="no" style="border:none" allowTransparency="true" width="100%" height="360"&gt;&lt;/iframe&gt;{/literal} 在这种情况下,它不会返回完整的 url,但会检索到值。有什么帮助吗?
  • 好吧,至少你有“localhots”,而不是“localhost”。此外,'localhost' 可能是不可接受的,请参阅stackoverflow.com/questions/3707738/…
  • 这种方法{/literal}{$myDivider}{literal} 对我有用。
【解决方案3】:

在尝试 (karvonen) 答案后 [虽然我没有尝试 {rdelim},只尝试了 {literal}],但我的 ajax 请求出现问题,它在 smarty 中断后停止从服务器加载任何日期在 JS 中。所以,我所做的就是将 smarty 值分配给 hidden field(我知道这不是最聪明的做法),然后从 JS 请求该值并因此将其分配给一个变量。 希望这可以帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2011-05-29
    • 2013-04-17
    相关资源
    最近更新 更多