[LON-CAPA-cvs] cvs: loncom /interface lonhelper.pm
bowersj2
lon-capa-cvs@mail.lon-capa.org
Tue, 17 Jun 2003 14:21:22 -0000
bowersj2 Tue Jun 17 10:21:22 2003 EDT
Modified files:
/loncom/interface lonhelper.pm
Log:
Adds validator support to lonhelper, added validator support to the
string, and fixed the parameter helper final state to support tries.
Index: loncom/interface/lonhelper.pm
diff -u loncom/interface/lonhelper.pm:1.37 loncom/interface/lonhelper.pm:1.38
--- loncom/interface/lonhelper.pm:1.37 Thu Jun 12 09:52:06 2003
+++ loncom/interface/lonhelper.pm Tue Jun 17 10:21:22 2003
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# .helper XML handler to implement the LON-CAPA helper
#
-# $Id: lonhelper.pm,v 1.37 2003/06/12 13:52:06 bowersj2 Exp $
+# $Id: lonhelper.pm,v 1.38 2003/06/17 14:21:22 bowersj2 Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -779,6 +779,18 @@
Again, see the course initialization helper for examples.
+B<validator tag>
+
+Some elements that accepts user input can contain a "validator" tag that,
+when surrounded by "sub { my $helper = shift; my $state = shift; my $element = shift; my $val = shift "
+and "}", where "$val" is the value the user entered, will form a subroutine
+that when called will verify whether the given input is valid or not. If it
+is valid, the routine will return a false value. If invalid, the routine
+will return an error message to be displayed for the user.
+
+Consult the documentation for each element to see whether it supports this
+tag.
+
B<getValue method>
If the element stores the name of the variable in a 'variable' member, which
@@ -790,7 +802,7 @@
BEGIN {
&Apache::lonhelper::register('Apache::lonhelper::element',
('nextstate', 'finalcode',
- 'defaultvalue'));
+ 'defaultvalue', 'validator'));
}
# Because we use the param hash, this is often a sufficent
@@ -855,6 +867,22 @@
sub end_defaultvalue { return ''; }
+sub start_validator {
+ my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
+
+ if ($target ne 'helper') {
+ return '';
+ }
+
+ $paramHash->{VALIDATOR} = &Apache::lonxml::get_all_text('/validator',
+ $parser);
+ $paramHash->{VALIDATOR} = 'sub { my $helper = shift; my $state = shift; my $element = shift; my $val = shift;' .
+ $paramHash->{VALIDATOR} . '}';
+ return '';
+}
+
+sub end_validator { return ''; }
+
sub preprocess {
return 1;
}
@@ -2266,6 +2294,8 @@
string honors the defaultvalue tag, if given.
+string honors the validation function, if given.
+
=cut
no strict;
@@ -2311,7 +2341,13 @@
sub render {
my $self = shift;
- my $result = '<input type="string" name="' . $self->{'variable'} . '.forminput"';
+ my $result = '';
+
+ if (defined $self->{ERROR_MSG}) {
+ $result .= '<br /><font color="#FF0000">' . $self->{ERROR_MSG} . '</font><br /><br />';
+ }
+
+ $result .= '<input type="string" name="' . $self->{'variable'} . '.forminput"';
if (defined($self->{'size'})) {
$result .= ' size="' . $self->{'size'} . '"';
@@ -2335,8 +2371,19 @@
# If a NEXTSTATE was given, switch to it
sub postprocess {
my $self = shift;
- if (defined($self->{NEXTSTATE})) {
- $helper->changeState($self->{NEXTSTATE});
+
+ if (defined($self->{VALIDATOR})) {
+ my $validator = eval($self->{VALIDATOR});
+ die 'Died during evaluation of evaulation code; Perl said: ' . $@ if $@;
+ my $invalid = &$validator($helper, $state, $self, $self->getValue());
+ if ($invalid) {
+ $self->{ERROR_MSG} = $invalid;
+ return 0;
+ }
+ }
+
+ if (defined($self->{'nextstate'})) {
+ $helper->changeState($self->{'nextstate'});
}
return 1;
@@ -2650,10 +2697,13 @@
# FIXME: Unify my designators with the standard ones
my %dateTypeHash = ('open_date' => "Opening Date",
'due_date' => "Due Date",
- 'answer_date' => "Answer Date");
+ 'answer_date' => "Answer Date",
+ 'tries' => 'Number of Tries'
+ );
my %parmTypeHash = ('open_date' => "0_opendate",
'due_date' => "0_duedate",
- 'answer_date' => "0_answerdate");
+ 'answer_date' => "0_answerdate",
+ 'tries' => '0_maxtries' );
my $affectedResourceId = "";
my $parm_name = $parmTypeHash{$vars->{ACTION_TYPE}};
@@ -2699,8 +2749,11 @@
$result .= '<p>Confirm that this information is correct, then click "Finish Wizard" to complete setting the parameter.<ul>';
# Print the type of manipulation:
- $result .= '<li>Setting the <b>' . $dateTypeHash{$vars->{ACTION_TYPE}}
- . "</b></li>\n";
+ $result .= '<li>Setting the <b>' . $dateTypeHash{$vars->{ACTION_TYPE}} . '</b>';
+ if ($vars->{ACTION_TYPE} eq 'tries') {
+ $result .= ' to <b>' . $vars->{TRIES} . '</b>';
+ }
+ $result .= "</li>\n";
if ($vars->{ACTION_TYPE} eq 'due_date' ||
$vars->{ACTION_TYPE} eq 'answer_date') {
# for due dates, we default to "date end" type entries
@@ -2717,7 +2770,10 @@
"value='" . $vars->{PARM_DATE} . "' />\n";
$result .= "<input type='hidden' name='pres_type' " .
"value='date_start' />\n";
- }
+ } elsif ($vars->{ACTION_TYPE} eq 'tries') {
+ $result .= "<input type='hidden' name='pres_value' " .
+ "value='" . $vars->{TRIES} . "' />\n";
+ }
$result .= $resourceString;
@@ -2747,10 +2803,12 @@
}
# Print value
- $result .= "<li>to <b>" . ctime($vars->{PARM_DATE}) . "</b> (" .
- Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE})
- . ")</li>\n";
-
+ if ($vars->{ACTION_TYPE} ne 'tries') {
+ $result .= "<li>to <b>" . ctime($vars->{PARM_DATE}) . "</b> (" .
+ Apache::lonnavmaps::timeToHumanString($vars->{PARM_DATE})
+ . ")</li>\n";
+ }
+
# print pres_marker
$result .= "\n<input type='hidden' name='pres_marker'" .
" value='$affectedResourceId&$parm_name&$level' />\n";