Diff for /loncom/interface/lonhelper.pm between versions 1.28 and 1.37

version 1.28, 2003/05/14 18:58:21 version 1.37, 2003/06/12 13:52:06
Line 53  Each state contains one or more state el Line 53  Each state contains one or more state el
 messages, resource selections, or date queries.  messages, resource selections, or date queries.
   
 The helper tag is required to have one attribute, "title", which is the name  The helper tag is required to have one attribute, "title", which is the name
 of the helper itself, such as "Parameter helper".   of the helper itself, such as "Parameter helper". The helper tag may optionally
   have a "requiredpriv" attribute, specifying the priviledge a user must have
   to use the helper, or get denied access. See loncom/auth/rolesplain.tab for
   useful privs. Default is full access, which is often wrong!
   
 =head2 State tags  =head2 State tags
   
Line 257  sub real_handler { Line 260  sub real_handler {
     # xml parsing      # xml parsing
     &Apache::lonxml::xmlparse($r, 'helper', $file);      &Apache::lonxml::xmlparse($r, 'helper', $file);
   
       my $allowed = $helper->allowedCheck();
       if (!$allowed) {
           $ENV{'user.error.msg'} = $ENV{'request.uri'}.':'.$helper->{REQUIRED_PRIV}.
               ":0:0:Permission denied to access this helper.";
           return HTTP_NOT_ACCEPTABLE;
       }
   
     $helper->process();      $helper->process();
   
     $r->print($helper->display());      $r->print($helper->display());
    return OK;      return OK;
 }  }
   
 sub registerHelperTags {  sub registerHelperTags {
Line 284  sub start_helper { Line 294  sub start_helper {
   
     registerHelperTags();      registerHelperTags();
   
     Apache::lonhelper::helper->new($token->[2]{'title'});      Apache::lonhelper::helper->new($token->[2]{'title'}, $token->[2]{'requiredpriv'});
     return '';      return '';
 }  }
   
Line 343  sub new { Line 353  sub new {
     my $self = {};      my $self = {};
   
     $self->{TITLE} = shift;      $self->{TITLE} = shift;
       $self->{REQUIRED_PRIV} = shift;
           
     # If there is a state from the previous form, use that. If there is no      # If there is a state from the previous form, use that. If there is no
     # state, use the start state parameter.      # state, use the start state parameter.
Line 467  sub declareVar { Line 478  sub declareVar {
     }      }
 }  }
   
   sub allowedCheck {
       my $self = shift;
   
       if (!defined($self->{REQUIRED_PRIV})) { 
           return 1;
       }
   
       return Apache::lonnet::allowed($self->{REQUIRED_PRIV}, $ENV{'request.course.id'});
   }
   
 sub changeState {  sub changeState {
     my $self = shift;      my $self = shift;
     $self->{STATE} = shift;      $self->{STATE} = shift;
Line 549  sub display { Line 570  sub display {
 HEADER  HEADER
     if (!$state->overrideForm()) { $result.="<form name='helpform' method='POST'>"; }      if (!$state->overrideForm()) { $result.="<form name='helpform' method='POST'>"; }
     $result .= <<HEADER;      $result .= <<HEADER;
         <table border="0"><tr><td>          <table border="0" width='100%'><tr><td>
         <h2><i>$stateTitle</i></h2>          <h2><i>$stateTitle</i></h2>
 HEADER  HEADER
   
       $result .= "<table cellpadding='10' width='100%'><tr><td rowspan='2' valign='top'>";
   
     if (!$state->overrideForm()) {      if (!$state->overrideForm()) {
         $result .= $self->_saveVars();          $result .= $self->_saveVars();
     }      }
     $result .= $state->render() . "<p>&nbsp;</p>";      $result .= $state->render();
   
       $result .= "</td><td valign='top' align='right'>";
   
       # Warning: Copy and pasted from below, because it's too much trouble to 
       # turn this into a subroutine
       if (!$state->overrideForm()) {
           if ($self->{STATE} ne $self->{START_STATE}) {
               #$result .= '<input name="SUBMIT" type="submit" value="&lt;- Previous" />&nbsp;&nbsp;';
           }
           if ($self->{DONE}) {
               my $returnPage = $self->{RETURN_PAGE};
               $result .= "<a href=\"$returnPage\">End Helper</a>";
           }
           else {
               $result .= '<nobr><input name="back" type="button" ';
               $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';
               $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';
           }
       }
   
       $result .= "</td></tr><tr><td valign='bottom' align='right'>";
   
       # Warning: Copy and pasted from above, because it's too much trouble to 
       # turn this into a subroutine
     if (!$state->overrideForm()) {      if (!$state->overrideForm()) {
         $result .= '<center>';  
         if ($self->{STATE} ne $self->{START_STATE}) {          if ($self->{STATE} ne $self->{START_STATE}) {
             #$result .= '<input name="SUBMIT" type="submit" value="&lt;- Previous" />&nbsp;&nbsp;';              #$result .= '<input name="SUBMIT" type="submit" value="&lt;- Previous" />&nbsp;&nbsp;';
         }          }
Line 568  HEADER Line 613  HEADER
             $result .= "<a href=\"$returnPage\">End Helper</a>";              $result .= "<a href=\"$returnPage\">End Helper</a>";
         }          }
         else {          else {
             $result .= '<input name="back" type="button" ';              $result .= '<nobr><input name="back" type="button" ';
             $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';              $result .= 'value="&lt;- Previous" onclick="history.go(-1)" /> ';
             $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" />';              $result .= '<input name="SUBMIT" type="submit" value="Next -&gt;" /></nobr>';
         }          }
         $result .= "</center>\n";  
     }      }
   
     #foreach my $key (keys %{$self->{VARS}}) {      #foreach my $key (keys %{$self->{VARS}}) {
     #    $result .= "|$key| -> " . $self->{VARS}->{$key} . "<br />";      #    $result .= "|$key| -> " . $self->{VARS}->{$key} . "<br />";
     #}      #}
   
       $result .= "</td></tr></table>";
   
     $result .= <<FOOTER;      $result .= <<FOOTER;
               </td>                </td>
             </tr>              </tr>
Line 684  sub addElement { Line 730  sub addElement {
     push @{$self->{ELEMENTS}}, $element;      push @{$self->{ELEMENTS}}, $element;
 }  }
   
 use Data::Dumper;  
 sub render {  sub render {
     my $self = shift;      my $self = shift;
     my @results = ();      my @results = ();
Line 734  some setting accidentally. Line 779  some setting accidentally.
   
 Again, see the course initialization helper for examples.  Again, see the course initialization helper for examples.
   
   B<getValue method>
   
   If the element stores the name of the variable in a 'variable' member, which
   the provided ones all do, you can retreive the value of the variable by calling
   this method.
   
 =cut  =cut
   
 BEGIN {  BEGIN {
Line 820  sub overrideForm { Line 871  sub overrideForm {
     return 0;      return 0;
 }  }
   
   sub getValue {
       my $self = shift;
       return $helper->{VARS}->{$self->{'variable'}};
   }
   
 1;  1;
   
 package Apache::lonhelper::message;  package Apache::lonhelper::message;
Line 1104  BUTTONS Line 1160  BUTTONS
     if (defined($self->{DEFAULT_VALUE})) {      if (defined($self->{DEFAULT_VALUE})) {
         $checkedChoicesFunc = eval ($self->{DEFAULT_VALUE});          $checkedChoicesFunc = eval ($self->{DEFAULT_VALUE});
         die 'Error in default value code for variable ' .           die 'Error in default value code for variable ' . 
             {'variable'} . ', Perl said:' . $@ if $@;              $self->{'variable'} . ', Perl said: ' . $@ if $@;
     } else {      } else {
         $checkedChoicesFunc = sub { return ''; };          $checkedChoicesFunc = sub { return ''; };
     }      }
Line 1419  variable stores the results. It also tak Line 1475  variable stores the results. It also tak
 which controls whether the user can select more then one resource. The   which controls whether the user can select more then one resource. The 
 "toponly" attribute controls whether the resource display shows just the  "toponly" attribute controls whether the resource display shows just the
 resources in that sequence, or recurses into all sub-sequences, defaulting  resources in that sequence, or recurses into all sub-sequences, defaulting
 to false.  to false. The "suppressEmptySequences" attribute reflects the 
   suppressEmptySequences argument to the render routine, which will cause
   folders that have all of their contained resources filtered out to also
   be filtered out.
   
 B<SUB-TAGS>  B<SUB-TAGS>
   
Line 1480  sub start_resource { Line 1539  sub start_resource {
     $paramHash->{'variable'} = $token->[2]{'variable'};      $paramHash->{'variable'} = $token->[2]{'variable'};
     $helper->declareVar($paramHash->{'variable'});      $helper->declareVar($paramHash->{'variable'});
     $paramHash->{'multichoice'} = $token->[2]{'multichoice'};      $paramHash->{'multichoice'} = $token->[2]{'multichoice'};
       $paramHash->{'suppressEmptySequences'} = $token->[2]{'suppressEmptySequences'};
     $paramHash->{'toponly'} = $token->[2]{'toponly'};      $paramHash->{'toponly'} = $token->[2]{'toponly'};
     return '';      return '';
 }  }
Line 1634  BUTTONS Line 1694  BUTTONS
                 $col .= "checked ";                  $col .= "checked ";
                 $checked = 1;                  $checked = 1;
             }              }
       if ($multichoice) { # all resources start checked; see bug 1174
    $col .= "checked ";
    $checked = 1;
       }
             $col .= "value='" .               $col .= "value='" . 
                 HTML::Entities::encode(&$valueFunc($resource))                   HTML::Entities::encode(&$valueFunc($resource)) 
                 . "' /></td>";                  . "' /></td>";
Line 1648  BUTTONS Line 1712  BUTTONS
                                        'showParts' => 0,                                         'showParts' => 0,
                                        'filterFunc' => $filterFunc,                                         'filterFunc' => $filterFunc,
                                        'resource_no_folder_link' => 1,                                         'resource_no_folder_link' => 1,
                                          'suppressEmptySequences' => $self->{'suppressEmptySequences'},
                                        'iterator_map' => $mapUrl }                                         'iterator_map' => $mapUrl }
                                        );                                         );
   
Line 1861  no strict; Line 1926  no strict;
 @ISA = ("Apache::lonhelper::element");  @ISA = ("Apache::lonhelper::element");
 use strict;  use strict;
   
   use Apache::lonpubdir; # for getTitleString
   
 BEGIN {  BEGIN {
     &Apache::lonhelper::register('Apache::lonhelper::files',      &Apache::lonhelper::register('Apache::lonhelper::files',
                                  ('files', 'filechoice', 'filefilter'));                                   ('files', 'filechoice', 'filefilter'));
Line 2017  BUTTONS Line 2084  BUTTONS
  $color = '';   $color = '';
     }      }
   
               # Get the title
               my $title = Apache::lonpubdir::getTitleString($fileName);
   
             # Netscape 4 is stupid and there's nowhere to put the              # Netscape 4 is stupid and there's nowhere to put the
             # information on the input tag that the file is Published,              # information on the input tag that the file is Published,
             # Unpublished, etc. In *real* browsers we can just say              # Unpublished, etc. In *real* browsers we can just say
Line 2043  BUTTONS Line 2113  BUTTONS
             if (!$self->{'multichoice'} && $choices == 0) {              if (!$self->{'multichoice'} && $choices == 0) {
                 $result .= ' checked';                  $result .= ' checked';
             }              }
             $result .= "/></td><td bgcolor='$color'>" . $file .              $result .= "/></td><td bgcolor='$color'>" . $file . "</td>" .
                  "</td><td bgcolor='$color'>$status</td></tr>\n";                  "<td bgcolor='$color'>$title</td>" .
                   "<td bgcolor='$color'>$status</td>" . "</tr>\n";
             $choices++;              $choices++;
         }          }
     }      }
