1 # Copyright 2002-2007 Interchange Development Group and others
3 # This program is free software; you can redistribute it and/or modify
4 # it under the terms of the GNU General Public License as published by
5 # the Free Software Foundation; either version 2 of the License, or
6 # (at your option) any later version. See the LICENSE file for details.
8 # $Id: error.coretag,v 1.11 2009-02-10 12:16:49 thunder Exp $
10 ### This is in package Vend::Interpolate, and may make reference
11 ### to variables in that module
12 UserTag error Order name
14 UserTag error PosNumber 1
15 UserTag error Version $Revision: 1.11 $
16 UserTag error Routine <<EOR
18 my ($error, $var, $opt) = @_;
19 $var = 'default' unless $var;
20 $opt = { keep => 1 } if ! $opt;
21 my $ref = $Vend::Session->{errors};
22 if($ref->{$var} and ! $opt->{overwrite}) {
23 $ref->{$var} .= errmsg(" AND ");
29 $ref->{$var} .= $error;
30 return tag_error($var, $opt);
35 $Vend::Session->{errors} = {}
36 unless defined $Vend::Session->{errors};
38 $opt->{keep} = 1 unless defined $opt->{keep};
39 my $error = delete $opt->{set};
40 return set_error($error, $var, $opt);
42 my $err_ref = $Vend::Session->{errors};
49 $opt->{show_error} = 1;
50 $opt->{std_label} = 0;
52 unless defined $opt->{show_var};
53 $opt->{joiner} = '<li>'
54 unless length $opt->{joiner};
55 $opt->{text} ||= '%s';
56 $opt->{list_container} ||= 'ul';
58 $out .= "<$opt->{list_container}";
59 for(qw/ class style extra /) {
60 next unless $opt->{$_};
62 $out .= ' ' . $opt->{$_};
65 $out .= ' ' . qq{$_="$opt->{$_}"};
69 $out .= $opt->{joiner};
70 $opt->{header} ||= $out;
71 $opt->{footer} ||= "</$opt->{list_container}>";
74 $text = $opt->{text} if $opt->{text};
76 #::logDebug("tag_error: var=$var text=$text opt=" . ::uneval($opt));
77 #::logDebug("tag_error: var=$var text=$text");
79 $opt->{joiner} = "\n" unless defined $opt->{joiner};
80 for(sort keys %$err_ref) {
81 my $err = $err_ref->{$_};
82 delete $err_ref->{$_} unless $opt->{keep};
86 if ($opt->{show_label}) {
87 if ($string = $Vend::Session->{errorlabels}{$_}) {
88 $string =~ s/[:\s]+$//;
89 $string .= " ($_)" if $opt->{show_var};
92 # Use the variable name unless Locale has a default label.
93 my $label = errmsg("error_label_${_}");
94 $label = $_ if $label eq "error_label_${_}";
95 $string .= "($label): ";
98 $string .= "$_: " if $opt->{show_var};
101 push @errors, $string;
103 #::logDebug("error all=1 found=$found_error contents='@errors'");
104 return $found_error unless $text || $opt->{show_error};
105 $text .= "%s" if $text !~ /\%s/;
106 $text = pull_else($text, $found_error);
108 return '' unless @errors;
109 @errors = map { filter_value($opt->{filter}, $_) } @errors
111 my $etext = sprintf $text, join($opt->{joiner}, @errors);
112 return join "", $opt->{header}, $etext, $opt->{footer};
114 $found_error = ! (not $err_ref->{$var});
115 my $err = $err_ref->{$var} || '';
116 delete $err_ref->{$var} unless $opt->{keep};
117 #::logDebug("error found=$found_error contents='$err'");
118 return !(not $found_error)
119 unless $opt->{std_label} || $text || $opt->{show_error};
120 $err = filter_value($opt->{filter}, $err)
122 if($opt->{std_label}) {
123 # store the error label in user's session for later
124 # possible use in [error show_label=1] calls
125 $Vend::Session->{errorlabels}{$var} = $opt->{std_label};
129 elsif(defined $::Variable->{MV_ERROR_STD_LABEL}) {
130 $text = $::Variable->{MV_ERROR_STD_LABEL};
133 my $contrast = $::Variable->{CSS_CONTRAST} || 'mv_contrast';
135 <span class="$contrast">{LABEL} <small><i>(%s)</i></small></span>
136 [else]{REQUIRED <b>}{LABEL}{REQUIRED </b>}[/else]
139 $text =~ s/{LABEL}/$opt->{std_label}/g;
140 $text =~ s/{REQUIRED\s+([^}]*)}/$opt->{required} ? $1 : ''/ge;
143 $text = '' unless defined $text;
144 $text .= '%s' unless ($text =~ /\%s/ ||
145 length $::Variable->{MV_ERROR_STD_LABEL});
147 $text = pull_else($text, $found_error);
148 $text =~ s/\%s/$err/;
153 return tag_error(@_);