[Petal] Implementation question

William McKee william@knowmad.com
Wed, 11 Sep 2002 08:25:20 -0400


--Message-Boundary-7282
Content-type: text/plain; charset=US-ASCII
Content-transfer-encoding: 7BIT
Content-description: Mail message body

Hi Jean-Michel,

Thanks for the extensive example of using methods with Petal. I look 
forward to trying to incorporate the technique into future projects. 

In the meantime, I've added it to the growing list of examples for using 
Petal that I've started keeping for my own edification. I've attached the 
file for comments/additions. I need to capture some more of the basic 
techniques in order for it to be a real cookbook, but perhaps it could be 
useful to include with the Petal release files with a bit more work.

Regards,
William


On 21 Aug 2002 at 17:55, Jean-Michel Hiver wrote:

> Hi William,
> 
> I'm going to make the following assumptions:
> 
> * all your records are hashrefs which come from some database
> * you have a list of them to display
> 
> Let's say that the database table looks like this:
> 
> Raters (id, first_name, last_name, relation, phone, email)
> 
> You could bless each record into a package as is:
> 
>     use MyApplication::Record::Rater;
>     my @records = complicated_query_somewhere_else();
>     bless $_, "MyApplication::Record::Rater" for (@records);
> 
> 
> Your module could look like that:
> 
>     package MyApplication::Record::Rater;
>     use strict;
>     use warnings;
>     use CGI;
>     use Carp;
> 
>     sub is_current_id
>     {
>         my $self = shift;
>         my $cgi  = CGI->new;
>         my $id = $cgi->param ('rater.id');
>         return unless (defined $id and $id and $id =~ /^\d+$/);
>         return $id == $self->{id};
>     }
> 
>     1;
> 
> Then on top of your existing data, you have a method which you can call
> from Petal, i.e.
> 
>     <span petal:condition="true:record/is_current_id">
>       blah blah blah...
>     </span>
> 
> This trick can also be used when you have foreign keys in database
> fields.
> 
> <fictious_scenario>
> 
> For example, let's imagine that you have a column called
> 'friend_id'. It references another 'rater' which is supposed to be a
> friend of that person.
> 
> You could defined the following subroutine:
> 
>     # give me the friend record for that person
>     sub friend
>     {
>         my $self = shift;
>         my $friend_id = $self->{friend_id};
>         my $sql = 'select * from rater where id = ?';
>         my $sth = $::DBH_CONNECTION->prepare_cached ($sql);
>         $sth->execute ($friend_id);
>         my $hash = $sth->fetchrow_hashref;
>         return unless (defined $hash);
> 
>         bless $hash, "MyApplication::Record::Rater";
>         return $hash;
>     }
> 
> Then in your template, you could do:
> 
>   <?petal:if name="true:rater/friend"?>
>   Your friend is:
>     $encode:rater/friend/first_name
>     $encode:rater/friend/last_name
>   <?petal:end?>
> 
> </fictious_scenario>
> 
> 
> This system is quite poweful, I use it heavily all the time, and that's why
> Petal supports invoking method on objects.
> 
> In other words, OO-Perl rulez :-)
> 
> Cheers,
> -- 
> IT'S TIME FOR A DIFFERENT KIND OF WEB
> ================================================================
>   Jean-Michel Hiver - Software Director
>   jhiver@mkdoc.com
>   +44 (0)114 255 8097
> ================================================================
>                                      VISIT HTTP://WWW.MKDOC.COM
> 


-- 
 Lead Developer
 Knowmad Services Inc. || Internet Applications & Database Integration
 http://www.knowmad.com
 


--Message-Boundary-7282
Content-type: text/plain; charset=US-ASCII
Content-disposition: inline
Content-description: Attachment information.

The following section of this message contains a file attachment
prepared for transmission using the Internet MIME message format.
If you are using Pegasus Mail, or any another MIME-compliant system,
you should be able to save it or view it from within your mailer.
If you cannot, please ask your system administrator for assistance.

   ---- File information -----------
     File:  Cookbook.pod
     Date:  11 Sep 2002, 8:15
     Size:  4498 bytes.
     Type:  Unknown

--Message-Boundary-7282
Content-type: Application/Octet-stream; name="Cookbook.pod"; type=Unknown
Content-disposition: attachment; filename="Cookbook.pod"
Content-transfer-encoding: BASE64

