使用Maypole进行快速Web应用开发:第2部分
当我们"上次":离开我们无畏的web开发者的时候,他已经成功地用11行代码建立了一个在线销售目录。然而现在,他必须接着将这变成一个带有购物车以及相关组件的销售站点。是时候该看些关于我们上星期谈及的可扩展性了;不幸的是,这意谓着我们必须再多写一些代码(事情总不是十全十美的对吧)。
我是谁?
为了把购物车加入站点,我们需要介绍一下当前用户的概念。这将会允许站点的访问者登录并且拥有他们自己的购物车。我们将把二个新的表加入数据库,一个表储存关于用户的详情,一个表代表购物车。我们的表看起来会是这样:
CREATETABLEuser(idintnotnullauto_incrementprimarykey,first_namevarchar(64),last_namevarchar(64),emailvarchar(255),passwordvarchar(64),address1varchar(255),address2varchar(255),statevarchar(255),postal_codevarchar(64),countryvarchar(64));CREATETABLEcart_item(idintnotnullauto_incrementprimarykey,userint,itemint);像以前一样,Maypole会自动为表创建类。我们使用Class::DBI的自动关联能力来让Maypole处理这些新增的表:
ISellIt::User->has_many("cart_items"=>"ISellIt::BasketItem");ISellIt::BasketItem->has_a("user"=>"ISellit::User");ISellIt::BasketItem->has_a("item"=>"ISellit::Product");我们现在需要一个方法把有关当前用户的信息告诉我们的应用程序。在Maypole文档中,关于Maypole的认证系统有一段很长的说明,但是引入当前用户概念最容易的方法之一是使用Maypole::Authentication::UserSessionCookie模块。
顾名思义,这个模块把每个用户和一个session相关联,并给用户的浏览器发送一个cookie。同时也负责确认用户的登录凭证,默认方法是在一张数据库表中查找用户名和密码;这正是我们想要的!
Maypole提供一个authenticate方法给我们重载,而且在这里我们会拦截任何一个需要合法用户身份的请求,比如查看购物车,把物品加入订单等等。
UserSessionCookie模块提供的一个get_user方法,它负责所有对cookie和登陆凭证进行设置的工作。我们唯一需要做的就是告诉它,我们想用用户的电子邮件地址和密码作为登录凭证,而不是一些随意的用户名。我们可以在我们的应用程序配置中对这些进行指定,如同UserSessionCookie文档中所述:
ISellIt->{config}->{auth}->{user_field}="email";下一步,我们建立一个登录模板,用来显示一个表单给用户提交他们的凭证;在Maypole手册Request章节中就有一个,我们可以加以修改以适合我们的需要:
<h2>Youneedtologinbeforebuyinganything</h2><DIVclass="login"><FONTCOLOR="#FF0000"></FONT><FORMACTION="/"METHOD="post">EmailAddress:<INPUTTYPE="text"NAME="email"><BR>Password:<INPUTTYPE="password"NAME="password"><BR><INPUTTYPE="submit"></FORM></DIV>那么现在登录的问题解决了;如果一个用户提交了正确的凭证,get_user将会把用户的ISellIt::User对象作为$r->{user}放进Maypole请求对象中,然后继续处理用户的请求。
因为现在我们有了一个可用的用户对象,当然就可以在其他地方使用这个用户的信息:
由于我们会在很多地方提及这个用户,所以我们把它作为一个额外的参数my传给模板。Maypole有一个很牛的hook方法additional_data,非常适合用来做这个。
subadditional_data{my$r=shift;$r->{template_args}{my}=$r->{user};}我们给它取名为my,举例来说我们可以这样调用它:
<DIVclass="messages">Welcomeback,!</DIV>所以现在我们有一个用户。我们可以增加一个新的动作order,把一个物品加入用户的购物车:
packageISellIt::Product;suborder:Exported{my($self,$r,$product)=@_;$r->{user}->add_to_cart_items({item=>$product});$r->{template}="view";}这会在cart_item表里添加一个条目,把物品和用户关联起来,然后让我们返回先前的页面来查看物品。
我们已经把我们的用户送回了先前的页面,但没有提示说我们刚才确实把一个物品加入了他的购物车;我们能通过把信息传进模板来给出这样的提示:
然后显示它:
<DIVclass="messages">We"vejustaddedthisitemtoyourshoppingcart.Tocompleteyourtransaction,please<AHREF="/user/view_cart">viewyourcart</A>andcheckout.</DIV>那么,现在我们得允许用户查看购物车。
显示购物车
这也被证明了是相当简单的(Maypole中的大多数事物都是)只需要调用用户类的一个动作。我们需要把用户购物车的物品加入我们的Maypole请求对象中:
packageISellIt::User;subview_cart:Exported{my($self,$r)=@_;$r->{objects}=;}然后我们需要制作一个显示他们的user/view_cart模板:
<h2>YourShoppingCart</h2><TABLE><TR><TH>Product</TH><TH>Price</TH></TR><TD></TD><TD></TD><TD><FORMACTION="/cart_item/delete/"><INPUTTYPE="submit"VALUE="Removefromcart"></FORM></TD></tr></TABLE><AHREF="/user/checkout">Checkout!</A>再次重申,这里的HTML代码写得并不好,但它也提供给了一些东西使得我们能把它交给设计人员进行很好地设计。现在该对购物车结帐了……
结帐
构建一个电子商务应用程序最困难的部份就是与付款和信用卡结算服务的交互。我们将使用"Business::OnlinePayment":http://search.cpan.org/perldoc?Business::OnlinePayment来处理这方面的事情,处理结算订单则是简单地发一封电子邮件。
真正的结算页面只需要收集信用卡和送货信息,所以实际上它不需要任何对象;事实上我们接下来唯一需要的对象是ISellIt::User,它已经由认证过程纳入请求对象中。无论如何我们的确需要
-
相关文章
2秒记住本站域名
玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn
