[prev] [thread] [next] [Date index for 2004/11/05]
--0-208343704-1099695494=:45662 Content-Type: text/plain; charset=us-ascii Content-Id: Content-Disposition: inline Here's a first shot at t_new functionality put in AsForm.pm. It works. Maybe the argument against AsForm making inputs for your foreign keys is why don't you call to_cgi yourself with the classes for those columns. I have a lot of composite business objects. With edit and create forms that becomes 2 calls for every foreign key to to cgi. Most business objects have at least 2 foreign objects they own. Take a Customer object, It often has address, person, phone, email. Here's an example of how to use my AsForm using the Customer object just mentioned. # This works only for has_a columns in customer Customer->has_a("address" => Address); . . . Customer->has_a("email" => Email); # Now If you want address, person, phone, email inputs on your Customer form # say this: Customer->has_a_new( { "address" => [ qw/street city zip state/], "person" => [ qw/first_name last_name/], "phone" => [ qw/area number/], # Say we don't want email input "email" => [ qw/domain email want_ads/ ] } ); #OK. Now if you say, my $customer_inputs = Customer->to_cgi; # you get elements as normal but for the address, person, phone, you get a hash of elements for the columns you specified. Being able to specify columns you want is nice. # IN your template you then make a macro to display a hash of elements or just a foreach loop in every template you want to use it. Here's a for each [% FOREACH col IN customer; element = customer_cgi.$col; IF (foreign_cols = element.keys); FOREACH fcol IN foreign_cols; element.$fcol.as_XML; END; NEXT; END; element.as_XML; %] YOu can see why you'd want that in a macro. Changes to as form to make this work Added a _to_foreign_inputs method and exported it. Added if clause that checks the has_a_new sub. Attached is my version. Changes are well marked. This also retrieves the values if there are any for this object as you would expect so it works for editing as well as creating. thanks, --- Andreas Fromm <Andreas.Fromm@xxxxxx.xxxxxxxxxxxx.xx> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > looks nice. I'll try it when as soon as I get the time too. It would be > really usefull to incorporate such a thing in AsForm if the problem of > the name clashes can be solved. > > Mybe a better solution then prefixing the fields with the table name > would be to prefix the fields with the fieldname of the referencing > table. Otherwise you get the same problem if more then one field > references the same table. (For example if a person-class references two > phone-numbers, a private and an office number). > > To simplify the formating of the resulting form via css, a class or id > attribute should be set, probably the plain fieldname as a class > attribute is a wise decission, so thata css-rule can be defined for all > the phoen number-fields. > > > Peter Speltz wrote: > | --- Andreas Fromm <Andreas.Fromm@xxxxxx.xxxxxxxxxxxx.xx> wrote: > | > | > |>-----BEGIN PGP SIGNED MESSAGE----- > |>Hash: SHA1 > |> > |>Ithink what Peter is trying to do, is what I'm also trying to do. If you > |>have the following structure: > |> > |>table person: > |>~ id serial > |>~ name text > |>~ adress integer references addresses > |>~ phone integer references phones > |> > |>table addresses > |>~ id serial > |>~ street text > |>~ number text > |>~ city text > |>~ zip text > |> > |>tabel phones > |>~ id serial > |>~ area text > |>~ number text > |> > |>- ----------- > |>MyClass::Person > |> > |>__PACKAGE__->set-up-everything > |>__PACKAGE__->has_a ( adress => MyClass::Addresses ) > |>__PACKAGE__->has_a ( phone => MyClass::Phones ) > |> > |>- ----------- > |>CDBI::AsForm will make a form for person with select-boxes for address > |>and phone, and what Perter (and I) would like to have is a form > |>containing input-boxes for the fields from person, addresses and phones. > |>Peter maybe asked for some extramagic of inserting default values for > |>the non-referencing fields of person (didn't understand that part > |>either). This is the reason why I don't use AsForm. > |> > |>I have been playing around with something like this a bit, but didn't > |>found the time to finish it up. It would be nice to include something > |>like this in AsFrom. My idea was to prefix the field names with the > |>table name the fields belong to, such as the field 'name' would become > |>'person.name', 'street' => 'address.street' and so on. Maybe > |>CDBI::FromCGI could be tweeked to process that kind of requests > |>properly, but I never looked at FromCGI in more detail then the > description. > |> > | > | > | That's exactly it. With a CDBI system with AsForm, the computer > already knows > | how to make these inputs. All it needs is for a class to tell it: > "HEY, instead > | of giving me a select box to choose an address, give me inputs to > create a new > | address (the result of address->to_cgi or something). Basically, in > its rawest > | form, this functionality comes just by making to_cgi call its self > with the > | has_a class when signaled to and put a hashref in the relevant column > slot > | instead of a single HTML::whatever object. I tried it but the > recursive call > | failed. > | > | There are some some issues. As Andreas said, column name clashes become a > | problem. > | > | I ended up making a system with two parts that lives in my own classes-- > | > | 1) "has_a_new_inputs" -- a part to generate other inputs for columns in a > | class that are foreign keys , which lives in my base model class. > | > | 2)"has_a_new" -- a method to tell "has_a_new_inputs" what foreign > keys I want > | other inputs for, and further more what columns from that foreign > class i want > | inputs for. This is specified in each end user class. > | > | Attached is the code and a full synopsis. I still haven't figured out > what to > | do about field name clashes so I just make sure i don't have any. > | > | I hope this is clear enough. I bet AsForm could incorporate this > | functionality. I made a feeble attempt at putting the has_a_new_inputs > code > | into AsForm::_to_new_inputs (new is a keyword in Template Toolkit and > won't > | work as a parameter). Then modifying AsForm::to_field to recognize a > new_inputs > | parametr. Then i could say: > | > | # get hashref of HTML::whatever objects instead of a single one. > | my $addr_inputs = Person->to_field("address_id", "new_inputs"). > | > | I'll try again as a proof of concept. > | > | > | thanks > | > | > | > | ===== > | pjs > | > | __________________________________________________ > | Do You Yahoo!? > | Tired of spam? Yahoo! Mail has the best spam protection around > | http://mail.yahoo.com > | > | > | ------------------------------------------------------------------------ > | > | > | # expand foreign keys in a CDBI class to inputs for columns of the > foreign class > | # using AsForm methods. > | > | # TODO make this more robust > | sub BaseCDBI::has_a_new_inputs { > | my ($self, $r) = @_; > | return 0 unless $self->can("has_a_new"); > | my $has_a_new_cols = $self->has_a_new; # HAS_A_NEW called here > | > | foreach my $col (keys %$has_a_new_cols) > | { > | my ($has_a_class, @input_cols) = @{$has_a_new_cols->{$col}}; > | > | unless ($has_a_class->can('to_field') ) { > | warn "Class: $has_a_class can't to_field. Needs AsForm."; > | next; > | } # sanity check > | > | my %res = map { $_ => $has_a_class->to_field($_) } @input_cols; > | $result{$col} = \%res; > | } > | return \%result; > | } > | > | > | sub Person::has_a_new { > | { address_id => [ qw/Address street number city state zip/ ] }, > | { phone_id => [ qw/Phone area number/] > | }; > | > | > | > | > | Synopsis: > | > | package Person; > | Person->has_a(address_id => "Address"); > | Person->has_a(phone_id => "Phone"); > | > | # specify class and columns of that class you want inputs for in place > of an > | # input for the key column. Class spec won't be necessary in finished > version > | sub has_a_new { > | { address_id => [ qw/Address street number city state zip/ ] }, > | { phone_id => [ qw/Phone area number/] > | }; > | > | # then in some near by code > | > | $template_args{cgi_inputs} = Person->to_cgi; > | my $other_inputs = Person->has_a_new_inputs; # > | $template_args{other_inputs} = $other_inputs > | > | # then in a new_person TT template > | > | [% FOREACH $col IN cgi_inputs.keys; > | IF other_inputs.$col; # insert other inputs instead of to_cgi default > | other_cols = other_inputs.$col; # stupid to lookup again > | FOREACH mycol IN other_cols.keys; > | "<label> $mycol </label>" other_cols.$mycol.as_XML; > | END; > === message truncated === ===== pjs __________________________________ Do you Yahoo!? Check out the new Yahoo! Front Page. www.yahoo.com --0-208343704-1099695494=:45662 Content-Type: application/x-perl-module; name="AsForm.pm" Content-Transfer-Encoding: base64 Content-Description: AsForm.pm Content-Disposition: attachment; filename="AsForm.pm" cGFja2FnZSBDbGFzczo6REJJOjpBc0Zvcm07CnVzZSA1LjAwNjsKdXNlIHN0 cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgQ2xhc3M6OkRCSTo6UGx1Z2luOjpU eXBlICgpOwpvdXIgJE9MRF9TVFlMRSA9IDA7Cgp1c2UgSFRNTDo6RWxlbWVu dDsKcmVxdWlyZSBFeHBvcnRlcjsKb3VyIEBJU0EgPSBxdyhFeHBvcnRlcik7 CiMjIyMjIyMjIyMjIyMjIyMjIyAgIFBFVEVSIFNQRUxUWiAgIyMjIyMjIyMj IyMjIyMjIyMjCiMjIyMjIyMjIyAgQWRkZWQgIl90b19mb3JlaWduX2lucHV0 cyIgdG8gQEVYUE9SVCAjIyMjIyMjIwpvdXIgQEVYUE9SVCA9IHF3KCB0b19j Z2kgdG9fZmllbGQgX3RvX3RleHRhcmVhIF90b190ZXh0ZmllbGQgX3RvX3Nl bGVjdAp0eXBlX29mIF90b19mb3JlaWduX2lucHV0cyApOyAKb3VyICRWRVJT SU9OID0gJzIuMyc7Cgo9aGVhZDEgTkFNRQoKQ2xhc3M6OkRCSTo6QXNGb3Jt IC0gUHJvZHVjZSBIVE1MIGZvcm0gZWxlbWVudHMgZm9yIGRhdGFiYXNlIGNv bHVtbnMKCj1oZWFkMSBTWU5PUFNJUwoKICAgIHBhY2thZ2UgTXVzaWM6OkNE OwogICAgdXNlIENsYXNzOjpEQkk6OkFzRm9ybTsKICAgIHVzZSBiYXNlICdD bGFzczo6REJJJzsKICAgIHVzZSBDR0k7CiAgICAuLi4KCiAgICBzdWIgY3Jl YXRlX29yX2VkaXQgewogICAgICAgIG15ICRjbGFzcyA9IHNoaWZ0OwogICAg ICAgIG15ICVjZ2lfZmllbGQgPSAkY2xhc3MtPnRvX2NnaTsKICAgICAgICBy ZXR1cm4gc3RhcnRfZm9ybSwKICAgICAgICAgICAgICAgKG1hcCB7ICI8Yj4k XzwvYj46ICIuICRjZ2lfZmllbGR7JF99LT5hc19IVE1MLiIgPGJyPiIgfSAK ICAgICAgICAgICAgICAgICAgICAkY2xhc3MtPkNvbHVtbnMpLAogICAgICAg ICAgICAgICBlbmRfZm9ybTsKICAgIH0KCiAgICAjIDxmb3JtIG1ldGhvZD0i cG9zdCIuLi4+CiAgICAjIFRpdGxlOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFt ZT0iVGl0bGUiIC8+IDxicj4KICAgICMgQXJ0aXN0OiA8c2VsZWN0IG5hbWU9 IkFydGlzdCI+IAogICAgIyAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0xPkdy YXRlZnVsIERlYWQ8L29wdGlvbj4KICAgICMgICAgICAgICAgIC4uLgogICAg IyAgICAgICAgIDwvc2VsZWN0PgogICAgIyAuLi4KICAgICMgPC9mb3JtPgoK PWhlYWQxIERFU0NSSVBUSU9OCgpUaGlzIG1vZHVsZSBoZWxwcyB0byBnZW5l cmF0ZSBIVE1MIGZvcm1zIGZvciBjcmVhdGluZyBuZXcgZGF0YWJhc2Ugcm93 cwpvciBlZGl0aW5nIGV4aXN0aW5nIHJvd3MuIEl0IG1hcHMgY29sdW1uIG5h bWVzIGluIGEgZGF0YWJhc2UgdGFibGUgdG8KSFRNTCBmb3JtIGVsZW1lbnRz IHdoaWNoIGZpdCB0aGUgc2NoZW1hLiBMYXJnZSB0ZXh0IGZpZWxkcyBhcmUg dHVybmVkCmludG8gdGV4dGFyZWFzLCBhbmQgZmllbGRzIHdpdGggYSBoYXMt YSByZWxhdGlvbnNoaXAgdG8gb3RoZXIKQzxDbGFzczo6REJJPiB0YWJsZXMg YXJlIHR1cm5lZCBpbnRvIHNlbGVjdCBkcm9wLWRvd25zIHBvcHVsYXRlZCB3 aXRoCm9iamVjdHMgZnJvbSB0aGUgam9pbmVkIGNsYXNzLgoKPWhlYWQxIE1F VEhPRFMKClRoZSBtb2R1bGUgaXMgYSBtaXgtaW4gd2hpY2ggYWRkcyB0d28g YWRkaXRpb25hbCBtZXRob2RzIHRvIHlvdXIKQzxDbGFzczo6REJJPi1kZXJp dmVkIGNsYXNzLiAKCj1oZWFkMiB0b19jZ2kKClRoaXMgcmV0dXJucyBhIGhh c2ggbWFwcGluZyBhbGwgdGhlIGNvbHVtbiBuYW1lcyBvZiB0aGUgY2xhc3Mg dG8KSFRNTDo6RWxlbWVudCBvYmplY3RzIHJlcHJlc2VudGluZyBmb3JtIHdp ZGdldHMuCgo9Y3V0CgpzdWIgdG9fY2dpIHsKICAgIG15ICRjbGFzcyA9IHNo aWZ0OwogICAgbWFwIHsgJF8gPT4gJGNsYXNzLT50b19maWVsZCgkXykgfSAk Y2xhc3MtPmNvbHVtbnM7Cn0KCj1oZWFkMiB0b19maWVsZCgkZmllbGQgWywg JGhvd10pCgpUaGlzIG1hcHMgYW4gaW5kaXZpZHVhbCBjb2x1bW4gdG8gYSBm b3JtIGVsZW1lbnQuIFRoZSBDPGhvdz4gYXJndW1lbnQKY2FuIGJlIHVzZWQg dG8gZm9yY2UgdGhlIGZpZWxkIHR5cGUgaW50byBvbmUgb2YgQzx0ZXh0Zmll bGQ+LCBDPHRleHRhcmVhPgpvciBDPHNlbGVjdD47IHlvdSBjYW4gdXNlIHRo aXMgaXMgeW91IHdhbnQgdG8gYXZvaWQgdGhlIGF1dG9tYXRpYyBkZXRlY3Rp b24Kb2YgaGFzLWEgcmVsYXRpb25zaGlwcy4KCj1jdXQKCnN1YiB0b19maWVs ZCB7CiAgICBteSAoJHNlbGYsICRmaWVsZCwgJGhvdykgPSBAXzsKICAgIG15 ICRjbGFzcyA9IHJlZiAkc2VsZiB8fCAkc2VsZjsKCiMjIyMjIyMjIyMjIyMj IyMjIyAgIFBFVEVSIFNQRUxUWiAgIyMjIyMjIyMjIyMjIyMjIyMjCiMjIyMj IyMjICBBZGRlZCBjb21wbGV0ZSBpZiBjbGF1c2UgaGVyZSAjIyMjIyMjIyMj IyMjCiAgICBpZiAoJGNsYXNzLT5jYW4oImhhc19hX25ldyIpICYmIChteSAk Zm9yZWlnbl9maWVsZHMgPSAkY2xhc3MtPmhhc19hX25ldy0+eyRmaWVsZH0p KSAgICB7IAogICAgI2lmICggJGNsYXNzLT5jYW4oImhhc19hX25ldyIpICl7 CgkJbXkgJGhhc19hX25ldyA9ICRjbGFzcy0+aGFzX2FfbmV3OyAKICAgICAg ICByZXR1cm4gJHNlbGYtPl90b19mb3JlaWduX2lucHV0cygkZmllbGQsICRm b3JlaWduX2ZpZWxkcyk7CiAgICB9CgogICAgaWYgKCRob3cgYW5kICRob3cg PX4gL14odGV4dChhcmVhfGZpZWxkKXxzZWxlY3QpJC8pIHsKICAgICAgICBu byBzdHJpY3QgJ3JlZnMnOwogICAgICAgIG15ICRtZXRoID0gIl90b18kaG93 IjsKCQkjIHBqcyBtYXliZSBjaGFuZ2UgdG8gc2VsZgogICAgICAgIHJldHVy biAkY2xhc3MtPiRtZXRoKCRmaWVsZCk7CiAgICB9CiAgICBteSAkaGFzYSA9 ICRjbGFzcy0+X19oYXNhX3JlbHMtPnskZmllbGR9OwogICAgcmV0dXJuICRz ZWxmLT5fdG9fc2VsZWN0KCRmaWVsZCwgJGhhc2EtPlswXSkKICAgICAgICBp ZiBkZWZpbmVkICRoYXNhIGFuZCAkaGFzYS0+WzBdLT5pc2EoIkNsYXNzOjpE QkkiKTsKCiAgICAjIFJpZ2h0LCBoYXZlIHNvbWUgb2YgdGhpcyEKICAgIGV2 YWwgInBhY2thZ2UgJGNsYXNzOyBDbGFzczo6REJJOjpQbHVnaW46OlR5cGUt PmltcG9ydCgpIjsKICAgIG15ICR0eXBlID0gJGNsYXNzLT5jb2x1bW5fdHlw ZSgkZmllbGQpOwogICAgcmV0dXJuICRzZWxmLT5fdG9fdGV4dGFyZWEoJGZp ZWxkKQogICAgICAgIGlmICR0eXBlIGFuZCAkdHlwZSA9fiAvXihURVhUfEJM T0IpJC9pOwogICAgcmV0dXJuICRzZWxmLT5fdG9fdGV4dGZpZWxkKCRmaWVs ZCk7Cn0KCnN1YiBfdG9fdGV4dGFyZWEgewogICAgbXkgKCRzZWxmLCAkY29s KSA9IEBfOwogICAgbXkgJGEgPSBIVE1MOjpFbGVtZW50LT5uZXcoInRleHRh cmVhIiwgbmFtZSA9PiAkY29sKTsKICAgIGlmIChyZWYgJHNlbGYpIHsgJGEt PnB1c2hfY29udGVudCgkc2VsZi0+JGNvbCkgfQogICAgJE9MRF9TVFlMRSAm JiByZXR1cm4gJGEtPmFzX0hUTUw7CiAgICAkYTsKfQoKc3ViIF90b190ZXh0 ZmllbGQgewogICAgbXkgKCRzZWxmLCAkY29sKSA9IEBfOwogICAgbXkgJHZh bHVlID0gcmVmICRzZWxmICYmICRzZWxmLT4kY29sOwogICAgbXkgJGEgPSBI VE1MOjpFbGVtZW50LT5uZXcoImlucHV0IiwgdHlwZT0+ICJ0ZXh0IiwgbmFt ZSA9PiAkY29sKTsKICAgICRhLT5hdHRyKCJ2YWx1ZSIgPT4gJHZhbHVlKSBp ZiAkdmFsdWU7CiAgICAkT0xEX1NUWUxFICYmIHJldHVybiAkYS0+YXNfSFRN TDsKICAgICRhOwp9CgpzdWIgX3RvX3NlbGVjdCB7CiAgICBteSAoJHNlbGYs ICRjb2wsICRoaW50KSA9IEBfOwogICAgbXkgJGhhc19hX2NsYXNzID0gJGhp bnQgfHwgJHNlbGYtPl9faGFzYV9yZWxzLT57JGNvbH0tPlswXTsKICAgIG15 IEBvYmpzID0gJGhhc19hX2NsYXNzLT5yZXRyaWV2ZV9hbGw7CiAgICBteSAk YSA9IEhUTUw6OkVsZW1lbnQtPm5ldygic2VsZWN0IiwgbmFtZSA9PiAkY29s KTsKICAgIGZvciAoQG9ianMpIHsgCiAgICAgICAgbXkgJHNlbCA9IEhUTUw6 OkVsZW1lbnQtPm5ldygib3B0aW9uIiwgdmFsdWUgPT4gJF8tPmlkKTsKICAg ICAgICAkc2VsLT5hdHRyKCJzZWxlY3RlZCIgPT4gInNlbGVjdGVkIikgaWYg cmVmICRzZWxmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBhbmQgZXZhbCB7ICRfLT5pZCBlcSAkc2VsZi0+JGNv bC0+aWQgfTsKICAgICAgICAkc2VsLT5wdXNoX2NvbnRlbnQoJF8tPnN0cmlu Z2lmeV9zZWxmKTsKICAgICAgICAkYS0+cHVzaF9jb250ZW50KCRzZWwpOwog ICAgfQogICAgJE9MRF9TVFlMRSAmJiByZXR1cm4gJGEtPmFzX0hUTUw7CiAg ICAkYTsKfQoKIyMjIyMjIyMjIyMjIyMjIyMjICAgIFBFVEVSIFNQRUxUWiAj IyMjIyMjIyMjIyMjIyMjIwojIyMjIyMjIyMgIEFkZGVkICJfdG9fZm9yZWln bl9pbnB1dHMiIHN1YiAjIyMjIyMjIyMjCnN1YiBfdG9fZm9yZWlnbl9pbnB1 dHMgewoJbXkgKCRzZWxmLCAkY29sLCAkZm9yZWlnbl9maWVsZHMpID0gQF87 CiAgICBteSAgJGhhc19hX2NsYXNzID0gICRzZWxmLT5fX2hhc2FfcmVscy0+ eyRjb2x9LT5bMF07CgoJIyBnZXQgdGhlIGZvcmVpZ24gb2JqZWN0IGlmIHdl IGNhbgoJaWYgKHJlZiAkc2VsZikgewoJCW15ICRpZCA9ICRzZWxmLT4kY29s LT5pZCA7CgkJI3ByaW50ICJJRCBpcyAiIC4gJHNlbGYtPiRjb2wgLiAiICAk aWQgXG4iOwoJCW15ICRmb3JlaWduX29iaiA9ICRoYXNfYV9jbGFzcy0+cmV0 cmlldmUoJHNlbGYtPiRjb2wtPmlkKTsKCQkkaGFzX2FfY2xhc3MgPSAkZm9y ZWlnbl9vYmogaWYgJGZvcmVpZ25fb2JqOwoJfQoKCW15ICVyZXN1bHQgPSBt YXAgeyAkXyA9PiAkaGFzX2FfY2xhc3MtPnRvX2ZpZWxkKCRfKSB9IEAkZm9y ZWlnbl9maWVsZHM7CglyZXR1cm4gXCVyZXN1bHQ7Cn0KIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwoKIyBQ cmVsb2FkZWQgbWV0aG9kcyBnbyBoZXJlLgoKMTsKCj1oZWFkMSBDSEFOR0VT CgpWZXJzaW9uIDEueCBvZiB0aGlzIG1vZHVsZSByZXR1cm5lZCByYXcgSFRN TCBpbnN0ZWFkIG9mIEM8SFRNTDo6RWxlbWVudD4Kb2JqZWN0cywgd2hpY2gg bWFkZSBpdCBoYXJkZXIgdG8gbWFuaXB1bGF0ZSB0aGUgSFRNTCBiZWZvcmUg c2VuZGluZyBpdApvdXQuIElmIHlvdSBkZXBlbmQgb24gdGhlIG9sZCBiZWhh dmlvdXIsIHNldCBDPCRDbGFzczo6REJJOjpBc0Zvcm06Ok9MRF9TVFlMRT4K dG8gYSB0cnVlIHZhbHVlLgoKPWhlYWQxIEFVVEhPUgoKU2ltb24gQ296ZW5z LCBDPHNpbW9uQGNwYW4ub3JnPgoKPWhlYWQxIFNFRSBBTFNPCgpMPENsYXNz OjpEQkk+LCBMPENsYXNzOjpEQkk6OkZyb21DR0k+LCBMPEhUTUw6OkVsZW1l bnQ+LgoKPWN1dAo= --0-208343704-1099695494=:45662--
Thoughts on a CDBI::AsForm::_to_new()
|
Re: Thoughts on a CDBI::AsForm::_to_new()
|
Re: Thoughts on a CDBI::AsForm::_to_new()
|
Re: Thoughts on a CDBI::AsForm::_to_new()
|
Re: Thoughts on a CDBI::AsForm::_to_new()
|
Re: Thoughts on a CDBI::AsForm::_to_new()
|
Re: Thoughts on a CDBI::AsForm::_to_new()
|
Generated at 11:34 on 01 Dec 2004 by mariachi v0.52