PWhlYWQxIE5BTUUNCg0KUGV0YWw6OkNvb2tib29rIC0gUmVjaXBlcyBmb3IgYnVpbGRpbmcg
dGVtcGxhdGVzIHdpdGggUGV0YWwNCg0KPWhlYWQxIFNZTk9QU0lTDQoNCk5vdCBBcHBsaWNh
YmxlDQoNCj1oZWFkMSBERVNDUklQVElPTg0KDQpUaGlzIGRvY3VtZW50IGNvbnRhaW5zIHNv
bWUgZXhhbXBsZXMgb2YgTDxQZXRhbHxQZXRhbD4gdGVtcGxhdGUgdXNhZ2UuIA0KDQoNCj1o
ZWFkMSBOT1RFUw0KSSB0ZW5kIHRvIHVzZSBQZXRhbCB0byBnZW5lcmF0ZSBIVE1MIGZpbGVz
IGZyb20gSFRNTCB0ZW1wbGF0ZXMuIEkgbmFtZSB0aGVzZSB0ZW1wbGF0ZXMgd2l0aCB0aGUg
LnRtcGwgZXh0ZW5zaW9uIHRvIGhlbHAgZGlzdGluZ3Vpc2ggdGVtcGxhdGVzIGZyb20gc3Rh
dGljIGh0bWwuIE5vbmV0aGVsZXNzLCB0aGUgdGVtcGxhdGVzIHNob3VsZCBiZSBpbiBhIG5v
bi13ZWIgYWNjZXNzaWJsZSBkaXJlY3RvcnkgaWYgeW91IGFyZSB1c2luZyBQZXRhbCBmb3Ig
ZGV2ZWxvcGluZyB3ZWIgYXBwbGljYXRpb25zLg0KDQoNCj1oZWFkMSBCQVNJQ1MNCg0KPWhl
YWQyIFBhc3NpbmcgYSBoYXNocmVmZXJlbmNlIHRvIFBldGFsOjpwcm9jZXNzDQpBbiBlZmZl
Y3RpdmUgd2F5IHRvIGNvbGxhdGUgZGF0YSB0byBzZW5kIHRvIHRoZSBQZXRhbCBwcm9jZXNz
IGNvbW1hbmQgaXMgdmlhIGEgaGFzaCByZWZlcmVuY2UuIFVzZWQgYXMgZm9sbG93cywgdGhp
cyB0ZWNobmlxdWUgYWxsb3dzIHlvdSB0byBidWlsZCB1cCB5b3VyIGRhdGEgdG8gYmUgcGFz
c2VkIHRvIHRoZSB0ZW1wbGF0ZSBzbG93bHk6DQoNCglteSAkaGFzaCA9IHsgb2JqZWN0ID0+
ICRzb21lX29iamVjdCwgbnVtYmVyID0+IDMgfTsNCgkkaGFzaC0+eydmb28nfSA9ICJiYXIi
Ow0KCW15ICR0ZW1wbGF0ZSA9IG5ldyBQZXRhbCAoICd0ZXN0LnRtcGwnICk7DQoJbXkgJGh0
bWwgPSAkdGVtcGxhdGUtPnByb2Nlc3MoJGhhc2gpOw0KCSMgT3V0cHV0IHRoZSByZXN1bHRz
DQoJcHJpbnQgIkNvbnRlbnQtdHlwZTogdGV4dC9odG1sXG5cbiI7DQoJcHJpbnQgJGh0bWw7
DQoNCg0KDQo9aGVhZDEgQURWQU5DRUQNCg0KPWhlYWQyIEludm9raW5nIG1ldGhvZHMgb24g
b2JqZWN0cw0KUGV0YWwgc3VwcG9ydHMgdGhlIGFiaWxpdHkgdG8gY2FsbCBhbiBvYmplY3Qn
cyBtZXRob2RzIGlmIHBhc3NlZCBpbiB0byBQZXRhbDo6cHJvY2VzcyB2aWEgdGhlICVoYXNo
LiBTYXkgeW91IHdpc2ggdG8gY2hlY2sgd2hldGhlciBhIHBhcnRpY3VsYXIgcmVjb3JkIGlz
IGNvbnRhaW5lZCBpbiBhIHJlY29yZHNldCByZXR1cm5lZCBmcm9tIGFuIFNRTCBxdWVyeS4g
VXNpbmcgT08tUGVybCB0ZWNobmlxdWVzLCB5b3UgY291bGQgdXNlIHRoZSBmb2xsb3dpbmcg
dGVjaG5pcXVlIGFzIGRlc2NyaWJlZCBieSBKZWFuLU1pY2hlbDoNCg0KKiBhbGwgeW91ciBy
ZWNvcmRzIGFyZSBoYXNocmVmcyB3aGljaCBjb21lIGZyb20gc29tZSBkYXRhYmFzZQ0KKiB5
b3UgaGF2ZSBhIGxpc3Qgb2YgdGhlbSB0byBkaXNwbGF5DQoNCkxldCdzIHNheSB0aGF0IHRo
ZSBkYXRhYmFzZSB0YWJsZSBsb29rcyBsaWtlIHRoaXM6DQoNClJhdGVycyAoaWQsIGZpcnN0
X25hbWUsIGxhc3RfbmFtZSwgcmVsYXRpb24sIHBob25lLCBlbWFpbCkNCg0KWW91IGNvdWxk
IGJsZXNzIGVhY2ggcmVjb3JkIGludG8gYSBwYWNrYWdlIGFzIGlzOg0KDQogICAgdXNlIE15
QXBwbGljYXRpb246OlJlY29yZDo6UmF0ZXI7DQogICAgbXkgQHJlY29yZHMgPSBjb21wbGlj
YXRlZF9xdWVyeV9zb21ld2hlcmVfZWxzZSgpOw0KICAgIGJsZXNzICRfLCAiTXlBcHBsaWNh
dGlvbjo6UmVjb3JkOjpSYXRlciIgZm9yIChAcmVjb3Jkcyk7DQoNCg0KWW91ciBtb2R1bGUg
Y291bGQgbG9vayBsaWtlIHRoYXQ6DQoNCiAgICBwYWNrYWdlIE15QXBwbGljYXRpb246OlJl
Y29yZDo6UmF0ZXI7DQogICAgdXNlIHN0cmljdDsNCiAgICB1c2Ugd2FybmluZ3M7DQogICAg
dXNlIENHSTsNCiAgICB1c2UgQ2FycDsNCg0KICAgIHN1YiBpc19jdXJyZW50X2lkDQogICAg
ew0KICAgICAgICBteSAkc2VsZiA9IHNoaWZ0Ow0KICAgICAgICBteSAkY2dpICA9IENHSS0+
bmV3Ow0KICAgICAgICBteSAkaWQgPSAkY2dpLT5wYXJhbSAoJ3JhdGVyLmlkJyk7DQogICAg
ICAgIHJldHVybiB1bmxlc3MgKGRlZmluZWQgJGlkIGFuZCAkaWQgYW5kICRpZCA9fiAvXlxk
KyQvKTsNCiAgICAgICAgcmV0dXJuICRpZCA9PSAkc2VsZi0+e2lkfTsNCiAgICB9DQoNCiAg
ICAxOw0KDQpUaGVuIG9uIHRvcCBvZiB5b3VyIGV4aXN0aW5nIGRhdGEsIHlvdSBoYXZlIGEg
bWV0aG9kIHdoaWNoIHlvdSBjYW4gY2FsbA0KZnJvbSBQZXRhbCwgaS5lLg0KDQogICAgPHNw
YW4gcGV0YWw6Y29uZGl0aW9uPSJ0cnVlOnJlY29yZC9pc19jdXJyZW50X2lkIj4NCiAgICAg
IGJsYWggYmxhaCBibGFoLi4uDQogICAgPC9zcGFuPg0KDQpUaGlzIHRyaWNrIGNhbiBhbHNv
IGJlIHVzZWQgd2hlbiB5b3UgaGF2ZSBmb3JlaWduIGtleXMgaW4gZGF0YWJhc2UNCmZpZWxk
cy4NCg0KPGZpY3Rpb3VzX3NjZW5hcmlvPg0KDQpGb3IgZXhhbXBsZSwgbGV0J3MgaW1hZ2lu
ZSB0aGF0IHlvdSBoYXZlIGEgY29sdW1uIGNhbGxlZA0KJ2ZyaWVuZF9pZCcuIEl0IHJlZmVy
ZW5jZXMgYW5vdGhlciAncmF0ZXInIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlIGENCmZyaWVu
ZCBvZiB0aGF0IHBlcnNvbi4NCg0KWW91IGNvdWxkIGRlZmluZWQgdGhlIGZvbGxvd2luZyBz
dWJyb3V0aW5lOg0KDQogICAgIyBnaXZlIG1lIHRoZSBmcmllbmQgcmVjb3JkIGZvciB0aGF0
IHBlcnNvbg0KICAgIHN1YiBmcmllbmQNCiAgICB7DQogICAgICAgIG15ICRzZWxmID0gc2hp
ZnQ7DQogICAgICAgIG15ICRmcmllbmRfaWQgPSAkc2VsZi0+e2ZyaWVuZF9pZH07DQogICAg
ICAgIG15ICRzcWwgPSAnc2VsZWN0ICogZnJvbSByYXRlciB3aGVyZSBpZCA9ID8nOw0KICAg
ICAgICBteSAkc3RoID0gJDo6REJIX0NPTk5FQ1RJT04tPnByZXBhcmVfY2FjaGVkICgkc3Fs
KTsNCiAgICAgICAgJHN0aC0+ZXhlY3V0ZSAoJGZyaWVuZF9pZCk7DQogICAgICAgIG15ICRo
YXNoID0gJHN0aC0+ZmV0Y2hyb3dfaGFzaHJlZjsNCiAgICAgICAgcmV0dXJuIHVubGVzcyAo
ZGVmaW5lZCAkaGFzaCk7DQoNCiAgICAgICAgYmxlc3MgJGhhc2gsICJNeUFwcGxpY2F0aW9u
OjpSZWNvcmQ6OlJhdGVyIjsNCiAgICAgICAgcmV0dXJuICRoYXNoOw0KICAgIH0NCg0KVGhl
biBpbiB5b3VyIHRlbXBsYXRlLCB5b3UgY291bGQgZG86DQoNCiAgPD9wZXRhbDppZiBuYW1l
PSJ0cnVlOnJhdGVyL2ZyaWVuZCI/Pg0KICBZb3VyIGZyaWVuZCBpczoNCiAgICAkZW5jb2Rl
OnJhdGVyL2ZyaWVuZC9maXJzdF9uYW1lDQogICAgJGVuY29kZTpyYXRlci9mcmllbmQvbGFz
dF9uYW1lDQogIDw/cGV0YWw6ZW5kPz4NCg0KPC9maWN0aW91c19zY2VuYXJpbz4NCg0KVGhh
bmtzIHRvIEplYW4tTWljaGVsIEhpdmVyIDxqaGl2ZXJAbWtkb2MuY29tPiBmb3IgdGhpcyB0
aXAuDQoNCg0KCQkJTkVFRFMgVE8gQkUgVEVTVEVEDQoJCQlORUVEUyBUTyBCRSBURVNURUQN
Cj1oZWFkMiBVc2luZyBDR0kucG0gdG8gYnVpbGQgZm9ybXMNCgkJCU5FRURTIFRPIEJFIFRF
U1RFRA0KCQkJTkVFRFMgVE8gQkUgVEVTVEVEDQpCZSBzdXJlIHRvIGNhbGwgQ0dJIHdpdGgg
dGhlIC1jb21waWxlIG9wdGlvbiBhcyBmb2xsb3dzOg0KCXVzZSBDR0koLWNvbXBpbGUgWzph
bGxdKTsNCg0KQ2FsbGluZyB0aGUgSFRNTCBnZW5lcmF0aW5nIG1ldGhvZHMgb2YgQ0dJLnBt
IGZyb20gdGhlIFBldGFsIHRlbXBsYXRlIHByb3ZpZGVzDQphbiBleHRyZW1lbHkgc2ltcGxl
IG1lYW5zIHRvIGRldmVsb3AgZm9ybXMuICBGb3IgZXhhbXBsZSwgdGhlIHVzdXNhbCByYXRu
ZXN0IG9mDQpsb29wcyB1c2VkIHRvIHBvcHVsYXRlIGEgY2hlY2tib3ggZ3JvdXAgY2FuIGJl
IHJlcGxhY2VkIGJ5IHRoZSBzaW1wbGUgZWxlZ2FudA0KY29uc3RydWN0IGJlbG93LiAgWW91
IGNhbiBwdXQgaW4gYSBkdW1teSBjaGVja2JveCB0byBnaXZlIHRoZSBIVE1MIGRlc2lnbmVy
DQpzb21ldGhpbmcgdG8gbG9vayBhdC4NCg0KPHNwYW4gcGV0YWw6cmVwbGFjZT0icXVlcnkv
Y2hlY2tib3hfZ3JvdXAgJ0Nob2ljZXMnIGNob2ljZXMgJycgJ3RydWUnIj4NCjxpbnB1dCBu
YW1lPSJDaG9pY2VzIiB0eXBlPSJjaGVja2JveCIgdmFsdWU9InRlc3QiPlRlc3Q8L2lucHV0
PiA8L3NwYW4+DQoNClRoYW5rcyB0byBLdXJ0IFN0ZXBoZW5zIDxrc3RlcEBwZXBzZGVzaWdu
LmNvbT4gZm9yIHRoaXMgdGlwLg0KDQoNCg0KPWhlYWQxIENPUFlSSUdIVA0KDQpDb3B5cmln
aHQgKGMpIDIwMDIgV2lsbGlhbSBNY0tlZSA8d2lsbGlhbUBrbm93bWFkLmNvbT4uICBBbGwg
cmlnaHRzIHJlc2VydmVkLg0KDQpUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91
IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KdGhlIHNhbWUg
dGVybXMgYXMgUGVybCBpdHNlbGYuDQoNCj1oZWFkMSBTRUUgQUxTTw0KDQpMPFBldGFsfFBl
dGFsPg0KDQo9Y3V0DQoNCg==

--Message-Boundary-7282--