version 1.144, 2003/02/20 22:08:55
|
version 1.150, 2003/02/28 16:16:59
|
Line 44 package Apache::lonnavmaps;
|
Line 44 package Apache::lonnavmaps;
|
use strict; |
use strict; |
use Apache::Constants qw(:common :http); |
use Apache::Constants qw(:common :http); |
use Apache::loncommon(); |
use Apache::loncommon(); |
|
use Apache::lonmenu(); |
use POSIX qw (floor strftime); |
use POSIX qw (floor strftime); |
|
|
my %navmaphash; |
my %navmaphash; |
Line 152 sub real_handler {
|
Line 153 sub real_handler {
|
} |
} |
|
|
$r->print("<html><head>\n"); |
$r->print("<html><head>\n"); |
$r->print("<title>Navigate Course Contents</title></head>"); |
$r->print("<title>Navigate Course Contents</title>"); |
|
# ------------------------------------------------------------ Get query string |
|
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['register']); |
|
# ----------------------------------------------------- Force menu registration |
|
my $addentries=''; |
|
if ($ENV{'form.register'}) { |
|
$addentries=' onLoad="'.&Apache::lonmenu::loadevents(). |
|
'" onUnload="'.&Apache::lonmenu::unloadevents().'"'; |
|
$r->print(&Apache::lonmenu::registerurl(1)); |
|
} |
|
|
# Header |
# Header |
$r->print(&Apache::loncommon::bodytag('Navigate Course Contents','', |
$r->print('</head>'. |
'')); |
&Apache::loncommon::bodytag('Navigate Course Contents','', |
|
$addentries)); |
$r->print('<script>window.focus();</script>'); |
$r->print('<script>window.focus();</script>'); |
|
|
$r->rflush(); |
$r->rflush(); |
Line 178 sub real_handler {
|
Line 189 sub real_handler {
|
# renderer call |
# renderer call |
my $render = render({ 'cols' => [0,1,2,3], |
my $render = render({ 'cols' => [0,1,2,3], |
'url' => '/adm/navmaps', |
'url' => '/adm/navmaps', |
'printKey' => 1, |
#'printKey' => 1, |
'r' => $r}); |
'r' => $r}); |
|
|
$navmap->untieHashes(); |
$navmap->untieHashes(); |
Line 533 Most of these parameters are only useful
|
Line 544 Most of these parameters are only useful
|
|
|
In addition to the parameters you can pass to the renderer, which will be passed through unchange to the column renderers, the renderer will generate the following information which your renderer may find useful: |
In addition to the parameters you can pass to the renderer, which will be passed through unchange to the column renderers, the renderer will generate the following information which your renderer may find useful: |
|
|
|
If you want to know how many rows were printed, the 'counter' element of the hash passed into the render function will contain the count. You may want to check whether any resources were printed at all. |
|
|
=over 4 |
=over 4 |
|
|
=back |
=back |
Line 941 sub render {
|
Line 954 sub render {
|
# See if we're being passed a specific map |
# See if we're being passed a specific map |
if ($args->{'iterator_map'}) { |
if ($args->{'iterator_map'}) { |
my $map = $args->{'iterator_map'}; |
my $map = $args->{'iterator_map'}; |
$map = &Apache::lonnet::clutter($map); |
$map = $navmap->getResourceByUrl($map); |
$map = $navmap->{NAV_HASH}->{'ids_' . $map}; |
|
$map = $navmap->getById($map); |
|
my $firstResource = $map->map_start(); |
my $firstResource = $map->map_start(); |
my $finishResource = $map->map_finish(); |
my $finishResource = $map->map_finish(); |
|
|
Line 1613 sub parmval_real {
|
Line 1624 sub parmval_real {
|
return ''; |
return ''; |
} |
} |
|
|
|
=pod |
|
|
|
=item * B<getResourceByUrl>(url): Retrieves a resource object by URL of the resource. If passed a resource object, it will simply return it, so it is safe to use this method in code like "$res = $navmap->getResourceByUrl($res)", if you're not sure if $res is already an object, or just a URL. If the resource appears multiple times in the course, only the first instance will be returned. As a result, this is probably useful only for maps. |
|
|
|
=item * B<retrieveResources>(map, filterFunc, recursive, bailout): 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 function that takes a resource object as its one argument and returns true if the resource should be included, or false if it should not be. If recursive is true, the map will be recursively examined, 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, the map is the top-level map of the course, filterFunc is a function that always returns 1, recursive is true, bailout is false. The resources will be returned in a list reference containing the resource objects for the corresponding resources, with B<no 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, just a list of all resources. It is also suitable for finding out how many resources match a given description; for this use, if all you want to know is if I<any> resources match the description, the bailout parameter will allow you to avoid potentially expensive enumeration of all matching resources. |
|
|
|
=item * B<hasResources>(map, filterFunc, recursive): Convience method for |
|
|
|
scalar(retrieveResources($map, $filterFunc, $recursive, 1)) > 0 |
|
|
|
which will tell whether the map has resources matching the description in the filter function. |
|
|
|
=cut |
|
|
|
sub getResourceByUrl { |
|
my $self = shift; |
|
my $resUrl = shift; |
|
|
|
if (ref($resUrl)) { return $resUrl; } |
|
|
|
$resUrl = &Apache::lonnet::clutter($resUrl); |
|
my $resId = $self->{NAV_HASH}->{'ids_' . $resUrl}; |
|
if ($resId =~ /,/) { |
|
$resId = (split (/,/, $resId))[0]; |
|
} |
|
if (!$resId) { return ''; } |
|
return $self->getById($resId); |
|
} |
|
|
|
sub retrieveResources { |
|
my $self = shift; |
|
my $map = shift; |
|
my $filterFunc = shift; |
|
if (!defined ($filterFunc)) { |
|
$filterFunc = sub {return 1;}; |
|
} |
|
my $recursive = shift; |
|
if (!defined($recursive)) { $recursive = 1; } |
|
my $bailout = shift; |
|
if (!defined($bailout)) { $bailout = 0; } |
|
|
|
# Create the necessary iterator. |
|
if (!ref($map)) { # assume it's a url of a map. |
|
$map = $self->getMapByUrl($map); |
|
} |
|
|
|
# Check the map's validity. |
|
if (!$map || !$map->is_map()) { |
|
# Oh, to throw an exception.... how I'd love that! |
|
return (); |
|
} |
|
|
|
# Get an iterator. |
|
my $it = $self->getIterator($map->map_start(), $map->map_finish(), |
|
!$recursive); |
|
|
|
my @resources = (); |
|
|
|
# Run down the iterator and collect the resources. |
|
my $depth = 1; |
|
$it->next(); |
|
my $curRes = $it->next(); |
|
|
|
while ($depth > 0) { |
|
if ($curRes == $it->BEGIN_MAP()) { |
|
$depth++; |
|
} |
|
if ($curRes == $it->END_MAP()) { |
|
$depth--; |
|
} |
|
|
|
if (ref($curRes)) { |
|
if (!&$filterFunc($curRes)) { |
|
next; |
|
} |
|
|
|
push @resources, $curRes; |
|
|
|
if ($bailout) { |
|
return @resources; |
|
} |
|
} |
|
|
|
$curRes = $it->next(); |
|
} |
|
|
|
return @resources; |
|
} |
|
|
|
sub hasResource { |
|
my $self = shift; |
|
my $map = shift; |
|
my $filterFunc = shift; |
|
my $recursive = shift; |
|
|
|
return scalar($self->retrieveResources($map, $filterFunc, $recursive, 1)) > 0; |
|
} |
|
|
1; |
1; |
|
|
package Apache::lonnavmaps::iterator; |
package Apache::lonnavmaps::iterator; |
Line 2596 sub extractParts {
|
Line 2707 sub extractParts {
|
|
|
foreach (split(/\,/,$metadata)) { |
foreach (split(/\,/,$metadata)) { |
if ($_ =~ /^parameter\_(.*)\_opendate$/) { |
if ($_ =~ /^parameter\_(.*)\_opendate$/) { |
push @{$self->{PARTS}}, $1; |
my $part = $1; |
|
# check to see if part is turned off. |
|
if (! Apache::loncommon::check_if_partid_hidden($part, $self->symb())) { |
|
push @{$self->{PARTS}}, $1; |
|
} |
} |
} |
} |
} |
|
|
|
|
# Is this possible to do in one line? - Jeremy |
|
my @sortedParts = sort @{$self->{PARTS}}; |
my @sortedParts = sort @{$self->{PARTS}}; |
$self->{PARTS} = \@sortedParts; |
$self->{PARTS} = \@sortedParts; |
} |
} |