NAME
Template::Plugin::Handel::Cart - Template Toolkit plugin for shopping cart
SYNOPSIS
[% USE Handel.Cart %]
[% IF (cart = Handel.Cart.fetch(id => 'A2CCD312-73B5-4EE4-B77E-3D027349A055')) %]
[% cart.name %]
[% FOREACH item IN cart.items %]
[% item.sku %]
[% END %]
[% END %]
DESCRIPTION
Template::Plugin::Handel::Cart
is a TT2 (Template Toolkit 2) plugin for Handel::Cart
. It's API is exactly the same as Handel::Cart
with a few minor exceptions noted below.
Since new
and load
are used by TT2 to load plugins, Handel::Carts new
and load
can be accessed using create
and fetch
.
Starting in version 0.08
, Handel::Constants
are now imported into this module automatically. This removes the need to use Template::Plugin::Handel::Constants
separately when working with carts.
[% USE hc = Handel.Cart %]
[% cart = hc.create(...) %]
[% cart.type(hc.CART_TYPE_TEMP) %]
CAVEATS
Template Toolkit
handles method params in a smart fashion that allows you to pass named parameters into methods and it will convert them into HASH references.
For example:
[% cart.method(name1=val1, name2=val2, otherarg);
is turned into:
cart->method(otherarg, {name1=>val1, name2=>val2});
Unfortunately, it looks like TT2 reverses the @ARGS order during translation. This causes problems with Handel::Cart::load
and items
as they expect ($hashref, $wantiterator)
instead.
Do to this, it is recommended that you always use the same explicit form as you would use when calling Handel::Cart
when calling create
and items
:
[% cart.method({name1=>val1, name2=>val2}, $wantiterator) %]
Other issue is how Handel::Cart
returns an iterator or an array based on its inspection of wantarray
. It appears that TT2 thwarts wantarray
in some manner.
For example:
[% carts = Handel.Cart.fetch() %]
returns an array reference since it's not clear at this point what you really want. To counteract this behavior, you can use RETURNAS
constants to specify the exact output desired:
[% carts = Handel.Cart.fetch(undef, Handel.Cart.RETURNAS_ITERATOR) %]
This will force a return of a Handel::Iterator
in scalar context. Then you can simply loop through the iterator:
[% WHILE (cart = carts.next) %]
...
[% END %]
On the upshot, if you are only expecting a single result, like loading a specific cart by id
, then it will just do Do What You Want:
[% cart = Handel.Cart.fetch({id => '12345678-7654-3212-345678987654'}) %]
[% cart.id %]
[% cart.name %]
...
You can even use FOREACH
without specifying the return type as TT2 appears to just Do The Right Thing regardless of whether it receives an array or a single Handel::Cart
or Handel::Cart::Item
object:
[% FOREACH cart IN Handel.Cart.fetch({id => '12345678-7654-3212-345678987654'}}) %]
[% FOREACH item IN cart.items %]
[% item.sku %]
[% END %]
[% END %]
CONSTRUCTOR
Unlike using Handel::Cart
to create a new cart object using new
and load
, Template::Plugin::Handel::Cart
takes a slightly different approach to cart objects. Because USE
ing in TT2 calls new
, we first USE
or create a new Template::Plugin::Handel::Cart
object then create
or load
to return a new cart object, iterator, or array of carts.
new
This returns a new Handel.Cart object. This is used internally when loading TT2 plugins and should not be used directly.
METHODS
load
This method is called when TT2 loaded the plugin for the first time. This is used internally by TT2 and should not be used directly.
create(\%filter)
[% USE Handel.Cart %]
[% IF (cart = Handel.Cart.create({
shopper => '12345678-9876-5432-1234-567890987654',
name => 'My New Cart',
description =>'Favorite Items'})) %]
[% cart.name %]
...
[% END %]
fetch(\%filter [, $wantiterator])
The safest way to get a cart is to use FOREACH. This negates the need to specify $wanteriterator
for Handel::Cart::load
. See CAVEATS for further info on $wantiterator
, Perls wantarray
within TT2.
[% USE Handel.Cart %]
[% FOREACH cart IN Handel.Cart.fetch({shopper => '12345678-9876-5432-1234-567890987654'}) %]
[% cart.id %]
[% cart.name %]
...
[% END %]
uuid
Returns a new uuid for use in add/create:
[% USE Handel.Cart %]
[% IF (cart = Handel.Cart.create({
id => Handel.Cart.uuid,
shopper => '12345678-9876-5432-1234-567890987654',
name => 'My New Cart',
description =>'Favorite Items'})) %]
[% cart.name %]
...
[% END %]
guid
Same as uuid
above.
SEE ALSO
Template::Plugin::Handel::Constants, Handel::Constants, Handel::Cart, Template::Plugin
AUTHOR
Christopher H. Laco
CPAN ID: CLACO
claco@chrislaco.com
http://today.icantfocus.com/blog/