这里有一些不好的方法和一些好的方法来处理这个问题。
坏方法
在代码中粘贴 HTML。
my $form_htm = <<EOF
<input value="$in{firstname}" name="firstname">
<input value="$in{surname}" name="surname">
...etc...
EOF
这是一件很常见的事情。它有很大的问题。首先,它将程序的逻辑与显示的内容结合在一起。要么只有一种方式来显示它,要么你的代码变得越来越复杂,试图允许多种方式来显示它。你遇到了这个问题。
其次,这意味着要改变外观,您需要开发人员参与。您不能让单独的 UX 人员处理 HTML 和 CSS 布局,他们还需要了解 Perl 或让 Perl 开发人员参与其中。这使得进行其他简单的 HTML 更改变得非常昂贵和缓慢。
第三,生成 HTML 的代码散布在它周围,因此很难弄清楚每个页面是如何形成的。如果要更改页面中的表单,则必须在代码中四处寻找它的生成方式。
第四,它很慢。每个页面都必须由服务器生成。
在您的 HTML 中粘贴代码。
<%class>
has 'amount';
has 'name';
</%class>
Dear <% $.name %>,
We are pleased to inform you that you have won $<% sprintf("%.2f", $.amount) %>!
Sincerely,
The Lottery Commission
<%init>
die "amount must be a positive value!" unless $.amount > 0;
</%init>
这就是 PHP 和 Mason 所做的。 比在代码中粘贴 HTML 更好,但它仍然存在重大问题。它可以很好地使用,但它鼓励你在模板中加入太多的逻辑。这分散了逻辑,使其难以理解正在发生的事情。模板中的代码很难记录和测试。它还将代码混合到模板中,这再次模糊了 UX 人员和开发人员之间的界限。
好方法
MVC:模型-视图-控制器
模型-视图-控制器在数据和逻辑(“模型”)及其显示方式(“视图”)之间提供了清晰的划分。这些与一些代码连接,以从模型中获取数据并将其作为变量(“控制器”)发送到视图。
这是组建网站的最成功的方法之一。 Ruby On Rails 和Catalyst 就是围绕这个构建的。
我推荐Dancer。它比 Catalyst 更小更容易理解。由于它提供的更少,因此更容易调整现有程序以使用它。它提供视图和控制器,模型由你决定。
有两种很好的方式来组合视图。
HTML 模板。
通常的方法是将整个 HTML 页面放在一个模板中,就像我们之前看到的那样,但它没有自己的代码来获取数据,而是传递数据以供使用。它使用有限的语言来处理这些数据。
在 Perl 中,这通常是 Template Toolkit。
Dear [% name %],
It has come to our attention that your account is in
arrears to the sum of [% debt %].
Please settle your account before [% deadline %] or we
will be forced to revoke your Licence to Thrill.
The Management.
现在用户体验人员可以自行管理 HTML 模板。他们仍然需要学习一种模板语言,但它至少是一种有据可查的语言。有限的语言不鼓励在模板中放置太多代码,从而在视图和其余代码之间创建一种防火墙。
但是格式化模板的所有工作仍然必须在服务器端完成。而且UX人员仍然需要学习一种特殊的模板语言。这给我们带来了最好的方式。
纯 HTML、CSS 和 Javascript。
在这种模式下,HTML 不是在服务器端处理模板并将变量插入其中,而是使用 Javascript 来请求所需的数据并在它认为合适的时候显示它。这有很大的优势。
它将视图与代码的其余部分完全分开。这使 UX 人员可以很好地控制应用程序的行为方式。他们决定每个页面需要什么数据。他们决定如何操作和显示它。开发者可以专注于提供数据。
另一个优点是使用 Javascript。 Javascript 已成为网页设计师必须了解的事实上的编程语言。 UX 人员不需要学习特殊的模板语言,他们使用的 HTML、CSS 和 Javascript 与他们一直使用的相同。
最后,这意味着大部分格式化工作都在客户端完成,从而减少了服务器的负载。
主要缺点是这需要对现有系统进行重大的重新架构。现在,您的服务器代码不再生成 HTML 页面,而是生成 JSON 供 Javascript 通过 REST requests 操作。
混合模板 + Javascript
现有系统的一个很好的混合是使用模板,但不是使用特殊的模板语言,而是使用 Javascript。名称和金额等简单的标量变量仍可作为模板变量提供,但列表和散列等较大的单位作为 JSON 注入模板。
比如这个模板……
var people = [% people %]
将提供people = encode_json(\@people)',它可能会扩展为:
var people = ["Jack", "Jill", "Jane", "Joe"]
然后,UX 人员可以使用这个 Javascript people 数组为所欲为。
不利的一面是,这仍然让开发人员过多地控制网站的工作方式,因为他们决定使用哪些模板以及提供哪些数据,这仍然意味着模板必须在服务器端进行扩展。
从好的方面来说,它允许 UX 人员以他们喜欢的方式操作数据,它强制将视图和其余代码明确分离,并且您可以转换现有代码以使用这些模板一次。