| Handel documentation | Contained in the Handel distribution. |
Catalyst::Helper::Controller::Handel::Order - Helper for Handel::Order Controllers
script/create.pl controller <newclass> Handel::Order [<modelclass>]
script/create.pl controller Orders Handel::Order OrderModel
A Helper for creating controllers based on Handel::Order objects. If no modelclass is specified, ::M::Orders is assumed.
The modelclass argument tries to do the right thing with the names given to it.
For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully qualified package name:
MyApp::M::OrderModel
MyApp::Model::OrderModel
OrderModel
In all three cases everything before M{odel)|C(ontroller) will be stripped and the class OrderModel will be used.
The code generated by this helper requires FormValidator::Simple and YAML to be installed to operate.
Makes a Handel::Order Controller class and template files for you.
Makes a Handel::Order Controller test for you.
Christopher H. Laco
CPAN ID: CLACO
claco@chrislaco.com
http://today.icantfocus.com/blog/
| Handel documentation | Contained in the Handel distribution. |
# $Id$ ## no critic (ProhibitCaptureWithoutTest) package Catalyst::Helper::Controller::Handel::Order; use strict; use warnings; BEGIN { use Catalyst 5.7001; use Catalyst::Utils; use Path::Class; };
sub mk_compclass { my ($self, $helper, $model) = @_; my $file = $helper->{'file'}; my $dir = dir($helper->{'base'}, 'root', $helper->{'uri'}); $model ||= 'Order'; $model =~ /^(.*::M(odel)?::)?(.*)$/i; $model = $3 ? $3 : 'Order'; $helper->{'model'} = $model; $helper->{'action'} = Catalyst::Utils::class2prefix($helper->{'class'}); $helper->mk_dir($dir); $helper->render_file('controller', $file); $helper->render_file('default', file($dir, 'default')); $helper->render_file('view', file($dir, 'view')); $helper->render_file('errors', file($dir, 'errors')); $helper->render_file('profiles', file($dir, 'profiles.yml')); $helper->render_file('messages', file($dir, 'messages.yml')); return 1; };
sub mk_comptest { my ($self, $helper) = @_; my $test = $helper->{'test'}; $helper->render_file('test', $test); return 1; };
1; __DATA__
sub COMPONENT { my $self = shift->NEXT::COMPONENT(@_); $self->{'validator'} = FormValidator::Simple->new; $self->{'validator'}->set_messages( $_[0]->path_to('root', '[% action %]', 'messages.yml') ); $self->{'profiles'} = YAML::LoadFile($_[0]->path_to('root', '[% action %]', 'profiles.yml')); return $self; };
sub default : Private { my ($self, $c) = @_; $c->stash->{'template'} = '[% action %]/default'; if ($c->sessionid && $c->session->{'shopper'}) { my $orders = $c->model('[% model %]')->search({ shopper => $c->session->{'shopper'}, type => ORDER_TYPE_SAVED }); $c->stash->{'orders'} = $orders; }; return; };
sub create : Private { my ($self, $c, $cart) = @_; if ($c->sessionid && $c->session->{'shopper'}) { return $c->model('[% model %]')->create({ shopper => $c->session->{'shopper'}, type => ORDER_TYPE_TEMP, cart => $cart }); }; return; };
sub load : Private { my ($self, $c) = @_; if ($c->sessionid && $c->session->{'shopper'}) { return $c->model('[% model %]')->search({ shopper => $c->session->{'shopper'}, type => ORDER_TYPE_TEMP })->first; }; return; };
sub view : Local { my ($self, $c, $id) = @_; $c->stash->{'template'} = '[% action %]/view'; if ($id && $c->sessionid && $c->session->{'shopper'}) { if ($c->forward('validate', [{id => $id}])) { my $order = $c->model('[% model %]')->search({ shopper => $c->session->{'shopper'}, id => $id, type => ORDER_TYPE_SAVED })->first; if ($order) { $c->stash->{'order'} = $order; $c->stash->{'items'} = $order->items; }; }; }; return; };
sub validate : Private { my ($self, $c, $query) = @_; $query ||= $c->req; $self->{'validator'}->results->clear; my $results = $self->{'validator'}->check( $query, $self->{'profiles'}->{$c->action} ); if ($results->success) { return $results; } else { $c->stash->{'errors'} = $results->messages($c->action); }; return; };
1; __test__ use Test::More tests => 3; use strict; use warnings; use_ok('Catalyst::Test', '[% app %]'); use_ok('[% class %]'); ok(request('[% uri %]')->is_success, 'Request should succeed'); __default__ [% TAGS [- -] -%] [% USE HTML %] <h1>Your Order History</h1> [% IF orders.count %] <table border="0" cellpadding="3" cellspacing="5"> <tr> <th align="left">Order#</th> <th align="right">Created</th> </tr> [% WHILE (order = orders.next) %] <tr> <td align="left"> <a href="[% c.uri_for('[- uri -]/view', order.id, '') %]">[% HTML.escape(order.number) %]</a> </td> <td> [% HTML.escape(order.updated) %] </td> </tr> [% END %] </table> [% ELSE %] <p>You have no orders.</p> [% END %] __view__ [% TAGS [- -] -%] [% USE HTML %] <h1>Order Details</h1> [% INCLUDE [- action -]/errors %] [% IF order %] <table border="0" cellpadding="3" cellspacing="5"> <tr> <th colspan="2" align="left">Billing</th> <th width="50"></th> <th colspan="2" align="left">Shipping</th> </tr> <tr> <td colspan="5" height="5"> </td> </tr> <tr> <td align="right">Order Number:</td> <td align="left">[% HTML.escape(order.number) %]</td> <td colspan="3"></td> </tr> <tr> <td align="right">Order Created:</td> <td align="left">[% HTML.escape(order.updated) %]</td> <td colspan="3"></td> </tr> <tr> <td colspan="5" height="5"> </td> </tr> <tr> <td align="right">First Name:</td> <td align="left">[% HTML.escape(order.billtofirstname) %]</td> <td></td> <td align="right">First Name:</td> <td align="left">[% HTML.escape(order.shiptofirstname) %]</td> </tr> <tr> <td align="right">Last Name:</td> <td align="left">[% HTML.escape(order.billtolastname) %]</td> <td></td> <td align="right">Last Name:</td> <td align="left">[% HTML.escape(order.shiptolastname) %]</td> </tr> <tr> <td colspan="5" height="5"> </td> </tr> <tr> <td align="right">Address:</td> <td align="left">[% HTML.escape(order.billtoaddress1) %]</td> <td></td> <td align="right">Address:</td> <td align="left">[% HTML.escape(order.shiptoaddress1) %]</td> </tr> <tr> <td align="right"></td> <td align="left">[% HTML.escape(order.billtoaddress2) %]</td> <td></td> <td align="right"></td> <td align="left">[% HTML.escape(order.shiptoaddress2) %]</td> </tr> <tr> <td align="right"></td> <td align="left">[% HTML.escape(order.billtoaddress3) %]</td> <td></td> <td align="right"></td> <td align="left">[% HTML.escape(order.shiptoaddress3) %]</td> </tr> <tr> <td align="right">City:</td> <td align="left">[% HTML.escape(order.billtocity) %]</td> <td></td> <td align="right">City:</td> <td align="left">[% HTML.escape(order.shiptocity) %]</td> </tr> <tr> <td align="right">State/Province:</td> <td align="left">[% HTML.escape(order.billtostate) %]</td> <td></td> <td align="right">State/Province:</td> <td align="left">[% HTML.escape(order.shiptostate) %]</td> </tr> <tr> <td align="right">Zip/Postal Code:</td> <td align="left">[% HTML.escape(order.billtozip) %]</td> <td></td> <td align="right">Zip/Postal Code:</td> <td align="left">[% HTML.escape(order.shiptozip) %]</td> </tr> <tr> <td align="right">Country:</td> <td align="left">[% HTML.escape(order.billtocountry) %]</td> <td></td> <td align="right">Country:</td> <td align="left">[% HTML.escape(order.shiptocountry) %]</td> </tr> <tr> <td align="right">Day Phone:</td> <td align="left">[% HTML.escape(order.billtodayphone) %]</td> <td></td> <td align="right">Day Phone:</td> <td align="left">[% HTML.escape(order.shiptodayphone) %]</td> </tr> <tr> <td align="right">Night Phone:</td> <td align="left">[% HTML.escape(order.billtonightphone) %]</td> <td></td> <td align="right">Night Phone:</td> <td align="left">[% HTML.escape(order.shiptonightphone) %]</td> </tr> <tr> <td align="right">Fax:</td> <td align="left">[% HTML.escape(order.billtofax) %]</td> <td></td> <td align="right">Fax:</td> <td align="left">[% HTML.escape(order.shiptofax) %]</td> </tr> <tr> <td align="right">Email:</td> <td align="left">[% HTML.escape(order.billtoemail) %]</td> <td></td> <td align="right">Email:</td> <td align="left">[% HTML.escape(order.shiptoemail) %]</td> </tr> <tr> <td colspan="5" height="5"> </td> </tr> <tr> <td align="right" valign="top">Comments:</td> <td colspan="4" valign="top">[% HTML.escape(order.comments) %]</td> </tr> <tr> <td colspan="5" height="5"> </td> </tr> <tr> <td colspan="5"> <table border="0" cellpadding="3" cellspacing="5" width="100%"> <tr> <th align="left">SKU</th> <th align="left">Description</th> <th align="right">Price</th> <th align="center">Quantity</th> <th align="right">Total</th> </tr> [% WHILE (item = items.next) %] <tr> <td align="left">[% HTML.escape(item.sku) %]</td> <td align="left">[% HTML.escape(item.description) %]</td> <td align="right">[% HTML.escape(item.price.as_string('FMT_SYMBOL')) %]</td> <td align="center">[% HTML.escape(item.quantity) %]</td> <td align="right">[% HTML.escape(item.total.as_string('FMT_SYMBOL')) %]</td> </tr> [% END %] <tr> <td align="right" colspan="4">Subtotal:</td> <td align="right">[% HTML.escape(order.subtotal.as_string('FMT_SYMBOL')) %]</td> </tr> <tr> <td align="right" colspan="4">Tax:</td> <td align="right">[% HTML.escape(order.tax.as_string('FMT_SYMBOL')) %]</td> </tr> <tr> <td align="right" colspan="4">Shipping:</td> <td align="right">[% HTML.escape(order.shipping.as_string('FMT_SYMBOL')) %]</td> </tr> <tr> <td align="right" colspan="4">Handling:</td> <td align="right">[% HTML.escape(order.handling.as_string('FMT_SYMBOL')) %]</td> </tr> <tr> <td align="right" colspan="4">Total:</td> <td align="right">[% HTML.escape(order.total.as_string('FMT_SYMBOL')) %]</td> </tr> </table> </td> </td> </table> [% ELSE %] <p>The order requested could not be found.</p> [% END %] [% TAGS [- -] -%] __errors__ [% TAGS [- -] -%] [% IF errors %] <ul class="errors"> [% FOREACH error IN errors %] <li>[% HTML.escape(error) %]</li> [% END %] </ul> [% END %] __messages__ [% action %]/view: id: REGEX: The id field is in the wrong format. __profiles__ [% action %]/view: - id - - - REGEX - !!perl/regexp (?i-xsm:^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$) __END__