table-editor — table editor
| Attribute | Pos. | Req. | Default | Description |
|---|---|---|---|---|
| mv_data_table | table | Yes | table name | ||
| item_id | key | Yes | key | ||
| [ ui_data_fields | mv_data_fields | fields ] | Yes | No | All fields. | Fields to edit. |
| [ ui_meta_view | view ] | ||||
| cgi | ||||
| ui_multi_key | ||||
| item_id_left | ||||
| ui_sequence_edit | ||||
| notable | ||||
| ui_clone_id | clone | clone existing record | |||
| ui_profile | profile | form profile | |||
| all_opts | ||||
| save_meta | ||||
| no_meta | None | Turns off meta editor link. | ||
| across | ||||
| cell_span | ||||
| default_ref | ||||
| append | ||||
| check | ||||
| class | ||||
| database | ||||
| hidden | None | hidden form variables | ||
| default | None | default values | ||
| disabled | ||||
| error | ||||
| extra | ||||
| field | ||||
| filter | ||||
| form | ||||
| height | ||||
| help | inline help | |||
| help_url | ||||
| label | ||||
| wid_href | ||||
| lookup | ||||
| lookup_query | ||||
| meta | ||||
| js_check | ||||
| maxlength | ||||
| options | ||||
| outboard | ||||
| override | ||||
| passed | ||||
| pre_filter | ||||
| prepend | ||||
| template | ||||
| widget | ||||
| widget_class | HTML class for all widgets | |||
| width | ||||
| colspan | ||||
| blabel | ||||
| elabel | ||||
| hidden_all | ||||
| next_text |
OK
|
Label for "OK" button. | ||
| cancel_text |
Cancel
|
Label for "Cancel" button. | ||
| back_text |
Back
|
Label for "Back" button. | ||
| no_top | None | Whether to hide buttons at the top or not. | ||
| ok_button_style |
font-weight: bold; width: 40px; text-align: center
|
HTML style attribute for "OK" button. | ||
| wizard | ||||
| nosave | ||||
| action_click | ||||
| wizard_next | ||||
| wizard_cancel | ||||
| mv_cancelpage | ||||
| mv_prevpage | ||||
| output_map | ||||
| no_table_meta | ||||
| tabbed | ||||
| auto_secure | ||||
| keep_errors | ||||
| ui_profile_success | ||||
| mv_failpage | ||||
| orig_cancel_text | ||||
| orig_back_text | ||||
| action | ||||
| message_label | ||||
| all_errors | ||||
| color_fail | ||||
| [ ui_display_only | email_fields ] | ||||
| interpolate | 0 | interpolate input? | ||
| reparse | 1 | interpolate output? | ||
| hide | 0 | Hide the tag return value? |
Interchange 5.9.0:
Source: code/UI_Tag/table_editor.coretag
Lines: 30
# Copyright 2002-2007 Interchange Development Group and others
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version. See the LICENSE file for details.
#
# $Id: table_editor.coretag,v 1.18 2007-03-30 23:40:54 pajamian Exp $
UserTag table-editor Order mv_data_table item_id
UserTag table-editor addAttr
UserTag table-editor AttrAlias clone ui_clone_id
UserTag table-editor AttrAlias table mv_data_table
UserTag table-editor AttrAlias fields ui_data_fields
UserTag table-editor AttrAlias mv_data_fields ui_data_fields
UserTag table-editor AttrAlias key item_id
UserTag table-editor AttrAlias view ui_meta_view
UserTag table-editor AttrAlias profile ui_profile
UserTag table-editor AttrAlias email_fields ui_display_only
UserTag table-editor hasEndTag
UserTag table-editor Version $Revision: 1.18 $
UserTag table-editor MapRoutine Vend::Table::Editor::editor
UserTag table-editor Documentation <<EOD
Hint: table_editor may not work for tables where the primary key
field is named 'id'.
You can change this behavior by just removing this line from ICDIR/etc/varnames:
mv_session_id id
EOD
Source: lib/Vend/Table/Editor.pm
Lines: 2594
sub editor {
my ($table, $key, $opt, $overall_template) = @_;
show_times("begin table editor call item_id=$key") if $Global::ShowTimes;
#::logDebug("overall_template=$overall_template\nin=$opt->{overall_template}");
use vars qw/$Tag/;
editor_init($opt);
my @messages;
my @errors;
my $pass_return_to;
my $hidden = $opt->{hidden} ||= {};
#::logDebug("key at beginning: $key");
$opt->{mv_data_table} = $table if $table;
$opt->{table} = $opt->{mv_data_table};
$opt->{ui_meta_view} ||= $CGI->{ui_meta_view} if $opt->{cgi};
$key ||= $opt->{item_id};
if($opt->{cgi}) {
$key ||= $CGI->{item_id};
unless($opt->{ui_multi_key} = $CGI->{ui_multi_key}) {
$opt->{item_id_left} ||= $CGI::values{item_id_left};
$opt->{ui_sequence_edit} ||= $CGI::values{ui_sequence_edit};
}
}
if($opt->{ui_sequence_edit} and ! $opt->{ui_multi_key}) {
delete $opt->{ui_sequence_edit};
my $left = delete $opt->{item_id_left};
if(! $key) {
#::logDebug("No key, getting from $left");
if($left =~ s/(.*?)[\0,]// ) {
$key = $opt->{item_id} = $1;
$hidden->{item_id_left} = $left;
$hidden->{ui_sequence_edit} = 1;
}
elsif($left) {
$key = $opt->{item_id} = $left;
}
#::logDebug("No key, left now $left");
}
elsif($left) {
#::logDebug("Key, leaving left $left");
$hidden->{item_id_left} = $left;
$hidden->{ui_sequence_edit} = 1;
}
}
$opt->{item_id} = $key;
$pass_return_to = save_cgi() if $hidden->{ui_sequence_edit};
my $data;
my $exists;
my $db;
my $multikey;
## Try and sneak a peek at the data so we can determine views and
## maybe some other stuff -- we definitely need table/key or a
## clone id
unless($opt->{notable}) {
# From Vend::Data
my $tab = $table || $opt->{mv_data_table} || $CGI->{mv_data_table};
my $key = $opt->{item_id} || $CGI->{item_id};
$db = database_exists_ref($tab);
if($db) {
$multikey = $db->config('COMPOSITE_KEY');
if($multikey and $key !~ /\0/) {
$key =~ s/-_NULL_-/\0/g;
}
if($opt->{ui_clone_id} and $db->record_exists($opt->{ui_clone_id})) {
$data = $db->row_hash($opt->{ui_clone_id});
}
elsif ($key and $db->record_exists($key)) {
$data = $db->row_hash($key);
$exists = 1;
}
if(! $exists and $multikey) {
$data = {};
eval {
my @inits = split /\0/, $key;
for(@{$db->config('_Key_columns')}) {
$data->{$_} = shift @inits;
}
};
}
}
}
my $regin = $opt->{all_opts} ? 1 : 0;
resolve_options($opt, undef, $data);
$Trailer = $opt->{xhtml} ? '/' : '';
if($regin) {
## Must reset these in case they get set from all_opts.
$hidden = $opt->{hidden};
}
$overall_template = $opt->{overall_template}
if $opt->{overall_template};
$table = $opt->{table};
$key = $opt->{item_id};
if($opt->{save_meta}) {
$::Scratch->{$opt->{save_meta}} = uneval($opt);
}
#::logDebug("key after resolve_options: $key");
#::logDebug("cell_span=$opt->{cell_span}");
#### This code is also in resolve_options routine, change there too!
my $rowdiv = $opt->{across} || 1;
my $cells_per_span = $opt->{cell_span} || 2;
my $rowcount = 0;
my $span = $rowdiv * $cells_per_span;
####
my $oddspan = $span - 1;
my $def = $opt->{default_ref} || $::Values;
my $append = $opt->{append};
my $check = $opt->{check};
my $class = $opt->{class} || {};
my $database = $opt->{database};
my $default = $opt->{default};
my $disabled = $opt->{disabled};
my $error = $opt->{error};
my $extra = $opt->{extra};
my $field = $opt->{field};
my $filter = $opt->{filter};
my $form = $opt->{form};
my $height = $opt->{height};
my $help = $opt->{help};
my $help_url = $opt->{help_url};
my $id = $opt->{id};
my $label = $opt->{label};
my $wid_href = $opt->{wid_href};
my $lookup = $opt->{lookup};
my $lookup_query = $opt->{lookup_query};
my $meta = $opt->{meta};
my $js_check = $opt->{js_check};
my $maxlength = $opt->{maxlength};
my $opts = $opt->{opts};
my $options = $opt->{options};
my $outboard = $opt->{outboard};
my $override = $opt->{override};
my $passed = $opt->{passed};
my $pre_filter = $opt->{pre_filter};
my $prepend = $opt->{prepend};
my $template = $opt->{template};
my $widget = $opt->{widget};
my $width = $opt->{width};
my $colspan = $opt->{colspan} || {};
my $blabel = $opt->{blabel};
my $elabel = $opt->{elabel};
my $mlabel = '';
my $hidden_all = $opt->{hidden_all} ||= {};
#::logDebug("hidden_all=" . ::uneval($hidden_all));
my $ntext;
my $btext;
my $ctext;
if($pass_return_to) {
delete $::Scratch->{$opt->{next_text}};
}
elsif (! $opt->{wizard} and ! $opt->{nosave}) {
$ntext = $Tag->return_to('click', 1);
$ctext = $ntext . "\nmv_todo=back";
}
else {
if($opt->{action_click}) {
$ntext = <<EOF;
mv_todo=$opt->{wizard_next}
ui_wizard_action=Next
mv_click=$opt->{action_click}
EOF
}
else {
$ntext = <<EOF;
mv_todo=$opt->{wizard_next}
ui_wizard_action=Next
mv_click=ui_override_next
EOF
}
$::Scratch->{$opt->{next_text}} = $ntext;
my $hidgo = $opt->{mv_cancelpage} || $opt->{hidden}{ui_return_to} || $CGI->{return_to};
$hidgo =~ s/\0.*//s;
$ctext = $::Scratch->{$opt->{cancel_text}} = <<EOF;
mv_form_profile=
ui_wizard_action=Cancel
mv_nextpage=$hidgo
mv_todo=$opt->{wizard_cancel}
EOF
if($opt->{mv_prevpage}) {
$btext = $::Scratch->{$opt->{back_text}} = <<EOF;
mv_form_profile=
ui_wizard_action=Back
mv_nextpage=$opt->{mv_prevpage}
mv_todo=$opt->{wizard_next}
EOF
}
else {
delete $opt->{back_text};
}
}
for(qw/next_text back_text cancel_text/) {
$opt->{"orig_$_"} = $opt->{$_};
}
$::Scratch->{$opt->{next_text}} = $ntext if $ntext;
$::Scratch->{$opt->{cancel_text}} = $ctext if $ctext;
$::Scratch->{$opt->{back_text}} = $btext if $btext;
$opt->{next_text} = HTML::Entities::encode($opt->{next_text}, $ESCAPE_CHARS::std);
$opt->{back_text} = HTML::Entities::encode($opt->{back_text}, $ESCAPE_CHARS::std);
$opt->{cancel_text} = HTML::Entities::encode($opt->{cancel_text}, $ESCAPE_CHARS::std);
$::Scratch->{$opt->{next_text}} = $ntext if $ntext;
$::Scratch->{$opt->{cancel_text}} = $ctext if $ctext;
$::Scratch->{$opt->{back_text}} = $btext if $btext;
undef $opt->{auto_secure} if $opt->{cgi};
### Build the error checking
my $error_show_var = 1;
my $have_errors;
if($opt->{ui_profile} or $check) {
$Tag->error( { all => 1 } )
unless $CGI->{mv_form_profile} or $opt->{keep_errors};
my $prof = $opt->{ui_profile} || "&update=yes\n";
if ($prof =~ s/^\*//) {
# special notation ui_profile="*whatever" means
# use automatic checklist-related profile
my $name = $prof;
$prof = $::Scratch->{"profile_$name"} || "&update=yes\n";
if ($prof) {
$prof =~ s/^\s*(\w+)[\s=]+required\b/$1=mandatory/mg;
for (grep /\S/, split /\n/, $prof) {
if (/^\s*(\w+)\s*=(.+)$/) {
my $k = $1; my $v = $2;
$v =~ s/\s+$//;
$v =~ s/^\s+//;
$error->{$k} = 1;
$error_show_var = 0 if $v =~ /\S /;
}
}
$prof = '&calc delete $Values->{step_'
. $name
. "}; return 1\n"
. $prof;
## Un-confuse vi }
$opt->{ui_profile_success} = "&set=step_$name 1";
}
}
my $success = $opt->{ui_profile_success};
# make sure profile so far ends with a newline so we can add more
$prof .= "\n" unless $prof =~ /\n\s*\z/;
if(ref $check) {
while ( my($k, $v) = each %$check ) {
next unless length $v;
$error->{$k} = 1;
$v =~ s/\s+$//;
$v =~ s/^\s+//;
$v =~ s/\s+$//mg;
$v =~ s/^\s+//mg;
$v =~ s/^required\b/mandatory/mg;
unless ($v =~ /^\&/m) {
$error_show_var = 0 if $v =~ /\S /;
$v =~ s/^/$k=/mg;
$v =~ s/\n/\n&and\n/g;
}
$prof .= "$v\n";
}
}
elsif ($check) {
for (@_ = grep /\S/, split /[\s,]+/, $check) {
$error->{$_} = 1;
$prof .= "$_=mandatory\n";
}
}
## Enable individual widget checks
$::Scratch->{mv_individual_profile} = 1;
## Call the profile in the form
$opt->{hidden}{mv_form_profile} = 'ui_profile';
my $fail = $opt->{mv_failpage} || $Global::Variable->{MV_PAGE};
# watch out for early interpolation here!
$::Scratch->{ui_profile} = <<EOF;
[perl]
#Debug("cancel='$opt->{orig_cancel_text}' back='$opt->{orig_back_text}' click=\$CGI->{mv_click}");
my \@clicks = split /\\0/, \$CGI->{mv_click};
for( qq{$opt->{orig_cancel_text}}, qq{$opt->{orig_back_text}}) {
#Debug("compare is '\$_'");
next unless \$_;
my \$cancel = \$_;
for(\@clicks) {
#Debug("click is '\$_'");
return if \$_ eq \$cancel;
}
}
# the following should already be interpolated by the table-editor tag
# before going into scratch ui_profile
return <<'EOP';
$prof
&fail=$fail
&fatal=1
$success
mv_form_profile=mandatory
&set=mv_todo $opt->{action}
EOP
[/perl]
EOF
$opt->{blabel} = '<span style="font-weight: normal">';
$opt->{elabel} = '</span>';
$mlabel = ($opt->{message_label} || ' '
. errmsg('<b>Bold</b> fields are required'));
$have_errors = $Tag->error( {
all => 1,
show_var => $error_show_var,
show_error => 1,
joiner => "<br$Vend::Xtrailer>",
keep => 1}
);
if($opt->{all_errors} and $have_errors) {
my $title = $opt->{all_errors_title} || errmsg('Errors');
my $style = $opt->{all_errors_style} || "color: $opt->{color_fail}";
my %hash = (
title => $opt->{all_errors_title} || errmsg('Errors'),
style => $opt->{all_errors_style} || "color: $opt->{color_fail}",
errors => $have_errors,
);
my $tpl = $opt->{all_errors_template} || <<EOF;
<p>{TITLE}:
<blockquote style="{STYLE}">{ERRORS}</blockquote>
</p>
EOF
$mlabel .= tag_attr_list($tpl, \%hash, 'uc');
}
}