--- loncom/interface/loncommon.pm 2002/04/22 18:04:19 1.33 +++ loncom/interface/loncommon.pm 2002/05/09 15:56:02 1.37 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.33 2002/04/22 18:04:19 matthew Exp $ +# $Id: loncommon.pm,v 1.37 2002/05/09 15:56:02 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -38,6 +38,40 @@ # Inputs result_from_symbread, user, domain, course_id # Reads in non-network-related .tab files +# POD header: + +=head1 NAME + +Apache::loncommon - pile of common routines + +=head1 SYNOPSIS + +Referenced by other mod_perl Apache modules. + +Invocation: + &Apache::loncommon::SUBROUTINENAME(ARGUMENTS); + +=head1 INTRODUCTION + +Common collection of used subroutines. This collection helps remove +redundancy from other modules and increase efficiency of memory usage. + +Current things done: + + Makes a table out of the previous homework attempts + Inputs result_from_symbread, user, domain, course_id + Reads in non-network-related .tab files + +This is part of the LearningOnline Network with CAPA project +described at http://www.lon-capa.org. + +=head2 Subroutines + +=over 4 + +=cut + +# End of POD header package Apache::loncommon; use strict; @@ -65,6 +99,14 @@ my $thethreshold=0.1/$thefuzzy; my $theavecount; # ----------------------------------------------------------------------- BEGIN +=item BEGIN() + +Initialize values from language.tab, copyright.tab, filetypes.tab, +and filecategories.tab. + +=cut +# ----------------------------------------------------------------------- BEGIN + BEGIN { unless ($readit) { @@ -146,9 +188,229 @@ BEGIN { } # ============================================================= END BEGIN BLOCK + +=item linked_select_forms(...) + +linked_select_forms returns a string containing a <script></script> block +and html for two <select> menus. The select menus will be linked in that +changing the value of the first menu will result in new values being placed +in the second menu. The values in the select menu will appear in alphabetical +order. + +linked_select_forms takes the following ordered inputs: + +=over 4 + +=item $formname, the name of the <form> tag + +=item $middletext, the text which appears between the <select> tags + +=item $firstdefault, the default value for the first menu + +=item $firstselectname, the name of the first <select> tag + +=item $secondselectname, the name of the second <select> tag + +=item $hashref, a reference to a hash containing the data for the menus. + +Below is an example of such a hash. Only the 'text', 'default', and +'select2' keys must appear as stated. keys(%menu) are the possible +values for the first select menu. The text that coincides with the +first menu values is given in $menu{$choice1}->{'text'}. The values +and text for the second menu are given in the hash pointed to by +$menu{$choice1}->{'select2'}. + + my %menu = ( A1 => { text =>"Choice A1" , + default => "B3", + select2 => { + B1 => "Choice B1", + B2 => "Choice B2", + B3 => "Choice B3", + B4 => "Choice B4" + } + }, + A2 => { text =>"Choice A2" , + default => "C2", + select2 => { + C1 => "Choice C1", + C2 => "Choice C2", + C3 => "Choice C3" + } + }, + A3 => { text =>"Choice A3" , + default => "D6", + select2 => { + D1 => "Choice D1", + D2 => "Choice D2", + D3 => "Choice D3", + D4 => "Choice D4", + D5 => "Choice D5", + D6 => "Choice D6", + D7 => "Choice D7" + } + } + ); + +=back + +=cut + +# ------------------------------------------------ + +sub linked_select_forms { + my ($formname, + $middletext, + $firstdefault, + $firstselectname, + $secondselectname, + $hashref + ) = @_; + my $second = "document.$formname.$secondselectname"; + my $first = "document.$formname.$firstselectname"; + # output the javascript to do the changing + my $result = ''; + $result.="<script>\n"; + $result.="var select2data = new Object();\n"; + $" = '","'; + my $debug = ''; + foreach my $s1 (sort(keys(%$hashref))) { + $result.="select2data.d_$s1 = new Object();\n"; + $result.="select2data.d_$s1.def = new String('". + $hashref->{$s1}->{'default'}."');\n"; + $result.="select2data.d_$s1.values = new Array("; + my @s2values = sort(keys( %{ $hashref->{$s1}->{'select2'} } )); + $result.="\"@s2values\");\n"; + $result.="select2data.d_$s1.texts = new Array("; + my @s2texts; + foreach my $value (@s2values) { + push @s2texts, $hashref->{$s1}->{'select2'}->{$value}; + } + $result.="\"@s2texts\");\n"; + } + $"=' '; + $result.= <<"END"; + +function select1_changed() { + // Determine new choice + var newvalue = "d_" + $first.value; + // update select2 + var values = select2data[newvalue].values; + var texts = select2data[newvalue].texts; + var select2def = select2data[newvalue].def; + var i; + // out with the old + for (i = 0; i < $second.options.length; i++) { + $second.options[i] = null; + } + // in with the nuclear + for (i=0;i<values.length; i++) { + $second.options[i] = new Option(values[i]); + $second.options[i].text = texts[i]; + if (values[i] == select2def) { + $second.options[i].selected = true; + } + } +} +</script> +END + # output the initial values for the selection lists + $result .= "<select size=\"1\" name=\"$firstselectname\" onchange=\"select1_changed()\">\n"; + foreach my $value (sort(keys(%$hashref))) { + $result.=" <option value=\"$value\" "; + $result.=" selected=\"true\" " if ($value eq $firstdefault); + $result.=">$hashref->{$value}->{'text'}</option>\n"; + } + $result .= "</select>\n"; + my %select2 = %{$hashref->{$firstdefault}->{'select2'}}; + $result .= $middletext; + $result .= "<select size=\"1\" name=\"$secondselectname\">\n"; + my $seconddefault = $hashref->{$firstdefault}->{'default'}; + foreach my $value (sort(keys(%select2))) { + $result.=" <option value=\"$value\" "; + $result.=" selected=\"true\" " if ($value eq $seconddefault); + $result.=">$select2{$value}</option>\n"; + } + $result .= "</select>\n"; + # return $debug; + return $result; +} # end of sub linked_select_forms { + +############################################################### + +=item csv_translate($text) + +Translate $text to allow it to be output as a 'comma seperated values' +format. + +=cut + +sub csv_translate { + my $text = shift; + $text =~ s/\"/\"\"/g; + $text =~ s/\n//g; + return $text; +} + +############################################################### + ############################################################### ## Home server <option> list generating code ## ############################################################### +#------------------------------------------- + +=item get_domains() + +Returns an array containing each of the domains listed in the hosts.tab +file. + +=cut + +#------------------------------------------- +sub get_domains { + # The code below was stolen from "The Perl Cookbook", p 102, 1st ed. + my @domains; + my %seen; + foreach (sort values(%Apache::lonnet::hostdom)) { + push (@domains,$_) unless $seen{$_}++; + } + return @domains; +} + +#------------------------------------------- + +=item select_dom_form($defdom,$name) + +Returns a string containing a <select name='$name' size='1'> form to +allow a user to select the domain to preform an operation in. +See loncreateuser.pm for an example invocation and use. + +=cut + +#------------------------------------------- +sub select_dom_form { + my ($defdom,$name) = @_; + my @domains = get_domains(); + my $selectdomain = "<select name=\"$name\" size=\"1\">\n"; + foreach (@domains) { + $selectdomain.="<option value=\"$_\" ". + ($_ eq $defdom ? 'selected' : ''). + ">$_</option>\n"; + } + $selectdomain.="</select>"; + return $selectdomain; +} + +#------------------------------------------- + +=item get_home_servers($domain) + +Returns a hash which contains keys like '103l3' and values like +'kirk.lite.msu.edu'. All of the keys will be for machines in the +given $domain. + +=cut + +#------------------------------------------- sub get_home_servers { my $domain = shift; my %home_servers; @@ -160,6 +422,16 @@ sub get_home_servers { return %home_servers; } +#------------------------------------------- + +=item home_server_option_list($domain) + +returns a string which contains an <option> list to be used in a +<select> form input. See loncreateuser.pm for an example. + +=cut + +#------------------------------------------- sub home_server_option_list { my $domain = shift; my %servers = &get_home_servers($domain); @@ -182,6 +454,35 @@ sub home_server_option_list { ## hash, and have reasonable default values. ## ## formname = the name given in the <form> tag. +#------------------------------------------- + +=item authform_xxxxxx + +The authform_xxxxxx subroutines provide javascript and html forms which +handle some of the conveniences required for authentication forms. +This is not an optimal method, but it works. + +See loncreateuser.pm for invocation and use examples. + +=over 4 + +=item authform_header + +=item authform_authorwarning + +=item authform_nochange + +=item authform_kerberos + +=item authform_internal + +=item authform_filesystem + +=back + +=cut + +#------------------------------------------- sub authform_header{ my %in = ( formname => 'cu', @@ -574,6 +875,23 @@ sub get_student_answers { return $userview; } +############################################### + +=item get_unprocessed_cgi($query,$possible_names) + +Modify the %ENV hash to contain unprocessed CGI form parameters held in +$query. The parameters listed in $possible_names (an array reference), +will be set in $ENV{'form.name'} if they do not already exist. + +Typically called with $ENV{'QUERY_STRING'} as the first parameter. +$possible_names is an ref to an array of form element names. As an example: +get_unprocessed_cgi($ENV{'QUERY_STRING'},['uname','udom']); +will result in $ENV{'form.uname'} and $ENV{'form.udom'} being set. + +=cut + +############################################### + sub get_unprocessed_cgi { my ($query,$possible_names)= @_; # $Apache::lonxml::debug=1; @@ -823,110 +1141,71 @@ sub csv_samples_select_table { 1; __END__; +=item languageids() -=head1 NAME - -Apache::loncommon - pile of common routines - -=head1 SYNOPSIS - -Referenced by other mod_perl Apache modules. - -Invocation: - &Apache::loncommon::SUBROUTINENAME(ARGUMENTS); - -=head1 INTRODUCTION - -Common collection of used subroutines. This collection helps remove -redundancy from other modules and increase efficiency of memory usage. - -Current things done: - - Makes a table out of the previous homework attempts - Inputs result_from_symbread, user, domain, course_id - Reads in non-network-related .tab files - -This is part of the LearningOnline Network with CAPA project -described at http://www.lon-capa.org. - -=head1 HANDLER SUBROUTINE - -There is no handler subroutine. - -=head1 OTHER SUBROUTINES - -=over 4 - -=item * - -BEGIN() : initialize values from language.tab, copyright.tab, filetypes.tab, -and filecategories.tab. - -=item * - -languageids() : returns list of all language ids +returns list of all language ids -=item * +=item languagedescription() -languagedescription() : returns description of a specified language id +returns description of a specified language id -=item * +=item copyrightids() -copyrightids() : returns list of all copyrights +returns list of all copyrights -=item * +=item copyrightdescription() -copyrightdescription() : returns description of a specified copyright id +returns description of a specified copyright id -=item * +=item filecategories() -filecategories() : returns list of all file categories +returns list of all file categories -=item * +=item filecategorytypes() -filecategorytypes() : returns list of file types belonging to a given file +returns list of file types belonging to a given file category -=item * +=item fileembstyle() -fileembstyle() : returns embedding style for a specified file type +returns embedding style for a specified file type -=item * +=item filedescription() -filedescription() : returns description for a specified file type +returns description for a specified file type -=item * +=item filedescriptionex() -filedescriptionex() : returns description for a specified file type with +returns description for a specified file type with extra formatting -=item * +=item get_previous_attempt() -get_previous_attempt() : return string with previous attempt on problem +return string with previous attempt on problem -=item * +=item get_student_view() -get_student_view() : show a snapshot of what student was looking at +show a snapshot of what student was looking at -=item * +=item get_student_answers() -get_student_answers() : show a snapshot of how student was answering problem +show a snapshot of how student was answering problem -=item * +=item get_unprocessed_cgi() -get_unprocessed_cgi() : get unparsed CGI parameters +get unparsed CGI parameters -=item * +=item cacheheader() -cacheheader() : returns cache-controlling header code +returns cache-controlling header code -=item * +=item nocache() -nocache() : specifies header code to not have cache +specifies header code to not have cache -=item * +=item add_to_env($name,$value) -add_to_env($name,$value) : adds $name to the %ENV hash with value +adds $name to the %ENV hash with value $value, if $name already exists, the entry is converted to an array reference and $value is added to the array.