[Catalyst] No database defaults with FormHandler and DBIC

LNATION . thisusedtobeanemail at gmail.com
Mon Dec 12 07:05:34 GMT 2016


Good morning Martin

I wrote this Saturday night, it uses Moose as both HTML::FormHandler and
Catalyst do... as long as result_source->columns_info gives you what I
think, it should work... beware I only wrote on quick test :)

https://github.com/ThisUsedToBeAnEmail/HTML-FormHandler-Role-Default/blob/master/lib/HTML/FormHandler/Role/Default.pm

If you're adamant on having this logic in your schema I would looking into
just writing a new_with_defaults method where you just loop through the
Results column info build a hash and then return new_result(%defaults).

Regards,

Robert.


On Sun, Dec 11, 2016 at 7:37 PM, Martin Řehák <rehak at tekkirk.org> wrote:

> Hi,
>
> thank you for kickstarting me. I still don't understand there is no such
> method
> provided by DBIx already I have resolved the issue with this diff:
>
> diff -r d65de14e366f lib/reha/Controller/Lesson.pm
> --- a/lib/reha/Controller/Lesson.pm     Sat Dec 10 17:22:07 2016 +0100
> +++ b/lib/reha/Controller/Lesson.pm     Sun Dec 11 19:35:28 2016 +0100
> @@ -54,17 +54,9 @@
>         my ($self, $c, $lesson_id) = @_;
>         my ($validated);
>
> -       my $init_row = $c->model('DB::Lesson')->new_result({});
> +       my $row = $c->model('DB::Lesson')->find_or_default({id =>
> $lesson_id});
>         $validated = $self->formDetail->process(
> -               item => $init_row,
> +               item => $row,
>                 params => $c->req->parameters);
>
>         if ($validated) {
> diff -r d65de14e366f lib/reha/Schema.pm
> --- a/lib/reha/Schema.pm        Sat Dec 10 17:22:07 2016 +0100
> +++ b/lib/reha/Schema.pm        Sun Dec 11 19:35:28 2016 +0100
> @@ -8,7 +8,9 @@
>  use MooseX::MarkAsMethods autoclean => 1;
>  extends 'DBIx::Class::Schema';
>
> -__PACKAGE__->load_namespaces;
> +__PACKAGE__->load_namespaces(
> +       default_resultset_class => '+reha::Schema::ResultSet::Base',
> +       resultset_namespace => 'Base');
>
>
>  # Created by DBIx::Class::Schema::Loader v0.07043 @ 2016-02-05 16:52:32
> diff -r d65de14e366f lib/reha/Schema/ResultSet/Base.pm
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/lib/reha/Schema/ResultSet/Base.pm Sun Dec 11 19:35:28 2016 +0100
> @@ -0,0 +1,28 @@
> +package reha::Schema::ResultSet::Base;
> +
> +use strict;
> +use warnings;
> +
> +use base 'DBIx::Class::ResultSet';
> +
> +sub find_or_default {
> +       my $self     = shift;
> +       my $attrs    = (@_ > 1 && ref $_[$#_] eq 'HASH' ? pop(@_) : {});
> +       my $hash     = ref $_[0] eq 'HASH' ? shift : {@_};
> +       my $row;
> +
> +       # return data if found
> +       if (keys %$hash and $row = $self->find($hash, $attrs) ) {
> +               return $row;
> +       }
> +
> +       # return new result with defaults prefilled
> +       $row = $self->new_result($hash);
> +       foreach my $col ($row->result_source->columns) {
> +               my $default = $row->result_source->column_
> info($col)->{default_value};
> +               $row->$col($default) if($default && !defined $row->$col());
> +       }
> +       return $row;
> +}
> +
> +1;
>
> Thank you very much all for patience with my issue.
>
> Regards
> --
> Martin
>
> On 2016.12.10 18:00:05 +0100, LNATION . wrote:
> > Sorry Long day :) corrected sentence...
> >
> > The problem is because when you call ->new_result the default_value does
> > not get set, which is reasonable behavior the moment you are dealing with
> > time. I am unsure whether there is another create method which uses
> > database or even the schema column spec.
> >
> > Regards
> >
> > Robert
> >
> > On Sat, Dec 10, 2016 at 5:48 PM, LNATION . <
> thisusedtobeanemail at gmail.com>
> > wrote:
> >
> > > The problem I think is when you call >new_result the default value from
> > > your database does get **populated that happens when on insert....
> > >
> > > On Sat, Dec 10, 2016 at 5:17 PM, Martin Řehák <rehak at tekkirk.org>
> wrote:
> > >
> > >> Hi,
> > >>
> > >> I understand that there is a complicated solution. I am looking for
> > >> the simplest way.
> > >>
> > >> Doc says:
> > >>
> > >> <snip>
> > >> For forms where you pass in an 'item' (usually a database row object),
> > >> the values in that object will be used preferentially; if an accessor
> > >> exists in the 'item' object, then the defaults won't be used. (If an
> > >> accessor doesn't exist, the defaults *will* be used.)
> > >>
> > >> $form->process( item => $row, params => {} );
> > >>
> > >> For the above call the 'default' on the field will not be used, which
> is
> > >> usually what you want.
> > >> </snip>
> > >>
> > >> What is the easiest way how to get defaults going from the database
> > >> schema into a form, please? Is process() function able to propagate
> > >> defaults from $row into $form? How to achieve that?
> > >>
> > >> Regards
> > >> --
> > >> Martin
> > >>
> > >> On 2016.12.10 16:51:52 +0100, LNATION . wrote:
> > >> > My email coding has some syntax errors, apologies.
> > >> >
> > >> > On Sat, Dec 10, 2016 at 4:50 PM, LNATION . <
> > >> thisusedtobeanemail at gmail.com>
> > >> > wrote:
> > >> >
> > >> > > and then make a role role
> > >> > >
> > >> > > has default_column_spec => ( ...)
> > >> > >
> > >> > > before render => sub {
> > >> > >       while (my ($field, $default) = each %{
> > >> $_[0]->default_column_spec}{
> > >> > >           unless ($_[0]->field($filed)->value) { # mayb editing
> > >> > >                 $_[0]->field('$field)->value($default);
> > >> > >            }
> > >> > >       }
> > >> > > }
> > >> > >
> > >> > >
> > >> > > On Sat, Dec 10, 2016 at 4:41 PM, LNATION . <
> > >> thisusedtobeanemail at gmail.com>
> > >> > > wrote:
> > >> > >
> > >> > >> maybe something like ......
> > >> > >>
> > >> > >>     my $columns = $result->result_source->columns_info;
> > >> > >>     my %default_form_spec;
> > >> > >>     for my $name (keys %{$columns}){
> > >> > >>          if (my $default = $columns->{$name}->{default_value}) {
> > >> > >>              $default_form_spec{  $name } = $default;
> > >> > >>          }
> > >> > >>     }
> > >> > >>
> > >> > >>
> > >> > >>
> > >> > >
> > >>
> > >> > _______________________________________________
> > >> > List: Catalyst at lists.scsys.co.uk
> > >> > Listinfo: http://lists.scsys.co.uk/cgi-
> bin/mailman/listinfo/catalyst
> > >> > Searchable archive: http://www.mail-archive.com/ca
> > >> talyst at lists.scsys.co.uk/
> > >> > Dev site: http://dev.catalyst.perl.org/
> > >>
> > >>
> > >> _______________________________________________
> > >> List: Catalyst at lists.scsys.co.uk
> > >> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> > >> Searchable archive: http://www.mail-archive.com/ca
> > >> talyst at lists.scsys.co.uk/
> > >> Dev site: http://dev.catalyst.perl.org/
> > >>
> > >
> > >
>
> > _______________________________________________
> > List: Catalyst at lists.scsys.co.uk
> > Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> > Searchable archive: http://www.mail-archive.com/
> catalyst at lists.scsys.co.uk/
> > Dev site: http://dev.catalyst.perl.org/
>
>
> _______________________________________________
> List: Catalyst at lists.scsys.co.uk
> Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
> Searchable archive: http://www.mail-archive.com/
> catalyst at 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/20161212/7019bfc4/attachment.htm>


More information about the Catalyst mailing list