Line 2183  sub end_section { Line 2254  sub end_section {
 }      }    
 1;  1;
   
   package Apache::lonhelper::string;
   
   =pod
   
   =head2 Element: string
   
   string elements provide a string entry field for the user. string elements
   take the usual 'variable' and 'nextstate' parameters. string elements
   also pass through 'maxlength' and 'size' attributes to the input tag.
   
   string honors the defaultvalue tag, if given.
   
   =cut
   
   no strict;
   @ISA = ("Apache::lonhelper::element");
   use strict;
   
   BEGIN {
       &Apache::lonhelper::register('Apache::lonhelper::string',
                                 ('string'));
   }
   
   sub new {
       my $ref = Apache::lonhelper::element->new();
       bless($ref);
   }
   
   # CONSTRUCTION: Construct the message element from the XML
   sub start_string {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
       if ($target ne 'helper') {
           return '';
       }
   
       $paramHash->{'variable'} = $token->[2]{'variable'};
       $helper->declareVar($paramHash->{'variable'});
       $paramHash->{'nextstate'} = $token->[2]{'nextstate'};
       $paramHash->{'maxlength'} = $token->[2]{'maxlength'};
       $paramHash->{'size'} = $token->[2]{'size'};
   
       return '';
   }
   
   sub end_string {
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
       if ($target ne 'helper') {
           return '';
       }
       Apache::lonhelper::string->new();
       return '';
   }
   
   sub render {
       my $self = shift;
       my $result = '<input type="string" name="' . $self->{'variable'} . '.forminput"';
   
       if (defined($self->{'size'})) {
           $result .= ' size="' . $self->{'size'} . '"';
       }
       if (defined($self->{'maxlength'})) {
           $result .= ' maxlength="' . $self->{'maxlength'} . '"';
       }
   
       if (defined($self->{DEFAULT_VALUE})) {
           my $valueFunc = eval($self->{DEFAULT_VALUE});
           die 'Error in default value code for variable ' . 
               $self->{'variable'} . ', Perl said: ' . $@ if $@;
           $result .= ' value="' . &$valueFunc($helper, $self) . '"';
       }
   
       $result .= ' />';
   
       return $result;
   }
   
   # If a NEXTSTATE was given, switch to it
   sub postprocess {
       my $self = shift;
       if (defined($self->{NEXTSTATE})) {
           $helper->changeState($self->{NEXTSTATE});
       }
   
       return 1;
   }
   
   1;
   
 package Apache::lonhelper::general;  package Apache::lonhelper::general;
   
 =pod  =pod
