FAQ
Hi,

I am curious what everyone thinks as being the best practices for
handling forms in Catalyst. Are there any Catalyst applications you
have run across which are good examples of how to use Catalyst's
features to handle forms?

To illustrate what I am getting at, below is typical Rails (v2)
controller code which implements updating the attributes of an object:

def edit
@book = Book.find(params[:id])
@subjects = Subject.find(:all)
end
def update
@book = Book.find(params[:id])
if @book.update_attributes(params[:book])
flash[:notice] = 'Book successfully updated.'
redirect_to :action => 'show', :id => @book
else
@subjects = Subject.find(:all)
render :action => 'edit'
end
end

In Catalyst, this would be appear something like (and please correct
me if I have made any errors here):

sub edit :Args(1) {
my ($self, $c, $id) = @_;
... set up $c->stash for template 'edit' ...
# no need to set $c->stash->{template} - will be set from the current action
}

sub update :Args(1) {
my ($self, $c, $id) = @_;
...process form...
if (form is valid) {
...perform updates...
$c->flash->{notice} = 'Book successfully updated.';
$c->res->redirect('show', $id);
} else {
... set up $c->stash for 'edit' template ...
$c->stash->{template} = 'edit';
}
}

Any comments on this architecture? Is there a better way? My main problems are:

1. The code ... set up $c->stash for 'edit' template ... is duplicated
in both edit and update (which is also true for the Rails code).

2. Having the template name defaulted from the current action is nice,
but that means we have to explicitly set it in the update method. Is
it better to always explicitly set the template name in a controller
method? Then update could perform a $c->detach('edit', $id) or would
you use $c->go('edit', $id)?

Thanks,
ER

