Re: [Catalyst] No database defaults with FormHandler and DBIC
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.pmSat Dec 10 17:22:07 2016 +0100 +++ b/lib/reha/Schema.pmSun 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 + +++ 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 . > 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 wrote: > > > >> Hi, > >> > >> I understand that there is a complicated solution. I am looking for > >> the simplest way. > >> > >> Doc says: > >> > >> > >> 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. > >> > >> > >> 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 . < > >> thisusedtobeanem...@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 . < > >> thisusedtobeanem...@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; > >> > >> } > >> > >> } > >> > >> > >> > >>
Re: [Catalyst] No database defaults with FormHandler and DBIC
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 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.pmSat Dec 10 17:22:07 2016 +0100 > +++ b/lib/reha/Schema.pmSun 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 + > +++ 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 . < > thisusedtobeanem...@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 > wrote: > > > > > >> Hi, > > >> > > >> I understand that there is a complicated solution. I am looking for > > >> the simplest way. > > >> > > >> Doc says: > > >> > > >> > > >> 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. > > >> > > >> > > >> 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 . < > > >> thisusedtobeanem...@gmail.com> > > >> > wrote: > > >> > > > >>