version 1.543, 2018/11/13 03:59:00
|
version 1.553, 2021/07/19 15:48:26
|
Line 592 sub getLinkForResource {
|
Line 592 sub getLinkForResource {
|
my $anchor; |
my $anchor; |
if ($res->is_page()) { |
if ($res->is_page()) { |
foreach my $item (@$stack) { if (defined($item)) { $anchor = $item; } } |
foreach my $item (@$stack) { if (defined($item)) { $anchor = $item; } } |
$anchor=&escape($anchor->shown_symb()); |
if ($anchor->encrypted() && !&advancedUser()) { |
|
$anchor='LC_'.$anchor->id(); |
|
} else { |
|
$anchor=&escape($anchor->shown_symb()); |
|
} |
return ($res->link(),$res->shown_symb(),$anchor); |
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" |
Line 1064 sub render_resource {
|
Line 1068 sub render_resource {
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
} elsif ($params->{'mapUnlisted'}) { |
} elsif ($params->{'mapUnlisted'}) { |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
|
} elsif ($params->{'mapHiddenDeepLink'} || $resource->deeplinkout()) { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('not shown').')</span> '; |
} |
} |
} else { |
} else { |
if ($resource->randomout()) { |
if ($resource->randomout()) { |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('hidden').')</span> '; |
} elsif (($resource->deeplink($params->{caller}) eq 'absent') || |
} elsif ($resource->deeplinkout()) { |
($resource->deeplink($params->{caller}) eq 'grades')) { |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('not shown').')</span> '; |
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
} else { |
|
my $deeplink = $resource->deeplink($params->{caller}); |
|
if ((($deeplink eq 'absent') || ($deeplink eq 'grades')) && |
|
&advancedUser()) { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('unlisted').')</span> '; |
|
} elsif (($deeplink) && ($deeplink) ne 'full') { |
|
if (&advancedUser()) { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('deep-link access'). |
|
')</span> '; |
|
} else { |
|
$nonLinkedText .= ' <span class="LC_warning">('.&mt('access via external site'). |
|
')</span> '; |
|
} |
|
} |
} |
} |
} |
} |
if (!$resource->condval()) { |
if (!$resource->condval()) { |
Line 1397 sub render {
|
Line 1416 sub render {
|
$filterFunc = sub { my $res = shift; return !$res->randomout() && |
$filterFunc = sub { my $res = shift; return !$res->randomout() && |
($res->deeplink($args->{'caller'}) ne 'absent') && |
($res->deeplink($args->{'caller'}) ne 'absent') && |
($res->deeplink($args->{'caller'}) ne 'grades') && |
($res->deeplink($args->{'caller'}) ne 'grades') && |
|
!$res->deeplinkout() && |
&$oldFilterFunc($res);}; |
&$oldFilterFunc($res);}; |
} |
} |
|
|
Line 1490 sub render {
|
Line 1510 sub render {
|
if ($args->{'iterator_map'}) { |
if ($args->{'iterator_map'}) { |
my $map = $args->{'iterator_map'}; |
my $map = $args->{'iterator_map'}; |
$map = $navmap->getResourceByUrl($map); |
$map = $navmap->getResourceByUrl($map); |
my $firstResource = $map->map_start(); |
if (ref($map)) { |
my $finishResource = $map->map_finish(); |
my $firstResource = $map->map_start(); |
|
my $finishResource = $map->map_finish(); |
$args->{'iterator'} = $it = $navmap->getIterator($firstResource, $finishResource, $filterHash, $condition); |
$args->{'iterator'} = $it = $navmap->getIterator($firstResource, $finishResource, $filterHash, $condition); |
|
} else { |
|
return; |
|
} |
} else { |
} else { |
$args->{'iterator'} = $it = $navmap->getIterator(undef, undef, $filterHash, $condition,undef,$args->{'include_top_level_map'}); |
$args->{'iterator'} = $it = $navmap->getIterator(undef, undef, $filterHash, $condition,undef,$args->{'include_top_level_map'}); |
} |
} |
Line 1814 END
|
Line 1837 END
|
# If this is an empty sequence and we're filtering them, continue on |
# If this is an empty sequence and we're filtering them, continue on |
$args->{'mapHidden'} = 0; |
$args->{'mapHidden'} = 0; |
$args->{'mapUnlisted'} = 0; |
$args->{'mapUnlisted'} = 0; |
|
$args->{'mapHiddenDeepLink'} = 0; |
if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) { |
if (($curRes->is_map()) && (!$curRes->{DATA}->{HAS_VISIBLE_CHILDREN})) { |
if ($args->{'suppressEmptySequences'}) { |
if ($args->{'suppressEmptySequences'}) { |
next; |
next; |
Line 1826 END
|
Line 1850 END
|
} else { |
} else { |
next; |
next; |
} |
} |
|
} elsif ($curRes->deeplinkout) { |
|
if ($userCanSeeHidden) { |
|
$args->{'mapHiddenDeepLink'} = 1; |
|
} else { |
|
next; |
|
} |
} else { |
} else { |
my $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink"); |
my $deeplink = $navmap->get_mapparam(undef,$mapname,"0.deeplink"); |
if (($deeplink eq 'absent') || ($deeplink eq 'grades')) { |
if ($deeplink =~ /^(absent|grades),/) { |
if ($userCanSeeHidden) { |
if ($userCanSeeHidden) { |
$args->{'mapUnlisted'} = 1; |
$args->{'mapUnlisted'} = 1; |
} else { |
} else { |
Line 1899 END
|
Line 1929 END
|
} |
} |
} |
} |
# If deep-link parameter is set (and is not set to full) suppress link |
# If deep-link parameter is set (and is not set to full) suppress link |
# unless priviliged user, or calling context is sequence, and parameter |
# unless privileged user, tinyurl used for login resolved to a map, and |
# set at map level |
# the resource is within the map. |
if ((!$curRes->deeplink($args->{'caller'})) || |
if ((!$curRes->deeplink($args->{'caller'})) || |
($curRes->deeplink($args->{'caller'}) eq 'full') || &advancedUser()) { |
($curRes->deeplink($args->{'caller'}) eq 'full') || &advancedUser()) { |
$args->{'resource_nolink'} = 0; |
$args->{'resource_nolink'} = 0; |
Line 1933 END
|
Line 1963 END
|
if ($env{'request.course.id'}) { |
if ($env{'request.course.id'}) { |
if (($is_ssl) && ($src =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && |
if (($is_ssl) && ($src =~ m{^\Q/public/$cdom/$cnum/syllabus\E($|\?)}) && |
($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { |
($env{'course.'.$env{'request.course.id'}.'.externalsyllabus'} =~ m{^http://})) { |
if ($hostname ne '') { |
unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { |
$src = 'http://'.$hostname.$src; |
if ($hostname ne '') { |
|
$src = 'http://'.$hostname.$src; |
|
} |
|
$src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1'; |
|
$srcHasQuestion = 1; |
} |
} |
$src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1'; |
|
$srcHasQuestion = 1; |
|
} elsif (($is_ssl) && ($src =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) { |
} elsif (($is_ssl) && ($src =~ m{^\Q/adm/wrapper/ext/\E(?!https:)})) { |
if ($hostname ne '') { |
unless ((&Apache::lonnet::uses_sts()) || (&Apache::lonnet::waf_allssl($hostname))) { |
$src = 'http://'.$hostname.$src; |
if ($hostname ne '') { |
|
$src = 'http://'.$hostname.$src; |
|
} |
|
$src .= ($srcHasQuestion? '&' : '?') . 'usehttp=1'; |
|
$srcHasQuestion = 1; |
} |
} |
} |
} |
} |
} |
Line 1979 END
|
Line 2015 END
|
$currentJumpDelta) { |
$currentJumpDelta) { |
# Jam the anchor after the <td> tag; |
# Jam the anchor after the <td> tag; |
# necessary for valid HTML (which Mozilla requires) |
# necessary for valid HTML (which Mozilla requires) |
$colHTML =~ s/\>/\>\<a name="curloc" \/\>/; |
$colHTML =~ s/\>/\>\<a name="curloc" \>\<\/a\>/; |
$displayedJumpMarker = 1; |
$displayedJumpMarker = 1; |
} |
} |
$result .= $colHTML . "\n"; |
$result .= $colHTML . "\n"; |
Line 2466 sub getIterator {
|
Line 2502 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); |
shift, shift, shift); |
return $iterator; |
return $iterator; |
} |
} |
|
|
Line 2985 sub recursed_crumbs {
|
Line 3021 sub recursed_crumbs {
|
my $pc = $map->map_pc(); |
my $pc = $map->map_pc(); |
next if ((!$pc) || ($pc == 1)); |
next if ((!$pc) || ($pc == 1)); |
push(@links,$map); |
push(@links,$map); |
push(@revmapinfo,{'href' => $map->link().'?navmap=1','text' => $map->title(),'no_mt' => 1,}); |
push(@revmapinfo,{'href' => $env{'request.use_absolute'}.$map->link().'?navmap=1','text' => $map->title(),'no_mt' => 1,}); |
$totallength += length($map->title()); |
$totallength += length($map->title()); |
} |
} |
my $numlinks = scalar(@links); |
my $numlinks = scalar(@links); |
Line 3000 sub recursed_crumbs {
|
Line 3036 sub recursed_crumbs {
|
foreach my $map (@links) { |
foreach my $map (@links) { |
my $showntitle = &truncate_crumb_text($map->title(),$avg); |
my $showntitle = &truncate_crumb_text($map->title(),$avg); |
if ($showntitle ne '') { |
if ($showntitle ne '') { |
push(@revmapinfo,{'href' => $map->link().'?navmap=1','text' => $showntitle,'no_mt' => 1,}); |
push(@revmapinfo,{'href' => $env{'request.use_absolute'}.$map->link().'?navmap=1','text' => $showntitle,'no_mt' => 1,}); |
} |
} |
} |
} |
} |
} |
Line 3230 sub get_mapparam {
|
Line 3266 sub get_mapparam {
|
if (defined($$courseopt{$courselevelm})) { |
if (defined($$courseopt{$courselevelm})) { |
return $$courseopt{$courselevelm}; |
return $$courseopt{$courselevelm}; |
} |
} |
|
if (defined($$courseopt{$courseleveli})) { |
|
return $$courseopt{$courseleveli}; |
|
} |
unless ($recursed) { |
unless ($recursed) { |
@recurseup = $self->recurseup_maps($mapname); |
@recurseup = $self->recurseup_maps($mapname); |
$recursed = 1; |
$recursed = 1; |
Line 3603 getIterator behaves as follows:
|
Line 3642 getIterator behaves as follows:
|
|
|
=over 4 |
=over 4 |
|
|
=item * B<getIterator>(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap): |
=item * B<getIterator>(firstResource, finishResource, filterHash, condition, forceTop, returnTopMap, $deeplinklisted): |
|
|
All parameters are optional. firstResource is a resource reference |
All parameters are optional. firstResource is a resource reference |
corresponding to where the iterator should start. It defaults to |
corresponding to where the iterator should start. It defaults to |
Line 3620 that is not just a single, 'redirecting'
|
Line 3659 that is not just a single, 'redirecting'
|
will return all information, starting with the top-level map, |
will return all information, starting with the top-level map, |
regardless of content. returnTopMap, if true (default false), will |
regardless of content. returnTopMap, if true (default false), will |
cause the iterator to return the top-level map object (resource 0.0) |
cause the iterator to return the top-level map object (resource 0.0) |
before anything else. |
before anything else. deeplinklisted if true (default false), will |
|
check "listed" status of a resource with a deeplink, and unless "absent" |
|
will exclude deeplink checking when retrieving the browsePriv from |
|
lonnet::allowed(). |
|
|
Thus, by default, only top-level resources will be shown. Change the |
Thus, by default, only top-level resources will be shown. Change the |
condition to a 1 without changing the hash, and all resources will be |
condition to a 1 without changing the hash, and all resources will be |
Line 3757 sub new {
|
Line 3799 sub new {
|
# have we done that yet? |
# have we done that yet? |
$self->{HAVE_RETURNED_0} = 0; |
$self->{HAVE_RETURNED_0} = 0; |
|
|
|
# Do we want to check the "listed" status for a resource for which |
|
# deeplinking applies. |
|
$self->{DEEPLINKLISTED} = shift; |
|
|
# Now, we need to pre-process the map, by walking forward and backward |
# Now, we need to pre-process the map, by walking forward and backward |
# over the parts of the map we're going to look at. |
# over the parts of the map we're going to look at. |
|
|
Line 3848 sub new {
|
Line 3894 sub new {
|
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, |
$self->{ALREADY_SEEN}, |
$self->{CONDITION}, |
$self->{CONDITION}, |
$self->{FORCE_TOP}); |
$self->{FORCE_TOP}, |
|
undef,$self->{DEEPLINKLISTED}); |
} |
} |
|
|
# Set up some bookkeeping information. |
# Set up some bookkeeping information. |
Line 4008 sub next {
|
Line 4055 sub next {
|
# That ends the main iterator logic. Now, do we want to recurse |
# That ends the main iterator logic. Now, do we want to recurse |
# down this map (if this resource is a map)? |
# down this map (if this resource is a map)? |
if ( ($self->{HERE}->is_sequence() || (!$closeAllPages && $self->{HERE}->is_page())) && |
if ( ($self->{HERE}->is_sequence() || (!$closeAllPages && $self->{HERE}->is_page())) && |
(defined($self->{FILTER}->{$self->{HERE}->map_pc()}) xor $self->{CONDITION})) { |
(defined($self->{FILTER}->{$self->{HERE}->map_pc()}) xor $self->{CONDITION}) && |
|
($env{'request.role.adv'} || !$self->{HERE}->randomout())) { |
$self->{RECURSIVE_ITERATOR_FLAG} = 1; |
$self->{RECURSIVE_ITERATOR_FLAG} = 1; |
my $firstResource = $self->{HERE}->map_start(); |
my $firstResource = $self->{HERE}->map_start(); |
my $finishResource = $self->{HERE}->map_finish(); |
my $finishResource = $self->{HERE}->map_finish(); |
Line 4017 sub next {
|
Line 4065 sub next {
|
$finishResource, $self->{FILTER}, |
$finishResource, $self->{FILTER}, |
$self->{ALREADY_SEEN}, |
$self->{ALREADY_SEEN}, |
$self->{CONDITION}, |
$self->{CONDITION}, |
$self->{FORCE_TOP}); |
$self->{FORCE_TOP}, |
|
undef,$self->{DEEPLINKLISTED}); |
} |
} |
|
|
# If this is a blank resource, don't actually return it. |
# If this is a blank resource, don't actually return it. |
# Should you ever find you need it, make sure to add an option to the code |
# Should you ever find you need it, make sure to add an option to the code |
# that you can use; other things depend on this behavior. |
# that you can use; other things depend on this behavior. |
my $browsePriv = $self->{HERE}->browsePriv($noblockcheck); |
my $browsePriv = $self->{HERE}->browsePriv($noblockcheck,$self->{DEEPLINKLISTED}); |
if (!$self->{HERE}->src() || |
if (!$self->{HERE}->src() || |
(!($browsePriv eq 'F') && !($browsePriv eq '2')) ) { |
(!($browsePriv eq 'F') && !($browsePriv eq '2')) ) { |
return $self->next($closeAllPages); |
return $self->next($closeAllPages); |
Line 4451 sub from { my $self=shift; return $self-
|
Line 4500 sub from { my $self=shift; return $self-
|
sub goesto { my $self=shift; return $self->navHash("goesto_", 1); } |
sub goesto { my $self=shift; return $self->navHash("goesto_", 1); } |
sub kind { my $self=shift; return $self->navHash("kind_", 1); } |
sub kind { my $self=shift; return $self->navHash("kind_", 1); } |
sub randomout { my $self=shift; return $self->navHash("randomout_", 1); } |
sub randomout { my $self=shift; return $self->navHash("randomout_", 1); } |
|
sub deeplinkout { my $self=shift; return $self->navHash("deeplinkout_", 1); } |
sub randompick { |
sub randompick { |
my $self = shift; |
my $self = shift; |
my $randompick = $self->parmval('randompick'); |
my $randompick = $self->parmval('randompick'); |
Line 5139 sub slot_control {
|
Line 5189 sub slot_control {
|
return ($useslots,$availablestudent,$available); |
return ($useslots,$availablestudent,$available); |
} |
} |
sub deeplink { |
sub deeplink { |
my ($self,$caller) = @_; |
my ($self,$caller,$action) = @_; |
if ($caller eq 'sequence') { |
my $deeplink = $self->parmval("deeplink"); |
my @deeplink = $self->parmval("deeplink"); |
if ($deeplink) { |
if ($deeplink[1] eq 'resource') { |
my ($listed,$scope,$access) = split(/,/,$deeplink); |
return $deeplink[0]; |
if ($action eq 'getlisted') { |
|
return $listed; |
|
} |
|
if ($env{'request.deeplink.login'}) { |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $deeplink_symb = &Apache::loncommon::deeplink_login_symb($cnum,$cdom); |
|
if ($deeplink_symb) { |
|
my ($loginmap,$mapname); |
|
if ($deeplink_symb =~ /\.(page|sequence)$/) { |
|
$mapname = $self->enclosing_map_src(); |
|
$loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[2]); |
|
return if ($mapname eq $loginmap); |
|
} else { |
|
return if ($deeplink_symb eq $self->symb()); |
|
if (($scope eq 'map') || ($scope eq 'rec')) { |
|
$mapname = $self->enclosing_map_src(); |
|
$loginmap = &Apache::lonnet::clutter((&Apache::lonnet::decode_symb($deeplink_symb))[0]); |
|
return if ($mapname eq $loginmap); |
|
} |
|
} |
|
if ($scope eq 'rec') { |
|
my $map_pc = $self->navHash('map_pc_'.$mapname); |
|
my @recurseup = split(/,/,$self->navHash('map_hierarchy_'.$map_pc)); |
|
my $login_pc = $self->navHash('map_pc_'.$loginmap); |
|
return if (grep(/^\Q$login_pc\E$/,@recurseup)); |
|
} |
|
} |
|
} |
|
unless (($caller eq 'sequence') || ($access eq 'any')) { |
|
return $listed; |
} |
} |
} else { |
|
return $self->parmval("deeplink"); |
|
} |
} |
|
return; |
} |
} |
|
|
# Multiple things need this |
# Multiple things need this |
Line 6340 sub getPrevious {
|
Line 6419 sub getPrevious {
|
sub browsePriv { |
sub browsePriv { |
my $self = shift; |
my $self = shift; |
my $noblockcheck = shift; |
my $noblockcheck = shift; |
|
my $deeplinklisted = shift; |
if (defined($self->{BROWSE_PRIV})) { |
if (defined($self->{BROWSE_PRIV})) { |
return $self->{BROWSE_PRIV}; |
return $self->{BROWSE_PRIV}; |
} |
} |
|
my ($nodeeplinkcheck,$nodeeplinkout); |
|
if ($deeplinklisted) { |
|
my $deeplink = $self->deeplink(undef,'getlisted'); |
|
if (($deeplink) && ($deeplink ne 'absent')) { |
|
$nodeeplinkcheck = 1; |
|
} |
|
$nodeeplinkout = 1; |
|
} |
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), |
$self->{BROWSE_PRIV} = &Apache::lonnet::allowed('bre',$self->src(), |
$self->{SYMB},undef, |
$self->{SYMB},undef, |
undef,$noblockcheck); |
undef,$noblockcheck, |
|
undef,$nodeeplinkcheck, |
|
$nodeeplinkout); |
} |
} |
|
|
=pod |
=pod |