Search Discussions

  • Hernan Lopes at Sep 20, 2010 at 11:09 pm
    perl Catalyst Forms with Formhandler and Thickbox:

    You know you dont always need a template.tt2 file... this is useful with
    ajax (especially with thickbox) so you can pass a scalar as template, so you
    end up with:
    $c->stash( template => $form->render, current_view => 'Ajax', );
    1. You could create an Ajax view.
    2. Or you can set body content directly.
    This way you skip creating TT files for forms and render them directly into
    the $c->res->body or $c->stash( template => \'foo baz')
    If you use something like thickbox, you can render any $form directly into a
    modal.
    Its very handy!

    For example:


    __PACKAGE__->config(
    action => {
    edit => { Chained => 'base', Args => 1, },
    },
    );

    sub base : Chained('/') PathPart('foobar') CaptureArgs(0) {}

    sub edit :Action {
    my ( $self, $c, $foobar_id ) = @_;
    my $form = HTML::FormHandler->new(
    schema => 'DBSchema::Foo',
    params => $c->req->params,
    field_list => $self->form_fields($c),
    );
    if( $c->req->method eq 'POST' && $form->process() ) {
    ...
    } else {
    #OPTION 1 (create an Ajax View and create a wrapper for it. Then render
    the form into stash template var):
    $c->stash(
    template => \$form->render,
    current_view => 'Ajax',
    );
    #OPTION 2 (set your content type and charset and render the form into the
    body, needs no view/TT files):
    $c->res->content_type('text/html charset=utf-8');
    $c->res->body($form->render);
    }
    }




    sub form_fields {
    return [
    field_one => {
    type => 'Text',
    label => '...',
    css_class => '...',
    maxlength => 160,
    required => 1,
    required_message => 'Required Text',
    },
    submit => {
    type => 'Submit',
    value => 'Save',
    css_class => '...',
    },
    ];
    }



    and DRY on edit & update unless necessary...
    1. If there is an argument its "update?"
    2. Else, when it has no args then its "edit/new" ?

    use your foregin_key_id and $form('foregin_key_id')->value = '...' to set it
    , then formhandler will know whether to update or create a new entry.

    Take care,
    hernan




    On Mon, Sep 20, 2010 at 6:48 PM, E R wrote:

    Hi,

    I am curious what everyone thinks as being the best practices for
    handling forms in Catalyst. Are there any Catalyst applications you
    have run across which are good examples of how to use Catalyst's
    features to handle forms?

    To illustrate what I am getting at, below is typical Rails (v2)
    controller code which implements updating the attributes of an object:

    def edit
    @book = Book.find(params[:id])
    @subjects = Subject.find(:all)
    end
    def update
    @book = Book.find(params[:id])
    if @book.update_attributes(params[:book])
    flash[:notice] = 'Book successfully updated.'
    redirect_to :action => 'show', :id => @book
    else
    @subjects = Subject.find(:all)
    render :action => 'edit'
    end
    end

    In Catalyst, this would be appear something like (and please correct
    me if I have made any errors here):

    sub edit :Args(1) {
    my ($self, $c, $id) = @_;
    ... set up $c->stash for template 'edit' ...
    # no need to set $c->stash->{template} - will be set from the current
    action
    }

    sub update :Args(1) {
    my ($self, $c, $id) = @_;
    ...process form...
    if (form is valid) {
    ...perform updates...
    $c->flash->{notice} = 'Book successfully updated.';
    $c->res->redirect('show', $id);
    } else {
    ... set up $c->stash for 'edit' template ...
    $c->stash->{template} = 'edit';
    }
    }

    Any comments on this architecture? Is there a better way? My main problems
    are:

    1. The code ... set up $c->stash for 'edit' template ... is duplicated
    in both edit and update (which is also true for the Rails code).

    2. Having the template name defaulted from the current action is nice,
    but that means we have to explicitly set it in the update method. Is
    it better to always explicitly set the template name in a controller
    method? Then update could perform a $c->detach('edit', $id) or would
    you use $c->go('edit', $id)?

    Thanks,
    ER

    _______________________________________________
    List: Catalyst@lists.scsys.co.uk
    Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
    Searchable archive:
    http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
    Dev site: http://dev.catalyst.perl.org/
    -------------- next part --------------
    An HTML attachment was scrubbed...
    URL: http://lists.scsys.co.uk/pipermail/catalyst/attachments/20100920/1cfc9675/attachment.htm
  • Hernan Lopes at Sep 20, 2010 at 11:12 pm
    correction:
    you can pass a reference to $c->stash(template => \'foobas'), so you end up
    with:
    $c->stash( template => \$form->render, current_view => 'Ajax', );
    On Mon, Sep 20, 2010 at 8:09 PM, Hernan Lopes wrote:

    perl Catalyst Forms with Formhandler and Thickbox:

    You know you dont always need a template.tt2 file... this is useful with
    ajax (especially with thickbox) so you can pass a scalar as template, so you
    end up with:
    $c->stash( template => $form->render, current_view => 'Ajax', );
    1. You could create an Ajax view.
    2. Or you can set body content directly.
    This way you skip creating TT files for forms and render them directly into
    the $c->res->body or $c->stash( template => \'foo baz')
    If you use something like thickbox, you can render any $form directly into
    a modal.
    Its very handy!

    For example:


    __PACKAGE__->config(
    action => {
    edit => { Chained => 'base', Args => 1, },
    },
    );

    sub base : Chained('/') PathPart('foobar') CaptureArgs(0) {}

    sub edit :Action {
    my ( $self, $c, $foobar_id ) = @_;
    my $form = HTML::FormHandler->new(
    schema => 'DBSchema::Foo',
    params => $c->req->params,
    field_list => $self->form_fields($c),
    );
    if( $c->req->method eq 'POST' && $form->process() ) {
    ...
    } else {
    #OPTION 1 (create an Ajax View and create a wrapper for it. Then render
    the form into stash template var):
    $c->stash(
    template => \$form->render,
    current_view => 'Ajax',
    );
    #OPTION 2 (set your content type and charset and render the form into the
    body, needs no view/TT files):
    $c->res->content_type('text/html charset=utf-8');
    $c->res->body($form->render);
    }
    }




    sub form_fields {
    return [
    field_one => {
    type => 'Text',
    label => '...',
    css_class => '...',
    maxlength => 160,
    required => 1,
    required_message => 'Required Text',
    },
    submit => {
    type => 'Submit',
    value => 'Save',
    css_class => '...',
    },
    ];
    }



    and DRY on edit & update unless necessary...
    1. If there is an argument its "update?"
    2. Else, when it has no args then its "edit/new" ?

    use your foregin_key_id and $form('foregin_key_id')->value = '...' to set
    it , then formhandler will know whether to update or create a new entry.

    Take care,
    hernan





    On Mon, Sep 20, 2010 at 6:48 PM, E R wrote:

    Hi,

    I am curious what everyone thinks as being the best practices for
    handling forms in Catalyst. Are there any Catalyst applications you
    have run across which are good examples of how to use Catalyst's
    features to handle forms?

    To illustrate what I am getting at, below is typical Rails (v2)
    controller code which implements updating the attributes of an object:

    def edit
    @book = Book.find(params[:id])
    @subjects = Subject.find(:all)
    end
    def update
    @book = Book.find(params[:id])
    if @book.update_attributes(params[:book])
    flash[:notice] = 'Book successfully updated.'
    redirect_to :action => 'show', :id => @book
    else
    @subjects = Subject.find(:all)
    render :action => 'edit'
    end
    end

    In Catalyst, this would be appear something like (and please correct
    me if I have made any errors here):

    sub edit :Args(1) {
    my ($self, $c, $id) = @_;
    ... set up $c->stash for template 'edit' ...
    # no need to set $c->stash->{template} - will be set from the current
    action
    }

    sub update :Args(1) {
    my ($self, $c, $id) = @_;
    ...process form...
    if (form is valid) {
    ...perform updates...
    $c->flash->{notice} = 'Book successfully updated.';
    $c->res->redirect('show', $id);
    } else {
    ... set up $c->stash for 'edit' template ...
    $c->stash->{template} = 'edit';
    }
    }

    Any comments on this architecture? Is there a better way? My main problems
    are:

    1. The code ... set up $c->stash for 'edit' template ... is duplicated
    in both edit and update (which is also true for the Rails code).

    2. Having the template name defaulted from the current action is nice,
    but that means we have to explicitly set it in the update method. Is
    it better to always explicitly set the template name in a controller
    method? Then update could perform a $c->detach('edit', $id) or would
    you use $c->go('edit', $id)?

    Thanks,
    ER

    _______________________________________________
    List: Catalyst@lists.scsys.co.uk
    Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
    Searchable archive:
    http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
    Dev site: http://dev.catalyst.perl.org/
    -------------- next part --------------
    An HTML attachment was scrubbed...
    URL: http://lists.scsys.co.uk/pipermail/catalyst/attachments/20100920/5243d2e9/attachment.htm
  • Hernan Lopes at Sep 20, 2010 at 11:32 pm
    Ohh, by the way, if you need to write html into the form, you can also do it
    without any TT view file.

    With Formhandler it is very simple, just use the field of type 'Display',
    for example:
    has_field 'display0' => (
    type => 'Display',
    html => '
    <div class="clear"><h1 class="formtitle">Your Personal Data</h1></div>
    <script>foo bar baz</script>
    '
    );



    On Mon, Sep 20, 2010 at 8:09 PM, Hernan Lopes wrote:

    perl Catalyst Forms with Formhandler and Thickbox:

    You know you dont always need a template.tt2 file... this is useful with
    ajax (especially with thickbox) so you can pass a scalar as template, so you
    end up with:
    $c->stash( template => $form->render, current_view => 'Ajax', );
    1. You could create an Ajax view.
    2. Or you can set body content directly.
    This way you skip creating TT files for forms and render them directly into
    the $c->res->body or $c->stash( template => \'foo baz')
    If you use something like thickbox, you can render any $form directly into
    a modal.
    Its very handy!

    For example:


    __PACKAGE__->config(
    action => {
    edit => { Chained => 'base', Args => 1, },
    },
    );

    sub base : Chained('/') PathPart('foobar') CaptureArgs(0) {}

    sub edit :Action {
    my ( $self, $c, $foobar_id ) = @_;
    my $form = HTML::FormHandler->new(
    schema => 'DBSchema::Foo',
    params => $c->req->params,
    field_list => $self->form_fields($c),
    );
    if( $c->req->method eq 'POST' && $form->process() ) {
    ...
    } else {
    #OPTION 1 (create an Ajax View and create a wrapper for it. Then render
    the form into stash template var):
    $c->stash(
    template => \$form->render,
    current_view => 'Ajax',
    );
    #OPTION 2 (set your content type and charset and render the form into the
    body, needs no view/TT files):
    $c->res->content_type('text/html charset=utf-8');
    $c->res->body($form->render);
    }
    }




    sub form_fields {
    return [
    field_one => {
    type => 'Text',
    label => '...',
    css_class => '...',
    maxlength => 160,
    required => 1,
    required_message => 'Required Text',
    },
    submit => {
    type => 'Submit',
    value => 'Save',
    css_class => '...',
    },
    ];
    }



    and DRY on edit & update unless necessary...
    1. If there is an argument its "update?"
    2. Else, when it has no args then its "edit/new" ?

    use your foregin_key_id and $form('foregin_key_id')->value = '...' to set
    it , then formhandler will know whether to update or create a new entry.

    Take care,
    hernan





    On Mon, Sep 20, 2010 at 6:48 PM, E R wrote:

    Hi,

    I am curious what everyone thinks as being the best practices for
    handling forms in Catalyst. Are there any Catalyst applications you
    have run across which are good examples of how to use Catalyst's
    features to handle forms?

    To illustrate what I am getting at, below is typical Rails (v2)
    controller code which implements updating the attributes of an object:

    def edit
    @book = Book.find(params[:id])
    @subjects = Subject.find(:all)
    end
    def update
    @book = Book.find(params[:id])
    if @book.update_attributes(params[:book])
    flash[:notice] = 'Book successfully updated.'
    redirect_to :action => 'show', :id => @book
    else
    @subjects = Subject.find(:all)
    render :action => 'edit'
    end
    end

    In Catalyst, this would be appear something like (and please correct
    me if I have made any errors here):

    sub edit :Args(1) {
    my ($self, $c, $id) = @_;
    ... set up $c->stash for template 'edit' ...
    # no need to set $c->stash->{template} - will be set from the current
    action
    }

    sub update :Args(1) {
    my ($self, $c, $id) = @_;
    ...process form...
    if (form is valid) {
    ...perform updates...
    $c->flash->{notice} = 'Book successfully updated.';
    $c->res->redirect('show', $id);
    } else {
    ... set up $c->stash for 'edit' template ...
    $c->stash->{template} = 'edit';
    }
    }

    Any comments on this architecture? Is there a better way? My main problems
    are:

    1. The code ... set up $c->stash for 'edit' template ... is duplicated
    in both edit and update (which is also true for the Rails code).

    2. Having the template name defaulted from the current action is nice,
    but that means we have to explicitly set it in the update method. Is
    it better to always explicitly set the template name in a controller
    method? Then update could perform a $c->detach('edit', $id) or would
    you use $c->go('edit', $id)?

    Thanks,
    ER

    _______________________________________________
    List: Catalyst@lists.scsys.co.uk
    Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
    Searchable archive:
    http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
    Dev site: http://dev.catalyst.perl.org/
    -------------- next part --------------
    An HTML attachment was scrubbed...
    URL: http://lists.scsys.co.uk/pipermail/catalyst/attachments/20100920/5fc12e0f/attachment.htm
  • Octavian Rasnita at Sep 21, 2010 at 6:18 am
    Hi,

    A clean example that uses HTML::FormFu is:

    package MyApp::Controller::Foo;

    use Moose;
    extends 'Catalyst::Controller::HTML::FormFu';
    # or just use parent 'Catalyst::Controller::HTML::FormFu' if you don't use
    Moose

    sub edit : Local FormConfig {
    my ($self, $c, $id) = @_;

    my $form = $c->stash->{form};
    my $foo = $c->model("DB::Foo")->find($id);

    if ($form->submitted_and_valid) {
    $form->model->update($foo);
    $c->flash(notice => "Foo was updated successfully.");
    $c->res->redirect($c->uri_for_action('/foo/index'));
    }
    else {
    $form->model->default_values($foo);
    }
    }


    sub edit : Local FormConfig {

    You can use Path or the chaining dispatch type or something else, not only
    "Local".
    If you use the attribute FormConfig, it will search for the form placed by
    default in
    root/forms/foo/edit.conf

    If you want to use another specified form, you can use something like:

    sub edit : Local FormConfig('path/to/another/form') {


    my $form = $c->stash->{form};

    If you use the FormConfig attribute, it will place the form in the stash
    automaticly so you just need to get it from there.


    my $foo = $c->model("DB::Foo")->find($id);

    This uses DBIx::Class result class DB::Foo for getting the $foo record.


    if ($form->submitted_and_valid) {

    This will be true only if the form past all the validation and constraints.

    $form->model->update($foo);

    This will update the $foo record in the database. In order to work this way,
    you need to have defined the database schema in myapp.conf like:

    'Controller::HTML::FormFu' => {
    model_stash => {
    schema => 'DB',
    },
    },

    And in the edit.conf form configuration file (defined below using
    Config::General) you will need to have defined the resultset like:

    <model_config>
    resultset Foo
    </model_config>


    $c->res->redirect($c->uri_for_action('/foo/index'));

    $c->uri_for_action is prefered because /foo/index is not a URI but an
    internal path to the index action from the Foo controller and this code
    doesn't need to be changed even if the public URI to that action changes.

    $form->model->default_values($foo);

    This fills the form with the values from $foo record when the form is
    displayed.

    HTH.

    --Octavian

    ----- Original Message -----
    From: "E R" <pc88mxer@gmail.com>
    To: "The elegant MVC web framework" <catalyst@lists.scsys.co.uk>
    Sent: Tuesday, September 21, 2010 12:48 AM
    Subject: [Catalyst] best practices for handling forms?

    Hi,

    I am curious what everyone thinks as being the best practices for
    handling forms in Catalyst. Are there any Catalyst applications you
    have run across which are good examples of how to use Catalyst's
    features to handle forms?

    To illustrate what I am getting at, below is typical Rails (v2)
    controller code which implements updating the attributes of an object:

    def edit
    @book = Book.find(params[:id])
    @subjects = Subject.find(:all)
    end
    def update
    @book = Book.find(params[:id])
    if @book.update_attributes(params[:book])
    flash[:notice] = 'Book successfully updated.'
    redirect_to :action => 'show', :id => @book
    else
    @subjects = Subject.find(:all)
    render :action => 'edit'
    end
    end

    In Catalyst, this would be appear something like (and please correct
    me if I have made any errors here):

    sub edit :Args(1) {
    my ($self, $c, $id) = @_;
    ... set up $c->stash for template 'edit' ...
    # no need to set $c->stash->{template} - will be set from the current
    action
    }

    sub update :Args(1) {
    my ($self, $c, $id) = @_;
    ...process form...
    if (form is valid) {
    ...perform updates...
    $c->flash->{notice} = 'Book successfully updated.';
    $c->res->redirect('show', $id);
    } else {
    ... set up $c->stash for 'edit' template ...
    $c->stash->{template} = 'edit';
    }
    }

    Any comments on this architecture? Is there a better way? My main problems
    are:

    1. The code ... set up $c->stash for 'edit' template ... is duplicated
    in both edit and update (which is also true for the Rails code).

    2. Having the template name defaulted from the current action is nice,
    but that means we have to explicitly set it in the update method. Is
    it better to always explicitly set the template name in a controller
    method? Then update could perform a $c->detach('edit', $id) or would
    you use $c->go('edit', $id)?

    Thanks,
    ER

    _______________________________________________
    List: Catalyst@lists.scsys.co.uk
    Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
    Searchable archive:
    http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
    Dev site: http://dev.catalyst.perl.org/
  • E R at Sep 21, 2010 at 5:25 pm
    Hernan, Octavian - thanks for your replies.

    Both of you have given examples where the display of the form and the
    processing of the form are handled by the same method. In that case in
    order to go from one page to the next you always need to use a
    redirect. Doing this is very clean, but it involve another
    communications round trip.

    If the form display and form processing are handled by separate
    methods, you can avoid the redirect if you're careful.

    Any thoughts on this issue?

    Thanks,
    ER
  • Octavian Rasnita at Sep 21, 2010 at 7:15 pm
    You don't need to do the redirect if you don't want it, but it is the recommended way.

    Instead of the redirect, you can forward to another method that prints the page you want:

    $c->forward('foo/success_method', ['possible', 'parameters']);

    In that case after the data is stored in DB, the specified method is called.

    But after doing a POST request it is a good idea to do a redirect because if the user would refresh the page, he might send the posted data again.

    Octavian

    ----- Original Message -----
    From: "E R" <pc88mxer@gmail.com>
    To: "The elegant MVC web framework" <catalyst@lists.scsys.co.uk>
    Sent: Tuesday, September 21, 2010 8:25 PM
    Subject: Re: [Catalyst] best practices for handling forms?

    Hernan, Octavian - thanks for your replies.

    Both of you have given examples where the display of the form and the
    processing of the form are handled by the same method. In that case in
    order to go from one page to the next you always need to use a
    redirect. Doing this is very clean, but it involve another
    communications round trip.

    If the form display and form processing are handled by separate
    methods, you can avoid the redirect if you're careful.

    Any thoughts on this issue?

    Thanks,
    ER

    _______________________________________________
    List: Catalyst@lists.scsys.co.uk
    Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
    Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
    Dev site: http://dev.catalyst.perl.org/
  • Alexander Hartmaier at Sep 29, 2010 at 10:24 pm
    Take a look at HFH, especially this pod:
    http://search.cpan.org/~gshank/HTML-FormHandler-0.32002/lib/HTML/FormHandler/Manual/Cookbook.pod

    I tried both FormFu and FormHandler and the later is much cleaner code
    and also a lot faster although it uses Moose.

    --
    Best regards, Alex


    Am Montag, den 20.09.2010, 23:48 +0200 schrieb E R:
    Hi,

    I am curious what everyone thinks as being the best practices for
    handling forms in Catalyst. Are there any Catalyst applications you
    have run across which are good examples of how to use Catalyst's
    features to handle forms?

    To illustrate what I am getting at, below is typical Rails (v2)
    controller code which implements updating the attributes of an object:

    def edit
    @book = Book.find(params[:id])
    @subjects = Subject.find(:all)
    end
    def update
    @book = Book.find(params[:id])
    if @book.update_attributes(params[:book])
    flash[:notice] = 'Book successfully updated.'
    redirect_to :action => 'show', :id => @book
    else
    @subjects = Subject.find(:all)
    render :action => 'edit'
    end
    end

    In Catalyst, this would be appear something like (and please correct
    me if I have made any errors here):

    sub edit :Args(1) {
    my ($self, $c, $id) = @_;
    ... set up $c->stash for template 'edit' ...
    # no need to set $c->stash->{template} - will be set from the current action
    }

    sub update :Args(1) {
    my ($self, $c, $id) = @_;
    ...process form...
    if (form is valid) {
    ...perform updates...
    $c->flash->{notice} = 'Book successfully updated.';
    $c->res->redirect('show', $id);
    } else {
    ... set up $c->stash for 'edit' template ...
    $c->stash->{template} = 'edit';
    }
    }

    Any comments on this architecture? Is there a better way? My main problems are:

    1. The code ... set up $c->stash for 'edit' template ... is duplicated
    in both edit and update (which is also true for the Rails code).

    2. Having the template name defaulted from the current action is nice,
    but that means we have to explicitly set it in the update method. Is
    it better to always explicitly set the template name in a controller
    method? Then update could perform a $c->detach('edit', $id) or would
    you use $c->go('edit', $id)?

    Thanks,
    ER

    _______________________________________________
    List: Catalyst@lists.scsys.co.uk
    Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
    Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
    Dev site: http://dev.catalyst.perl.org/

    *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*
    T-Systems Austria GesmbH Rennweg 97-99, 1030 Wien
    Handelsgericht Wien, FN 79340b
    *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*
    Notice: This e-mail contains information that is confidential and may be privileged.
    If you are not the intended recipient, please notify the sender and then
    delete this e-mail immediately.
    *"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*"*

Related Discussions

Discussion Navigation
viewthread | post
Discussion Overview
groupcatalyst @
categoriescatalyst, perl
postedSep 20, '10 at 9:48p
activeSep 29, '10 at 10:24p
posts8
users5
websitecatalystframework.org
irc#catalyst

People

Translate

site design / logo © 2022 Grokbase