使用Maypole进行快速Web应用开发:第2部分

作者:凯旋网络来源:凯旋网络
个额外的参数my传给模板。Maypole有一个很牛的hook方法additional_data,非常适合用来做这个。

subadditional_data{my$r=shift;$r->{template_args}{my}=$r->{user};}

我们给它取名为my,举例来说我们可以这样调用它:

<DIVclass="messages">Welcomeback,[my.first_name]!</DIV>

所以现在我们有一个用户。我们可以增加一个新的动作order,把一个物品加入用户的购物车:

packageISellIt::Product;suborder:Exported{my($self,$r,$product)=@_;$r->{user}->add_to_cart_items({item=>$product});$r->{template}="view";}

这会在cart_item表里添加一个条目,把物品和用户关联起来,然后让我们返回先前的页面来查看物品。

我们已经把我们的用户送回了先前的页面,但没有提示说我们刚才确实把一个物品加入了他的购物车;我们能通过把信息传进模板来给出这样的提示:

suborder:Exported{my($self,$r,$product)=@_;$r->{user}->add_to_cart_items({item=>$product});$r->{template}="view";$r->{template_args}{bought}=1;}

然后显示它:

[IFbought]<DIVclass="messages">We''vejustaddedthisitemtoyourshoppingcart.Tocompleteyourtransaction,please<AHREF="/user/view_cart">viewyourcart</A>andcheckout.</DIV>[END]

那么,现在我们得允许用户查看购物车。

显示购物车

这也被证明了是相当简单的(Maypole中的大多数事物都是)只需要调用用户类的一个动作。我们需要把用户购物车的物品加入我们的Maypole请求对象中:

packageISellIt::User;subview_cart:Exported{my($self,$r)=@_;$r->{objects}=[$r->{user}->cart_items];}

然后我们需要制作一个显示他们的user/view_cart模板:

[PROCESSheader]<h2>YourShoppingCart</h2><TABLE><TR><TH>Product</TH><TH>Price</TH></TR>[SETcount=0;FORitem=objects;SETcount=count 1;"<tr";''class="alternate"''IFcount2;">";]<TD>[item.product.name]</TD><TD>[item.product.price]</TD><TD><FORMACTION="/cart_item/delete/[item.id]"><INPUTTYPE="submit"VALUE="Removefromcart"></FORM></TD></tr>[END]</TABLE><AHREF="/user/checkout">Checkout!</A>

再次重申,这里的HTML代码写得并不好,但它也提供给了一些东西使得我们能把它交给设计人员进行很好地设计。现在该对购物车结帐了……

结帐

构建一个电子商务应用程序最困难的部份就是与付款和信用卡结算服务的交互。我们将使用"Business::OnlinePayment":http://search.cpan.org/perldoc?Business::OnlinePayment来处理这方面的事情,处理结算订单则是简单地发一封电子邮件。

真正的结算页面只需要收集信用卡和送货信息,所以实际上它不需要任何对象;事实上我们接下来唯一需要的对象是ISellIt::User,它已经由认证过程纳入请求对象中。无论如何我们的确需要显示物品总费用,所以,为了使事情变得更简单,我们会添加一个动作用Perl来计算它。我们为用户的总费用建立一个方法,以备后用:

packageISellIt::User;useList::Utilqw(sum);subbasket_cost{my$self=shift;summap{



使用Maypole进行快速Web应用开发:第2部分 - 凯旋网络










使用Maypole进行快速Web应用开发:第2部分

作者:凯旋网络来源:凯旋网络
content
  • 广告推荐
    ->item->price}$self->basket_items}

    再定义checkout把总额加入我们的模板:

    subcheckout:Exported{my($self,$r)=@_;$r->{template_args}{total_cost}=$r->{user}->basket_cost;}

    现在我们写我们的user/checkout模板:

    [PROCESSheader]<h2>Checkout</h2><p>Pleaseenteryourcreditcardanddeliverydetails.</p><fo
  • 广告推荐