[Catalyst] No database defaults with FormHandler and DBIC
Martin Řehák
rehak at tekkirk.org
Sun Dec 11 18:37:37 GMT 2016
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@lists.scsys.co.uk/
> Dev site: http://dev.catalyst.perl.org/
More information about the Catalyst
mailing list