用于动态JavaScript的Smarty{literal}标签的替代方案


alternative to Smarty {literal} tags for dynamic JavaScript

我有下面的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}

如果在javascript代码中使用花括号{和},则只需要{literal}标记。据我所见,你没有使用任何这些,所以我想你的代码也会在没有任何{literal}标记的情况下运行。即使你要使用几个花括号,你也可以在它们的位置使用{ldelim}和{rdelim},如果这可以节省一些标签(并提高可读性)

(以上适用于smarty 2)

您可以使用$auto_literal设置(默认启用),并确保JavaScript代码中的任何花括号都被空白包围(通常应该是空白)。那么{literal}就不再是必要的了。

在Smarty模板中,只要它们被白色空间包围。

对使用{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:','} ];