[Petal] Implementation question

Jean-Michel Hiver jhiver@mkdoc.com
Wed, 21 Aug 2002 17:55:43 +0100


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