如何将Scala变量注入Scala模板HTML

时间:2015-09-24 12:51:07

标签: java html scala playframework

让我解释一下我的要求。目前我们正在使用Scala模板,该模板具有一些HTML代码和Scala属性。

示例 test.scala.html

@(hostName: String, token: String, protocol: String, supportEmail: String)
@import helper._
<!DOCTYPE html>

<html>
<head>
    <title></title>    
</head>
<table>
<tr>
            <td>&nbsp;</td>
            <td style="color: #626262;">                
                <p style="font-size:14px;">
                    <br/>
                    Our app will let you access your company intranet.<br/><br/>
                    Your activation code is <b>@token</b><br/><br/>

                    If you have any questions, please contact our <a href="mailto:@supportEmail">support team</a> anytime.
                    <br/><br/>
                    Best regards,<br/>
                       The Support Team
                    </p>
                </td>
            </tr>
        </table>
    </body>

如果你看到上面的代码@token@supportEmail是动态的,我们就会传递给Scala。

直到现在看起来不错。需求发生变化,客户现在希望我们从数据库中读取内容。他们想要保存实际的html内容( table ...表的末尾)。

所以我把代码存放在数据库列中。我可以使用@Html将此内容传递给我的查看功能。

现在我的新Scala视图功能如下所示:

@(hostName: String, token:String, protocol: String, supportEmail: String, content: String)
@import helper._
<!DOCTYPE html>

<html>
<head>
    <title></title>    
</head>
 @Html(content) 

   

我无法动态传递@token@supportEmail。它被视为一个普通的字符串。渲染后,它看起来如下所示:

  

我们的应用程序允许您从设备访问公司的Intranet,文件和SaaS服务。

     

您的激活码是@token

     

如果您有任何疑问,请随时与我们的支持团队@supportEmail联系。

     

最好的问候,
     支持团队

任何人都可以解释我@Html的错误,我可以解析动态内容吗?如果没有,有没有其他选择。

1 个答案:

答案 0 :(得分:0)

@Html函数允许您从变量插入HTML片段,而不会转义<>等特殊字符。但是,它仅适用于静态HTML,遗憾的是它不会解析其中的其他Scala代码。

在您的情况下,实现您的要求的最简单方法是在将内容传递给视图之前准备控制器中的内容。控制器方法中的代码看起来或多或少是这样的:

public Result showContent() {
    //fetching all your data here
    content = content.replace("@token", token);
    content = content.replace("@supportEmail", supportEmail);
    return ok(views.html.test.render(hostName, protocol, content));
}

基本上,您不必在表格内容中使用Twirl占位符。决定如何在内容中标记可替换参数取决于您。只需确保replace次调用符合您的模式即可。

我认为tokensupportEmail未在视图的其他位置使用,因此我将其从视图的标题中删除。

@(hostName: String, protocol: String, content: String)

简单的解决方案通常是最好的解决方案:)