[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 &quot;Finish Wizard&quot; 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";