<% # options example... # # 'name' => # 'table' => # #? 'primary_key' => #required when the dbdef doesn't know...??? # 'labels' => { # 'column' => 'Label', # } # # listref - each item is a literal column name (or method) or hashref # or (notyet) coderef # if not specified all columns (except for the primary key) will be editable # 'fields' => [ # 'columname', # { 'field' => 'another_columname', # 'type' => 'text', #text, fixed, hidden # }, # ] # # 'menubar' => '', #menubar arrayref # # #run when re-displaying with an error # 'error_callback' => sub { my( $cgi, $object ) = @_; }, # # #run when editing # 'edit_callback' => sub { my( $cgi, $object ) = @_; }, # # # returns a hashref for the new object # 'new_hashref_callback' # # #run when adding # 'new_callback' => sub { my( $cgi, $object ) = @_; }, # # #XXX describe # 'field_callback' => sub { }, # # #string or coderef of additional HTML to add before # 'html_table_bottom' => '', # # 'viewall_dir' => '', #'search' or 'browse', defaults to 'search' # # 'html_bottom' => '', #string # 'html_bottom' => sub { # my $object = shift; # # ... # "html_string"; # }, my(%opt) = @_; #false laziness w/process.html my $table = $opt{'table'}; my $class = "FS::$table"; my $pkey = dbdef->table($table)->primary_key; #? $opt{'primary_key'} || my $fields = $opt{'fields'} #|| [ grep { $_ ne $pkey } dbdef->table($table)->columns ]; || [ grep { $_ ne $pkey } fields($table) ]; #my @actualfields = map { ref($_) ? $_->{'field'} : $_ } @$fields; my $object; if ( $cgi->param('error') ) { $object = $class->new( { map { $_ => scalar($cgi->param($_)) } fields($table) }); &{$opt{'error_callback'}}($cgi, $object) if $opt{'error_callback'}; } elsif ( $cgi->keywords ) { #editing my( $query ) = $cgi->keywords; $query =~ /^(\d+)$/; $object = qsearchs( $table, { $pkey => $1 } ); warn "$table $pkey => $1" if $opt{'debug'}; &{$opt{'edit_callback'}}($cgi, $object) if $opt{'edit_callback'}; } else { #adding my $hashref = $opt{'new_hashref_callback'} ? &{$opt{'new_hashref_callback'}} : {}; $object = $class->new( $hashref ); &{$opt{'new_callback'}}($cgi, $object) if $opt{'new_callback'}; } my $action = $object->$pkey() ? 'Edit' : 'Add'; my $title = "$action $opt{'name'}"; my @menubar = (); if ( $opt{'menubar'} ) { @menubar = @{ $opt{'menubar'} }; } else { @menubar = ( 'Main menu' => $p, #eventually get rid of this when the ACL/UI update is done #eventually use Lingua::bs to pluralize "View all $opt{'name'}s" => $p. ( $opt{'viewall_dir'} || 'search' ). "/$table.html", ); } %><%= include("/elements/header.html", $title, include( '/elements/menubar.html', @menubar ) ) %> <% if ( $cgi->param('error') ) { %> Error: <%= $cgi->param('error') %>

<% } %>
<%= ( $opt{labels} && exists $opt{labels}->{$pkey} ) ? $opt{labels}->{$pkey} : $pkey %> #<%= $object->$pkey() || "(NEW)" %> <%= ntable("#cccccc",2) %> <% foreach my $f ( map { ref($_) ? $_ : {'field'=>$_} } @$fields ) { &{ $opt{'field_callback'} }( $f ) if $opt{'field_callback'}; my $field = $f->{'field'}; my $type = $f->{'type'} ||= 'text'; %> <%= ( $opt{labels} && exists $opt{labels}->{$field} ) ? $opt{labels}->{$field} : $field %> <% #eventually more options for <% } else { %> <% } %> <% } %> <%= ref( $opt{'html_table_bottom'} ) ? &{ $opt{'html_table_bottom'} }( $object ) : $opt{'html_table_bottom'} %> <%= ref( $opt{'html_bottom'} ) ? &{ $opt{'html_bottom'} }( $object ) : $opt{'html_bottom'} %>
">
<%= include("/elements/footer.html") %>