4

我有以下 Smarty 模板,该模板完整显示,可生成一些 JavaScript。

如您所见,我在整个代码片段中都打开{literal}和关闭{/literal}标签,这看起来有点混乱和不守规矩。有没有更好的方法来编写它,使代码在将来必须更改时显得更整洁和更易于管理?

{literal}
<script type="text/javascript">
var _roi = _roi || [];

// Base Order Details 
_roi.push(['_setMerchantId', '{/literal}{$merchant_id}{literal}']); 
_roi.push(['_setOrderId', '{/literal}{$order_id}{literal}']);
_roi.push(['_setOrderAmount', '{/literal}{$order_total}{literal}']);
_roi.push(['_setOrderNotes', '{/literal}{$order_notes}{literal}']);

// Line Items
{/literal}
{foreach from=$line_items item=line name=items}
    {literal}
    _roi.push(['_addItem', 
    '{/literal}{$line.sku}{literal}',
    '{/literal}{$line.title}{literal}',
    '{/literal}{$line.category_id}{literal}',
    '{/literal}{$line.category}{literal}',
    '{/literal}{$line.price}{literal}',
    '{/literal}{$line.quantity}{literal}'
    ]);
    {/literal}
{/foreach}
{literal}

// Submit Transaction to SDC ROI tracker
_roi.push(['_trackTrans']);
</script>
<script type="text/javascript" src="{/literal}{$url}{literal}"></script>{/literal}
4

3 回答 3

8

如果您在 javascript 代码中使用大括号 { 和 },则只需要 {literal} 标签。据我所知,您不使用任何这些,所以我猜您的代码也可以在没有任何 {literal} 标记的情况下运行。即使您要使用几个大括号,您也可以使用 {ldelim} 和 {rdelim} 代替它们,如果这样可以为您节省一些标签(并获得可读性)

(以上适用于smarty 2)

于 2013-02-22T20:04:25.350 回答
3

您可以使用该$auto_literal设置(默认启用)并确保 JavaScript 代码中的任何大括号都被空格包围(通常应该如此)。以后就{literal}不需要了。

在 Smarty 模板中,只要 { 和 } 大括号被空格包围,它们就会被忽略。

于 2013-02-23T14:53:54.993 回答
0

使用 {ldelim} 表示 { 和 {rdelim} 表示 }

更新:根据下面的评论

{literal}{{/literal} and {literal}}{/literal}

将被替换为

{ldelim} {rdelim}

但是 periklis 对原始帖子中的代码有正确的答案。但是要回答 javascript 中 {literal} 的替代方案的问题。在 Smarty 中构建 json 的示例。

{capture assign="row"}{foreach from=$list item=item}
  {ldelim}key1:'{$item['key1val']}',key2:'{$item['key2val']}'{rdelim},
{/foreach}{/capture}
var jsonList = [ {row|trim:','} ];
于 2015-10-21T14:43:35.440 回答