On 21 Feb 2006, John Siracusa wrote: Thanks for your answer and sorry for my late reply, I couldn't work on my project for a few days.
> Ah, okay. For the record, I use an object-based approach to this kind of > thing by using Rose::HTML::Objects to manage my forms. Anyway, getting a > hashref from an RDBO is pretty straight-forward. The only tricky bit is > convincing the object accessors to deflate any "rich" values (e.g., DateTime > objects). Here's an example of that: > > # $o is a Rose::DB::Object-derived object > > # Import utility functions used to convince $o to deflate values > # as if it's saving to the database, and to restore the state later. > use Rose::DB::Object::Util qw(set_state_saving unset_state_saving); > > my %hash; > > set_state_saving($o); > > foreach my $column ($o->meta->columns) > { > my $method = $column->accessor_method_name; > $hash{$column} = $o->$method(); > } > > unset_state_saving($o); > What you'll get in the hash values are strings appropriate for storage in > the database, which may or may not be what you want. I want them appropriate for displaying in the web form. This seems to work only if I leave out the (un)set_state_saving thing. > If you *do* want to > custom-format, say, DateTime values, there's a better approach than what > you're doing here: > [...] > Try something like this instead: > > if(UNIVERSAL::isa($val, 'DateTime')) > { > $hash{$field} = $val->sprintf('%m.%d.%Y'); > } Thanks, this looks better and it works if I change it to: $val->strftime('%d.%m.%Y'); So, this is the resulting method (in my base class): sub as_hashref { my $self = shift; my %hash; # set_state_saving($self); # doesn't work (wrong date format) foreach my $column ($self->meta->columns) { my $method = $column->accessor_method_name; if(UNIVERSAL::isa($self->$method, 'DateTime')) { $hash{$column} = $self->$method->strftime('%d.%m.%Y'); } else { $hash{$column} = $self->$method; } } # unset_state_saving($self); return \%hash; } > > The same problem arises when the data comes back from the form. I > > have a CGI query object and CGI.pm has the Vars-function that gives > > me all the form data in a hashref. It would be very helpful if I > > could pass the result of $q->Vars or perhaps the whole object to my > > Rose-object, do a 'save' and everything is fine (again I would have > > to change the date fields to a format that is allowed, so again it > > would be helpful if I could define my default date format). > > Again, I use Rose::HTML::Form for this kind of stuff. But if you want to > use hashrefs and so on, you'd basically just do the reverse of the examples > shown above. And likewise, once you decide what to do and how to do it, > it's easy to add the appropriate method(s) to your common base class, > letting all your RDBO-derived objects reap the benefits. I didn't find something as clean as the above method yet. > > Here is the code I use at the moment to achieve this: > > ... > > foreach my $field (@columns) { > > next unless exists $daten{$field}; > > if ($daten{$field} eq '') { > > $daten{$field} = undef; > > } elsif ($daten{$field} =~ /(\d{1,2})\.(\d{1,2})\.(\d{4})/) { > > $daten{$field} = sprintf("$3-%02d-%02d", $2, $1); > > } > > # $rose->{$field} = $daten{$field}; > > $rose->$field($daten{$field}); > > } > > return $rose; > > } > > > > It works but looks quite clumsy, so I wanted to ask if there is a > > more elegant shortcut to achieve this common task. > > Ick :) Consider Rose::HTML::Objects. In particular, take a look at the > object_from_form() and init_with_object() methods of Rose::HTML::Form. Well, I got Rose::HTML::Object but on a first glance it doesn't look like I could easily integrate it. I use Template Toolkit, CGI.pm, HTML::FormValidator for layout control, form variables and Validation respectively. If I see it right I had to replace all this well known stuff to the equivalents in Rose::HTML::Objects, without even knowing if there is an equivalent for everything. I don't think I want to go that far at the moment, especially since I don't think it a good idea to abondon template based HTML generation. But perhaps my first look at it was too superficial? > (Also note that a major Rose::HTML::Object update is due out any day now (as > soon as I finish the docs...) which will greatly simplify the process of > setting up a form. So please don't be too scared away by the slightly > verbose nature of the examples in the existing docs :) I waited for the new release but I must admit I am still not totally convinced. Given the widespread use of CGI.pm I would find it of great help if I could stick to a CGI query object and don't have to use a Rose::HTML::Object. I know these should be methods of CGI.pm but I would appreciate something like object_from_form and init_with_object in RDBO with object = <CGI.pm query object>. Anyway, thanks for your help, it really gave me some important insights. Michael ------------------------------------------------------- This SF.Net email is sponsored by xPML, a groundbreaking scripting language that extends applications into web and mobile media. Attend the live webcast and join the prime developer group breaking into this new coding territory! http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642 _______________________________________________ Rose-db-object mailing list Rose-db-object@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rose-db-object