Line 2327  tag. It goes through all the states and Line 2488  tag. It goes through all the states and
 snippets and collecting the results. Finally, it takes the user out of the  snippets and collecting the results. Finally, it takes the user out of the
 helper, going to a provided page.  helper, going to a provided page.
   
   If the parameter "restartCourse" is true, this will override the buttons and
   will make a "Finish Helper" button that will re-initialize the course for them,
   which is useful for the Course Initialization helper so the users never see
   the old values taking effect.
   
 =cut  =cut
   
 no strict;  no strict;
Line 2343  sub new { Line 2509  sub new {
     bless($ref);      bless($ref);
 }  }
   
 sub start_final { return ''; }  sub start_final { 
       my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
   
       if ($target ne 'helper') {
           return '';
       }
   
       $paramHash->{'restartCourse'} = $token->[2]{'restartCourse'};
   
       return ''; 
   }
   
 sub end_final {  sub end_final {
     my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;      my ($target,$token,$tagstack,$parstack,$parser,$safeeval,$style)=@_;
Line 2384  sub render { Line 2560  sub render {
         for my $element (@{$state->{ELEMENTS}}) {          for my $element (@{$state->{ELEMENTS}}) {
             if (defined($element->{FINAL_CODE})) {              if (defined($element->{FINAL_CODE})) {
                 # Compile the code.                  # Compile the code.
                 my $code = 'sub { my $helper = shift; ' . $element->{FINAL_CODE} .                  my $code = 'sub { my $helper = shift; my $element = shift; ' 
                     '}';                      . $element->{FINAL_CODE} . '}';
                 $code = eval($code);                  $code = eval($code);
                 die 'Error while executing final code for element with var ' .                  die 'Error while executing final code for element with var ' .
                     $element->{'variable'} . ', Perl said: ' . $@ if $@;                      $element->{'variable'} . ', Perl said: ' . $@ if $@;
   
                 my $result = &$code($helper);                  my $result = &$code($helper, $element);
                 if ($result) {                  if ($result) {
                     push @results, $result;                      push @results, $result;
                 }                  }
Line 2406  sub render { Line 2582  sub render {
     for my $re (@results) {      for my $re (@results) {
         $result .= '    <li>' . $re . "</li>\n";          $result .= '    <li>' . $re . "</li>\n";
     }      }
   
       if (!@results) {
           $result .= '    <li>No changes were made to current settings.</li>';
       }
   
       if ($self->{'restartCourse'}) {
           $result .= "<center>\n" .
               "<form action='/adm/roles' method='post' target='loncapaclient'>\n" .
               "<input type='button' onclick='history.go(-1)' value='&lt;- Previous' />" .
               "<input type='hidden' name='orgurl' value='/adm/menu' />" .
               "<input type='hidden' name='selectrole' value='1' />\n" .
               "<input type='hidden' name='" . $ENV{'request.role'} . 
               "' value='1' />\n<input type='submit' value='Finish Course Initialization' />\n" .
               "</form></center>";
       }
   
     return $result . '</ul>';      return $result . '</ul>';
 }  }
   
   sub overrideForm {
       my $self = shift;
       return $self->{'restartCourse'};
   }
   
 1;  1;
   
 package Apache::lonhelper::parmwizfinal;  package Apache::lonhelper::parmwizfinal;
Line 2476  sub render { Line 2673  sub render {
         my $navmap = Apache::lonnavmaps::navmap->new(          my $navmap = Apache::lonnavmaps::navmap->new(
                            $ENV{"request.course.fn"}.".db",                             $ENV{"request.course.fn"}.".db",
                            $ENV{"request.course.fn"}."_parms.db", 0, 0);                             $ENV{"request.course.fn"}."_parms.db", 0, 0);
         my $res = $navmap->getById($vars->{RESOURCE_ID});          my $res = $navmap->getByMapPc($vars->{RESOURCE_ID});
         my $title = $res->compTitle();          my $title = $res->compTitle();
         $symb = $res->symb();          $symb = $res->symb();
         $navmap->untieHashes();          $navmap->untieHashes();

Removed from v.1.28  
changed lines
  Added in v.1.37


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>