package WebGUI::Asset::Wobject::Navigation;
#-------------------------------------------------------------------
# WebGUI is Copyright 2001-2005 Plain Black Corporation.
#-------------------------------------------------------------------
# Please read the legal notices (docs/legal.txt) and the license
# (docs/license.txt) that came with this distribution before using
# this software.
#-------------------------------------------------------------------
# http://www.plainblack.com info@plainblack.com
#-------------------------------------------------------------------
use strict;
use Tie::IxHash;
use WebGUI::Asset::Wobject;
use WebGUI::ErrorHandler;
use WebGUI::Form;
use WebGUI::International;
use WebGUI::Privilege;
use WebGUI::Session;
use WebGUI::SQL;
use WebGUI::TabForm;
use WebGUI::URL;
use WebGUI::Utility;
our @ISA = qw(WebGUI::Asset::Wobject);
sub definition {
my $class = shift;
my $definition = shift;
push(@{$definition}, {
tableName=>'Navigation',
className=>'WebGUI::Asset::Wobject::Navigation',
properties=>{
templateId =>{
fieldType=>"template",
defaultValue=>'PBtmpl0000000000000048'
},
assetsToInclude=>{
fieldType=>'checkList',
defaultValue=>"descendants"
},
startType=>{
fieldType=>'selectList',
defaultValue=>"relativeToCurrentUrl"
},
startPoint=>{
fieldType=>'text',
defaultValue=>0
},
endPoint=>{
fieldType=>'selectList',
defaultValue=>55
},
showSystemPages=>{
fieldType=>'yesNo',
defaultValue=>0
},
showHiddenPages=>{
fieldType=>'yesNo',
defaultValue=>0
},
showUnprivilegedPages=>{
fieldType=>'yesNo',
defaultValue=>0
}
}
});
return $class->SUPER::definition($definition);
}
sub getEditForm {
my $self = shift;
my $tabform = $self->SUPER::getEditForm;
$tabform->getTab("display")->template(
-value=>$self->getValue('templateId'),
-namespace=>"Navigation"
);
my ($descendantsChecked, $selfChecked, $pedigreeChecked, $siblingsChecked);
my @assetsToInclude = split("\n",$self->getValue("assetsToInclude"));
my $afterScript;
foreach my $item (@assetsToInclude) {
if ($item eq "self") {
$selfChecked = 1;
} elsif ($item eq "descendants") {
$descendantsChecked = 1;
$afterScript = "displayNavEndPoint = false;";
} elsif ($item eq "siblings") {
$siblingsChecked = 1;
} elsif ($item eq "pedigree") {
$pedigreeChecked = 1;
}
}
$tabform->getTab("properties")->selectList(
-name=>"startType",
-options=>{
specificUrl=>'Specific URL',
relativeToCurrentUrl=>'Relative To Current URL',
relativeToRoot=>'Relative To Root'
},
-value=>[$self->getValue("startType")],
-label=>"Start Point Type",
-extras=>'id="navStartType" onChange="changeStartPoint()"'
);
$tabform->getTab("properties")->readOnly(
-label=>"Start Point",
-value=>'
'
);
$tabform->getTab("properties")->readOnly(
-label=>"Relatives to Include",
-value=>WebGUI::Form::checkbox({
checked=>$selfChecked,
name=>"assetsToInclude",
value=>"self"
}).'Self '
.WebGUI::Form::checkbox({
checked=>$siblingsChecked,
name=>"assetsToInclude",
value=>"siblings"
}).'Siblings '
.WebGUI::Form::checkbox({
checked=>$descendantsChecked,
name=>"assetsToInclude",
value=>"descendants",
extras=>'onChange="toggleEndPoint()"'
}).'Descendants '
.WebGUI::Form::checkbox({
checked=>$pedigreeChecked,
name=>"assetsToInclude",
value=>"pedigree"
}).'Pedigree '
);
my %options;
tie %options, 'Tie::IxHash';
%options = (
'55'=>'Infinity',
'1'=>'./a/ (+1)',
'2'=>'./a/b/ (+2)',
'3'=>'./a/b/c/ (+3)',
'4'=>'./a/b/c/d/ (+4)',
'5'=>'./a/b/c/d/e/ (+5)'
);
$tabform->getTab("properties")->raw(
'End Point '
.WebGUI::Form::selectList({
name=>"endPoint",
value=>[$self->getValue("endPoint")],
options=>\%options
})
.' '
);
$tabform->getTab("display")->yesNo(
-name=>'showSystemPages',
-label=>WebGUI::International::get(30,'Navigation'),
-value=>$self->getValue("showSystemPages")
);
$tabform->getTab("display")->yesNo(
-name=>'showHiddenPages',
-label=>WebGUI::International::get(31,'Navigation'),
-value=>$self->getValue("showHiddenPages")
);
$tabform->getTab("display")->yesNo(
-name=>'showUnprivilegedPages',
-label=>WebGUI::International::get(32,'Navigation'),
-value=>$self->getValue("showUnprivilegedPages")
);
my $start = $self->getValue("startPoint");
$tabform->getTab("properties")->raw("");
my $previewButton;# = qq{
# };
my $saveButton = ' ';
$tabform->{_submit} = $previewButton." ".$saveButton;
return $tabform;
}
sub getIcon {
my $self = shift;
my $small = shift;
return $session{config}{extrasURL}.'/assets/small/navigation.gif' if ($small);
return $session{config}{extrasURL}.'/assets/navigation.gif';
}
sub getName {
return WebGUI::International::get("navigation","Navigation");
}
sub view {
my $self = shift;
# we've got to determine what our start point is based upon user conditions
my ($start,$current);
if (!exists $session{asset}) {
$start = $current = $self;
} elsif ($self->get("startType") eq "specificUrl") {
$start = WebGUI::Asset->newByUrl($self->get("startPoint"));
} elsif ($self->get("startType") eq "relativeToRoot") {
unless (($self->get("startPoint")+1) >= $self->getLineageLength) {
$start = WebGUI::Asset->newByLineage(substr($session{asset}->get("lineage"),0, ($self->get("startPoint") + 1) * 6));
}
} elsif ($self->get("startType") eq "relativeToCurrentUrl") {
if ($self->get("startPoint") < 0) {
$start = WebGUI::Asset->newByLineage(substr($session{asset}->get("lineage"),0,
($session{asset}->getLineageLength - $self->get("startPoint") + 1) * 6
));
} elsif ($self->get("startPoint") > 0) {
my $lineage = $session{asset}->getLineage;
for (1..$self->get("startPoint")) {
$lineage .= $self->formatRank(1);
}
$start = WebGUI::Asset->newByLineage($lineage);
}
}
$current = $session{asset} unless (defined $current);
$start = $session{asset} unless (defined $start); # if none of the above results in a start point, then the current page must be it
my @includedRelationships = split("\n",$self->get("assetsToInclude"));
my %rules;
$rules{returnQuickReadObjects} = 1;
$rules{endingLineageLength} = $start->getLineageLength+$self->get("endPoint");
$rules{assetToPedigree} = $current if (isIn("pedigree",@includedRelationships));
my $assets = $start->getLineage(\@includedRelationships,\%rules);
my $var = {'page_loop' => []};
my @interestingProperties = ('assetId', 'parentId', 'title', 'ownerUserId', 'synopsis', 'newWindow', 'menuTitle');
foreach my $property (@interestingProperties) {
$var->{'currentPage.'.$property} = $current->get($property);
}
$var->{'currentPage.isHome'} = ($current->getId eq $session{setting}{defaultPage});
$var->{'currentPage.url'} = $current->getUrl;
$var->{'currentPage.hasChild'} = $current->hasChildren;
my $currentLineage = $current->get("lineage");
my @linesToSkip;
my $absoluteDepthOfLastPage;
foreach my $asset (@{$assets}) {
# skip pages we shouldn't see
my $skip = 0;
my $pageLineage = $asset->get("lineage");
foreach my $lineage (@linesToSkip) {
$skip = 1 if ($lineage =~ m/^$pageLineage/);
}
next if ($skip);
if ($asset->get("isHidden") && !$self->get("showHiddenPages")) {
push (@linesToSkip,$asset->getId);
next;
}
if ($asset->get("isSystem") && !$self->get("showSystemPages")) {
push (@linesToSkip,$asset->getId);
next;
}
unless ($self->get("showUnprivilegedPages") || $asset->canView) {
push (@linesToSkip,$asset->getId);
next;
}
my $pageData = {};
foreach my $property (@interestingProperties) {
$pageData->{"page.".$property} = $asset->get($property);
}
# build nav variables
$pageData->{"page.absDepth"} = $asset->getLineageLength;
$pageData->{"page.relDepth"} = $asset->getLineageLength - $start->getLineageLength;
$pageData->{"page.isSystem"} = $asset->get("isSystem");
$pageData->{"page.isHidden"} = $asset->get("isHidden");
$pageData->{"page.isViewable"} = $asset->canView;
$pageData->{"page.url"} = $asset->getUrl;
my $indent = $pageData->{"page.relDepth"};
$pageData->{"page.indent_loop"} = [];
push(@{$pageData->{"page.indent_loop"}},{'indent'=>$_}) for(1..$indent);
$pageData->{"page.indent"} = " " x $indent;
$pageData->{"page.isBranchRoot"} = ($pageData->{"page.absDepth"} == 1);
$pageData->{"page.isTopOfBranch"} = ($pageData->{"page.absDepth"} == 2);
$pageData->{"page.isChild"} = ($asset->get("parentId") eq $current->getId);
$pageData->{"page.isParent"} = ($asset->getId eq $current->get("parentId"));
$pageData->{"page.isCurrent"} = ($asset->getId eq $current->getId);
$pageData->{"page.isDescendant"} = ( $currentLineage =~ m/^$pageLineage/ && !$pageData->{"page.isCurrent"});
$pageData->{"page.isAnscestor"} = ( $pageLineage =~ m/^$currentLineage/ && !$pageData->{"page.isCurrent"});
my $currentBranchLineage = substr($currentLineage,0,12);
$pageData->{"page.inBranchRoot"} = ($currentBranchLineage =~ m/^$pageLineage/);
$pageData->{"page.isSibling"} = (
$pageData->{"page.inBranchRoot"} &&
$asset->getLineageLength == $current->getLineageLength &&
!$pageData->{"page.isCurrent"}
);
$pageData->{"page.inBranch"} = (
$pageData->{"page.isCurrent"} ||
$pageData->{"page.isAncestor"} ||
$pageData->{"page.isSibling"} ||
$pageData->{"page.isDescendant"}
);
$pageData->{"page.depthIs".$pageData->{"page.absDepth"}} = 1;
$pageData->{"page.relativeDepthIs".$pageData->{"page.relDepth"}} = 1;
my $depthDiff = ($absoluteDepthOfLastPage) ? ($absoluteDepthOfLastPage - $pageData->{'page.absDepth'}) : 0;
if ($depthDiff > 0) {
$pageData->{"page.depthDiff"} = $depthDiff if ($depthDiff > 0);
$pageData->{"page.depthDiffIs".$depthDiff} = 1;
push(@{$pageData->{"page.depthDiff_loop"}},{}) for(1..$depthDiff);
}
$absoluteDepthOfLastPage = $pageData->{"page.absDepth"};
$pageData->{"page.hasChild"} = $asset->hasChildren;
my $parent = $self->getParent;
if (defined $parent) {
foreach my $property (@interestingProperties) {
$pageData->{"page.parent.".$property} = $parent->get($property);
}
$pageData->{"page.parent.url"} = $parent->getUrl;
# these next two variables can be very inefficient, consider getting rid of them
my $parentsFirstChild = $parent->getFirstChild;
if (defined $parentsFirstChild) {
$pageData->{"page.isRankedFirst"} = ($asset->getId == $parentsFirstChild->getId);
}
my $parentsLastChild = $parent->getLastChild;
if (defined $parentsLastChild) {
$pageData->{"page.isRankedLast"} = ($asset->getId == $parentsLastChild->getId);
}
}
push(@{$var->{page_loop}}, $pageData);
}
return $self->processTemplate($var,$self->get("templateId"));
}
sub www_edit {
my $self = shift;
return $self->getAdminConsole->render(WebGUI::Privilege::insufficient()) unless $self->canEdit;
$self->getAdminConsole->setHelp("navigation add/edit");
return $self->getAdminConsole->render($self->getEditForm->print,WebGUI::International::get("22","Navigation"));
}
#-------------------------------------------------------------------
# we eventually should reaadd this
sub www_preview {
my $self = shift;
$session{var}{adminOn} = 0;
return WebGUI::Privilege::insufficient() unless (WebGUI::Grouping::isInGroup(3));
my $nav = WebGUI::Navigation->new( depth=>$session{form}{depth},
method=>$session{form}{method},
startAt=>$session{form}{startAt},
stopAtLevel=>$session{form}{stopAtLevel},
templateId=>$session{form}{templateId},
showSystemPages=>$session{form}{showSystemPages},
showHiddenPages=>$session{form}{showHiddenPages},
showUnprivilegedPages=>$session{form}{showUnprivilegedPages},
'reverse'=>$session{form}{'reverse'},
);
my $output = qq(
);
# Because of the way the system is set up, the preview is cached. So let's remove it again...
WebGUI::Cache->new($nav->{_identifier}."$session{page}{pageId}", "Navigation-".$session{config}{configFile})->delete;
return _submenu($output,"preview");
}
1;