version 1.299, 2004/10/04 21:35:52
|
version 1.316, 2005/02/17 08:29:43
|
Line 33 use strict;
|
Line 33 use strict;
|
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonmenu(); |
use Apache::lonmenu(); |
|
use Apache::lonenc(); |
use Apache::lonlocal; |
use Apache::lonlocal; |
|
use Apache::lonnet; |
use POSIX qw (floor strftime); |
use POSIX qw (floor strftime); |
use Data::Dumper; # for debugging, not always used |
use Data::Dumper; # for debugging, not always |
|
use Time::HiRes qw( gettimeofday tv_interval ); |
|
|
# symbolic constants |
# symbolic constants |
sub SYMB { return 1; } |
sub SYMB { return 1; } |
Line 119 window.status='Done.';
|
Line 122 window.status='Done.';
|
ENDCLOSE |
ENDCLOSE |
} |
} |
|
|
sub nav_control_js { |
|
my $nav=($ENV{'environment.remotenavmap'} eq 'on'); |
|
return (<<NAVCONTROL); |
|
var w_loncapanav_flag="$nav"; |
|
|
|
|
|
function gonav(url) { |
|
if (w_loncapanav_flag != 1) { |
|
gopost(url,''); |
|
} else { |
|
navwindow=window.open(url, |
|
"loncapanav","height=600,width=400,scrollbars=1"); |
|
} |
|
} |
|
NAVCONTROL |
|
} |
|
|
|
sub update { |
sub update { |
if ($ENV{'environment.remotenavmap'} ne 'on') { return ''; } |
if ($ENV{'environment.remotenavmap'} ne 'on') { return ''; } |
if (!$ENV{'request.course.id'}) { return ''; } |
if (!$ENV{'request.course.id'}) { return ''; } |
Line 157 sub handler {
|
Line 143 sub handler {
|
|
|
sub real_handler { |
sub real_handler { |
my $r = shift; |
my $r = shift; |
|
#my $t0=[&gettimeofday()]; |
# Handle header-only request |
# Handle header-only request |
if ($r->header_only) { |
if ($r->header_only) { |
if ($ENV{'browser.mathml'}) { |
if ($ENV{'browser.mathml'}) { |
Line 179 sub real_handler {
|
Line 165 sub real_handler {
|
$r->send_http_header; |
$r->send_http_header; |
|
|
my %toplinkitems=(); |
my %toplinkitems=(); |
|
&add_linkitem(\%toplinkitems,'blank','',"Select Action"); |
if ($ENV{QUERY_STRING} eq 'collapseExternal') { |
if ($ENV{QUERY_STRING} eq 'collapseExternal') { |
&Apache::lonnet::put('environment',{'remotenavmap' => 'off'}); |
&Apache::lonnet::put('environment',{'remotenavmap' => 'off'}); |
&Apache::lonnet::appenv('environment.remotenavmap' => 'off'); |
&Apache::lonnet::appenv('environment.remotenavmap' => 'off'); |
Line 199 MENU
|
Line 185 MENU
|
$navstatus |
$navstatus |
MENU |
MENU |
} |
} |
|
my $html=&Apache::lonxml::xmlbegin(); |
$r->print(<<"ENDSUBM"); |
$r->print(<<"ENDSUBM"); |
<html> |
$html |
<head> |
<head> |
<script type="text/javascript"> |
<script type="text/javascript"> |
function submitthis() { |
function submitthis() { |
Line 228 ENDSUBM
|
Line 215 ENDSUBM
|
$ENV{'user.error.msg'} = "$requrl:bre:0:0:Course not initialized"; |
$ENV{'user.error.msg'} = "$requrl:bre:0:0:Course not initialized"; |
return HTTP_NOT_ACCEPTABLE; |
return HTTP_NOT_ACCEPTABLE; |
} |
} |
|
my $html=&Apache::lonxml::xmlbegin(); |
$r->print("<html><head>\n"); |
$r->print("$html<head>\n"); |
$r->print("<title>".&mt('Navigate Course Contents')."</title>"); |
$r->print("<title>".&mt('Navigate Course Contents')."</title>"); |
# ------------------------------------------------------------ Get query string |
# ------------------------------------------------------------ Get query string |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['register','sort','showOnlyHomework']); |
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['register','sort','showOnlyHomework','postsymb']); |
|
|
# ----------------------------------------------------- Force menu registration |
# ----------------------------------------------------- Force menu registration |
my $addentries=''; |
my $addentries=''; |
Line 392 ENDSUBM
|
Line 379 ENDSUBM
|
<option value=\"default\" $selected{'default'}>".&mt('Default')."</option> |
<option value=\"default\" $selected{'default'}>".&mt('Default')."</option> |
<option value=\"title\" $selected{'title'} >".&mt('Title')."</option> |
<option value=\"title\" $selected{'title'} >".&mt('Title')."</option> |
<option value=\"duedate\" $selected{'duedate'}>".&mt('Duedate')."</option> |
<option value=\"duedate\" $selected{'duedate'}>".&mt('Duedate')."</option> |
<option value=\"discussion\" $selected{'discussion'}>".&mt('Has Discussion')."</option> |
<option value=\"discussion\" $selected{'discussion'}>".&mt('Has New Discussion')."</option> |
</select> |
</select> |
</nobr> |
</nobr> |
</form>"); |
</form>"); |
Line 410 ENDSUBM
|
Line 397 ENDSUBM
|
'caller' => 'navmapsdisplay', |
'caller' => 'navmapsdisplay', |
'linkitems' => \%toplinkitems}; |
'linkitems' => \%toplinkitems}; |
my $render = render($renderArgs); |
my $render = render($renderArgs); |
$navmap->untieHashes(); |
|
|
|
# If no resources were printed, print a reassuring message so the |
# If no resources were printed, print a reassuring message so the |
# user knows there was no error. |
# user knows there was no error. |
Line 421 ENDSUBM
|
Line 407 ENDSUBM
|
$r->print("<p><font size='+1'>This course is empty.</font></p>"); |
$r->print("<p><font size='+1'>This course is empty.</font></p>"); |
} |
} |
} |
} |
|
#my $td=&tv_interval($t0); |
|
#$r->print("<br />$td"); |
|
|
$r->print("</body></html>"); |
$r->print("</body></html>"); |
$r->rflush(); |
$r->rflush(); |
Line 451 sub removeFromFilter {
|
Line 439 sub removeFromFilter {
|
|
|
# Convenience function: Given a stack returned from getStack on the iterator, |
# Convenience function: Given a stack returned from getStack on the iterator, |
# return the correct src() value. |
# return the correct src() value. |
# Later, this should add an anchor when we start putting anchors in pages. |
|
sub getLinkForResource { |
sub getLinkForResource { |
my $stack = shift; |
my $stack = shift; |
my $res; |
my $res; |
Line 459 sub getLinkForResource {
|
Line 446 sub getLinkForResource {
|
# Check to see if there are any pages in the stack |
# Check to see if there are any pages in the stack |
foreach $res (@$stack) { |
foreach $res (@$stack) { |
if (defined($res)) { |
if (defined($res)) { |
|
my $anchor; |
if ($res->is_page()) { |
if ($res->is_page()) { |
return $res->src(); |
foreach (@$stack) { if (defined($_)) { $anchor = $_; } } |
|
$anchor=&Apache::lonnet::escape($anchor->shown_symb()); |
|
return ($res->link(),$res->shown_symb(),$anchor); |
} |
} |
# in case folder was skipped over as "only sequence" |
# in case folder was skipped over as "only sequence" |
my ($map,$id,$src)=&Apache::lonnet::decode_symb($res->symb()); |
my ($map,$id,$src)=&Apache::lonnet::decode_symb($res->symb()); |
if ($map=~/\.page$/) { |
if ($map=~/\.page$/) { |
return &Apache::lonnet::clutter($map).'#'. |
my $url=&Apache::lonnet::clutter($map); |
&Apache::lonnet::escape(&Apache::lonnet::declutter($src)); |
$anchor=&Apache::lonnet::escape($src->shown_symb()); |
|
return ($url,$res->shown_symb(),$anchor); |
} |
} |
} |
} |
} |
} |
Line 479 sub getLinkForResource {
|
Line 470 sub getLinkForResource {
|
if (defined($_)) { $res = $_; } |
if (defined($_)) { $res = $_; } |
} |
} |
|
|
return $res->src(); |
return ($res->link(),$res->shown_symb()); |
} |
} |
|
|
# Convenience function: This separates the logic of how to create |
# Convenience function: This separates the logic of how to create |
Line 1027 sub render_resource {
|
Line 1018 sub render_resource {
|
my $nonLinkedText = ''; # stuff after resource title not in link |
my $nonLinkedText = ''; # stuff after resource title not in link |
|
|
my $link = $params->{"resourceLink"}; |
my $link = $params->{"resourceLink"}; |
|
|
|
# The URL part is not escaped at this point, but the symb is... |
|
# The stuff to the left of the ? must have ' replaced by \' since |
|
# it will be quoted with ' in the href. |
|
|
|
my ($left,$right) = split(/\?/, $link); |
|
$left =~ s/'/\\'/g; |
|
$link = $left.'?'.$right; |
|
|
my $src = $resource->src(); |
my $src = $resource->src(); |
my $it = $params->{"iterator"}; |
my $it = $params->{"iterator"}; |
my $filter = $it->{FILTER}; |
my $filter = $it->{FILTER}; |
Line 1042 sub render_resource {
|
Line 1042 sub render_resource {
|
} |
} |
|
|
# links to open and close the folder |
# links to open and close the folder |
|
|
|
|
my $linkopen = "<a href='$link'>"; |
my $linkopen = "<a href='$link'>"; |
|
|
|
|
my $linkclose = "</a>"; |
my $linkclose = "</a>"; |
|
|
# Default icon: unknown page |
# Default icon: unknown page |
Line 1083 sub render_resource {
|
Line 1087 sub render_resource {
|
'&jump=' . |
'&jump=' . |
&Apache::lonnet::escape($resource->symb()) . |
&Apache::lonnet::escape($resource->symb()) . |
"&folderManip=1'>"; |
"&folderManip=1'>"; |
|
|
} else { |
} else { |
# Don't allow users to manipulate folder |
# Don't allow users to manipulate folder |
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . |
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . |
Line 1110 sub render_resource {
|
Line 1115 sub render_resource {
|
} |
} |
|
|
# Decide what to display |
# Decide what to display |
|
|
$result .= "$newBranchText$linkopen$icon$linkclose"; |
$result .= "$newBranchText$linkopen$icon$linkclose"; |
|
|
my $curMarkerBegin = ''; |
my $curMarkerBegin = ''; |
Line 1127 sub render_resource {
|
Line 1133 sub render_resource {
|
!$params->{'condensed'}) { |
!$params->{'condensed'}) { |
my $displaypart=$resource->part_display($part); |
my $displaypart=$resource->part_display($part); |
$partLabel = " (Part: $displaypart)"; |
$partLabel = " (Part: $displaypart)"; |
$link.='#'.&Apache::lonnet::escape($part); |
if ($link!~/\#/) { $link.='#'.&Apache::lonnet::escape($part); } |
$title = ""; |
$title = ""; |
} |
} |
|
|
Line 1418 sub render {
|
Line 1424 sub render {
|
# Determine where the "here" marker is and where the screen jumps to. |
# Determine where the "here" marker is and where the screen jumps to. |
|
|
if ($ENV{'form.postsymb'}) { |
if ($ENV{'form.postsymb'}) { |
$here = $jump = $ENV{'form.postsymb'}; |
$here = $jump = &Apache::lonnet::symbclean($ENV{'form.postsymb'}); |
} elsif ($ENV{'form.postdata'}) { |
} elsif ($ENV{'form.postdata'}) { |
# couldn't find a symb, is there a URL? |
# couldn't find a symb, is there a URL? |
my $currenturl = $ENV{'form.postdata'}; |
my $currenturl = $ENV{'form.postdata'}; |
Line 1847 END
|
Line 1853 END
|
# Add part 0 so we display it correctly. |
# Add part 0 so we display it correctly. |
unshift @parts, '0'; |
unshift @parts, '0'; |
} |
} |
|
|
|
{ |
|
my ($src,$symb,$anchor,$stack); |
|
if ($args->{'sort'}) { |
|
my $it = $navmap->getIterator(undef, undef, undef, 1); |
|
while ( my $res=$it->next()) { |
|
if (ref($res) && |
|
$res->symb() eq $curRes->symb()) { last; } |
|
} |
|
$stack=$it->getStack(); |
|
} else { |
|
$stack=$it->getStack(); |
|
} |
|
($src,$symb,$anchor)=getLinkForResource($stack); |
|
if (defined($anchor)) { $anchor='#'.$anchor; } |
|
my $srcHasQuestion = $src =~ /\?/; |
|
$args->{"resourceLink"} = $src. |
|
($srcHasQuestion?'&':'?') . |
|
'symb=' . &Apache::lonnet::escape($symb).$anchor; |
|
} |
# Now, we've decided what parts to show. Loop through them and |
# Now, we've decided what parts to show. Loop through them and |
# show them. |
# show them. |
foreach my $part (@parts) { |
foreach my $part (@parts) { |
Line 1858 END
|
Line 1883 END
|
|
|
# Set up some data about the parts that the cols might want |
# Set up some data about the parts that the cols might want |
my $filter = $it->{FILTER}; |
my $filter = $it->{FILTER}; |
my $src; |
|
if ($args->{'sort'}) { |
|
$src = $curRes->src(); # FIXME this is wrong for .pages |
|
} else { |
|
my $stack = $it->getStack(); |
|
$src=getLinkForResource($stack); |
|
} |
|
my $anchor=''; |
|
if ($src=~s/(\#.*)$//) { |
|
$anchor=$1; |
|
} |
|
my $srcHasQuestion = $src =~ /\?/; |
|
$args->{"resourceLink"} = $src. |
|
($srcHasQuestion?'&':'?') . |
|
'symb=' . &Apache::lonnet::escape($curRes->symb()). |
|
$anchor; |
|
|
|
# Now, display each column. |
# Now, display each column. |
foreach my $col (@$cols) { |
foreach my $col (@$cols) { |
Line 1940 if (location.href.indexOf('#curloc')==-1
|
Line 1949 if (location.href.indexOf('#curloc')==-1
|
$r->rflush(); |
$r->rflush(); |
} |
} |
|
|
if ($mustCloseNavMap) { $navmap->untieHashes(); } |
|
|
|
return $result; |
return $result; |
} |
} |
|
|
Line 1953 sub add_linkitem {
|
Line 1960 sub add_linkitem {
|
|
|
sub show_linkitems { |
sub show_linkitems { |
my ($linkitems)=@_; |
my ($linkitems)=@_; |
my @linkorder = ("launchnav","closenav","firsthomework","everything", |
my @linkorder = ("blank","launchnav","closenav","firsthomework", |
"uncompleted","changefolder","clearbubbles"); |
"everything","uncompleted","changefolder","clearbubbles"); |
|
|
my $result .= (<<ENDBLOCK); |
my $result .= (<<ENDBLOCK); |
<td align="left"> |
<td align="left"> |
Line 2042 successful, or B<undef> if not.
|
Line 2049 successful, or B<undef> if not.
|
|
|
=back |
=back |
|
|
When you are done with the $navmap object, you I<must> call |
|
$navmap->untieHashes(), or you'll prevent the current user from using that |
|
course until the web server is restarted. (!) |
|
|
|
=head2 Methods |
=head2 Methods |
|
|
=over 4 |
=over 4 |
Line 2258 sub courseMapDefined {
|
Line 2261 sub courseMapDefined {
|
sub getIterator { |
sub getIterator { |
my $self = shift; |
my $self = shift; |
my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift, |
my $iterator = Apache::lonnavmaps::iterator->new($self, shift, shift, |
shift, undef, shift); |
shift, undef, shift, |
|
shift, shift); |
return $iterator; |
return $iterator; |
} |
} |
|
|
# unties the hash when done |
|
sub untieHashes { |
|
my $self = shift; |
|
untie %{$self->{NAV_HASH}}; |
|
untie %{$self->{PARM_HASH}}; |
|
} |
|
|
|
# Private method: Does the given resource (as a symb string) have |
# Private method: Does the given resource (as a symb string) have |
# current discussion? Returns 0 if chat/mail data not extracted. |
# current discussion? Returns 0 if chat/mail data not extracted. |
sub hasDiscussion { |
sub hasDiscussion { |
Line 2485 sub parmval_real {
|
Line 2482 sub parmval_real {
|
|
|
if (defined($courseopt)) { |
if (defined($courseopt)) { |
if (defined($$courseopt{$courselevelr})) { return $$courseopt{$courselevelr}; } |
if (defined($$courseopt{$courselevelr})) { return $$courseopt{$courselevelr}; } |
if (defined($$courseopt{$courselevelm})) { return $$courseopt{$courselevelm}; } |
|
if (defined($$courseopt{$courselevel})) { return $$courseopt{$courselevel}; } |
|
} |
} |
|
|
# ----------------------------------------------------- third, check map parms |
# ----------------------------------------------------- third, check map parms |
Line 2503 sub parmval_real {
|
Line 2498 sub parmval_real {
|
$default=&Apache::lonnet::metadata($fn,'parameter_'.$meta_rwhat); |
$default=&Apache::lonnet::metadata($fn,'parameter_'.$meta_rwhat); |
if (defined($default)) { return $default} |
if (defined($default)) { return $default} |
|
|
# --------------------------------------------------- fifth , cascade up parts |
# --------------------------------------------------- fifth, check more course |
|
if (defined($courseopt)) { |
|
if (defined($$courseopt{$courselevelm})) { return $$courseopt{$courselevelm}; } |
|
if (defined($$courseopt{$courselevel})) { return $$courseopt{$courselevel}; } |
|
} |
|
|
|
# --------------------------------------------------- sixth , cascade up parts |
|
|
my ($space,@qualifier)=split(/\./,$rwhat); |
my ($space,@qualifier)=split(/\./,$rwhat); |
my $qualifier=join('.',@qualifier); |
my $qualifier=join('.',@qualifier); |
Line 2532 you're not sure if $res is already an ob
|
Line 2533 you're not sure if $res is already an ob
|
resource appears multiple times in the course, only the first instance |
resource appears multiple times in the course, only the first instance |
will be returned. As a result, this is probably useful only for maps. |
will be returned. As a result, this is probably useful only for maps. |
|
|
=item * B<retrieveResources>(map, filterFunc, recursive, bailout): |
=item * B<retrieveResources>(map, filterFunc, recursive, bailout, showall): |
|
|
The map is a specification of a map to retreive the resources from, |
The map is a specification of a map to retreive the resources from, |
either as a url or as an object. The filterFunc is a reference to a |
either as a url or as an object. The filterFunc is a reference to a |
Line 2540 function that takes a resource object as
|
Line 2541 function that takes a resource object as
|
true if the resource should be included, or false if it should not |
true if the resource should be included, or false if it should not |
be. If recursive is true, the map will be recursively examined, |
be. If recursive is true, the map will be recursively examined, |
otherwise it will not be. If bailout is true, the function will return |
otherwise it will not be. If bailout is true, the function will return |
as soon as it finds a resource, if false it will finish. By default, |
as soon as it finds a resource, if false it will finish. If showall is |
the map is the top-level map of the course, filterFunc is a function |
true it will not hide maps that contain nothing but one other map. By |
that always returns 1, recursive is true, bailout is false. The |
default, the map is the top-level map of the course, filterFunc is a |
resources will be returned in a list containing the resource objects |
function that always returns 1, recursive is true, bailout is false, |
for the corresponding resources, with B<no structure information> in |
showall is false. The resources will be returned in a list containing |
the list; regardless of branching, recursion, etc., it will be a flat |
the resource objects for the corresponding resources, with B<no |
list. |
structure information> in the list; regardless of branching, |
|
recursion, etc., it will be a flat list. |
|
|
Thus, this is suitable for cases where you don't want the structure, |
Thus, this is suitable for cases where you don't want the structure, |
just a list of all resources. It is also suitable for finding out how |
just a list of all resources. It is also suitable for finding out how |
Line 2593 sub retrieveResources {
|
Line 2595 sub retrieveResources {
|
if (!defined($recursive)) { $recursive = 1; } |
if (!defined($recursive)) { $recursive = 1; } |
my $bailout = shift; |
my $bailout = shift; |
if (!defined($bailout)) { $bailout = 0; } |
if (!defined($bailout)) { $bailout = 0; } |
|
my $showall = shift; |
# Create the necessary iterator. |
# Create the necessary iterator. |
if (!ref($map)) { # assume it's a url of a map. |
if (!ref($map)) { # assume it's a url of a map. |
$map = $self->getResourceByUrl($map); |
$map = $self->getResourceByUrl($map); |
Line 2612 sub retrieveResources {
|
Line 2614 sub retrieveResources {
|
|
|
# Get an iterator. |
# Get an iterator. |
my $it = $self->getIterator($map->map_start(), $map->map_finish(), |
my $it = $self->getIterator($map->map_start(), $map->map_finish(), |
undef, $recursive); |
undef, $recursive, $showall); |
|
|
my @resources = (); |
my @resources = (); |
|
|
Line 2649 sub hasResource {
|
Line 2651 sub hasResource {
|
1; |
1; |
|
|
package Apache::lonnavmaps::iterator; |
package Apache::lonnavmaps::iterator; |
|
use WeakRef; |
=pod |
=pod |
|
|
=back |
=back |
Line 2789 sub new {
|
Line 2791 sub new {
|
my $class = ref($proto) || $proto; |
my $class = ref($proto) || $proto; |
my $self = {}; |
my $self = {}; |
|
|
$self->{NAV_MAP} = shift; |
weaken($self->{NAV_MAP} = shift); |
return undef unless ($self->{NAV_MAP}); |
return undef unless ($self->{NAV_MAP}); |
|
|
# Handle the parameters |
# Handle the parameters |
Line 2909 sub new {
|
Line 2911 sub new {
|
Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, |
$self->{ALREADY_SEEN}, |
$self->{CONDITION}, 0); |
$self->{CONDITION}, |
|
$self->{FORCE_TOP}); |
|
|
} |
} |
|
|
Line 3072 sub next {
|
Line 3075 sub next {
|
$self->{RECURSIVE_ITERATOR} = |
$self->{RECURSIVE_ITERATOR} = |
Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
Apache::lonnavmaps::iterator->new($self->{NAV_MAP}, $firstResource, |
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, $self->{CONDITION}); |
$self->{ALREADY_SEEN}, |
|
$self->{CONDITION}, |
|
$self->{FORCE_TOP}); |
} |
} |
|
|
# If this is a blank resource, don't actually return it. |
# If this is a blank resource, don't actually return it. |
Line 3125 sub populateStack {
|
Line 3130 sub populateStack {
|
1; |
1; |
|
|
package Apache::lonnavmaps::DFSiterator; |
package Apache::lonnavmaps::DFSiterator; |
|
use WeakRef; |
# Not documented in the perldoc: This is a simple iterator that just walks |
# Not documented in the perldoc: This is a simple iterator that just walks |
# through the nav map and presents the resources in a depth-first search |
# through the nav map and presents the resources in a depth-first search |
# fashion, ignorant of conditionals, randomized resources, etc. It presents |
# fashion, ignorant of conditionals, randomized resources, etc. It presents |
Line 3153 sub new {
|
Line 3158 sub new {
|
my $class = ref($proto) || $proto; |
my $class = ref($proto) || $proto; |
my $self = {}; |
my $self = {}; |
|
|
$self->{NAV_MAP} = shift; |
weaken($self->{NAV_MAP} = shift); |
return undef unless ($self->{NAV_MAP}); |
return undef unless ($self->{NAV_MAP}); |
|
|
$self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource(); |
$self->{FIRST_RESOURCE} = shift || $self->{NAV_MAP}->firstResource(); |
Line 3307 sub populateStack {
|
Line 3312 sub populateStack {
|
1; |
1; |
|
|
package Apache::lonnavmaps::resource; |
package Apache::lonnavmaps::resource; |
|
use WeakRef; |
use Apache::lonnet; |
use Apache::lonnet; |
|
|
=pod |
=pod |
Line 3389 sub new {
|
Line 3394 sub new {
|
my $class = ref($proto) || $proto; |
my $class = ref($proto) || $proto; |
my $self = {}; |
my $self = {}; |
|
|
$self->{NAV_MAP} = shift; |
weaken($self->{NAV_MAP} = shift); |
$self->{ID} = shift; |
$self->{ID} = shift; |
|
|
# Store this new resource in the parent nav map's cache. |
# Store this new resource in the parent nav map's cache. |
Line 3477 Returns the title of the resource.
|
Line 3482 Returns the title of the resource.
|
# These info functions can be used directly, as they don't return |
# These info functions can be used directly, as they don't return |
# resource information. |
# resource information. |
sub comesfrom { my $self=shift; return $self->navHash("comesfrom_", 1); } |
sub comesfrom { my $self=shift; return $self->navHash("comesfrom_", 1); } |
|
sub encrypted { my $self=shift; return $self->navHash("encrypted_", 1); } |
sub ext { my $self=shift; return $self->navHash("ext_", 1) eq 'true:'; } |
sub ext { my $self=shift; return $self->navHash("ext_", 1) eq 'true:'; } |
sub from { my $self=shift; return $self->navHash("from_", 1); } |
sub from { my $self=shift; return $self->navHash("from_", 1); } |
# considered private and undocumented |
# considered private and undocumented |
Line 3488 sub randompick {
|
Line 3494 sub randompick {
|
return $self->{NAV_MAP}->{PARM_HASH}->{$self->symb . |
return $self->{NAV_MAP}->{PARM_HASH}->{$self->symb . |
'.0.parameter_randompick'}; |
'.0.parameter_randompick'}; |
} |
} |
|
sub link { |
|
my $self=shift; |
|
if ($self->encrypted()) { return &Apache::lonenc::encrypted($self->src); } |
|
return $self->src; |
|
} |
sub src { |
sub src { |
my $self=shift; |
my $self=shift; |
return $self->navHash("src_", 1); |
return $self->navHash("src_", 1); |
} |
} |
|
sub shown_symb { |
|
my $self=shift; |
|
if ($self->encrypted()) {return &Apache::lonenc::encrypted($self->symb());} |
|
return $self->symb(); |
|
} |
sub symb { |
sub symb { |
my $self=shift; |
my $self=shift; |
(my $first, my $second) = $self->{ID} =~ /(\d+).(\d+)/; |
(my $first, my $second) = $self->{ID} =~ /(\d+).(\d+)/; |
Line 3510 sub title {
|
Line 3526 sub title {
|
return $self->navHash("title_", 1); } |
return $self->navHash("title_", 1); } |
# considered private and undocumented |
# considered private and undocumented |
sub to { my $self=shift; return $self->navHash("to_", 1); } |
sub to { my $self=shift; return $self->navHash("to_", 1); } |
|
sub condition { |
|
my $self=shift; |
|
my $undercond=$self->navHash("undercond_", 1); |
|
if (!defined($undercond)) { return 1; }; |
|
my $condid=$self->navHash("condid_$undercond"); |
|
if (!defined($condid)) { return 1; }; |
|
my $condition=&Apache::lonnet::directcondval($condid); |
|
return $condition; |
|
} |
|
|
sub compTitle { |
sub compTitle { |
my $self = shift; |
my $self = shift; |
my $title = $self->title(); |
my $title = $self->title(); |
Line 4683 sub getNext {
|
Line 4709 sub getNext {
|
my $to = $self->to(); |
my $to = $self->to(); |
foreach my $branch ( split(/,/, $to) ) { |
foreach my $branch ( split(/,/, $to) ) { |
my $choice = $self->{NAV_MAP}->getById($branch); |
my $choice = $self->{NAV_MAP}->getById($branch); |
|
if (!$choice->condition()) { next; } |
my $next = $choice->goesto(); |
my $next = $choice->goesto(); |
$next = $self->{NAV_MAP}->getById($next); |
$next = $self->{NAV_MAP}->getById($next); |
|
|
Line 4711 sub browsePriv {
|
Line 4738 sub browsePriv {
|
return $self->{BROWSE_PRIV}; |
return $self->{BROWSE_PRIV}; |
} |
} |
|
|
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre', $self->src()); |
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), |
|
$self->symb()); |
} |
} |
|
|
=pod |
=pod |