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::Icon; 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}, { assetName=>WebGUI::International::get("navigation","Asset_Navigation"), icon=>'navigation.gif', 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 }, ancestorEndPoint=>{ fieldType=>'selectList', defaultValue=>55 }, descendantEndPoint=>{ 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; my $i18n = WebGUI::International->new("Asset_Navigation"); $tabform->getTab("display")->template( -value=>$self->getValue('templateId'), -namespace=>"Navigation", -label=>$i18n->get(1096), -hoverHelp=>$i18n->get('1096 description'), ); $tabform->hidden({ name=>"returnUrl", value=>$session{form}{returnUrl} }); my ($descendantsChecked, $ancestorsChecked, $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 "ancestors") { $ancestorsChecked = 1; } elsif ($item eq "siblings") { $siblingsChecked = 1; } elsif ($item eq "pedigree") { $pedigreeChecked = 1; } } $tabform->getTab("properties")->selectList( -name=>"startType", -options=>{ specificUrl=>$i18n->get('Specific URL'), relativeToCurrentUrl=>$i18n->get('Relative To Current URL'), relativeToRoot=>$i18n->get('Relative To Root') }, -value=>[$self->getValue("startType")], -label=>$i18n->get("Start Point Type"), -hoverHelp=>$i18n->get("Start Point Type description"), -id=>"navStartType", -extras=>'onchange="changeStartPoint()"' ); $tabform->getTab("properties")->readOnly( -label=>$i18n->get("Start Point"), -hoverHelp=>$i18n->get("Start Point description"), -value=>'' ); my %options = (); tie %options, 'Tie::IxHash'; %options = ( '1'=>'../ (-1)', '2'=>'../../ (-2)', '3'=>'../../../ (-3)', '4'=>'../../../../ (-4)', '5'=>'../../../../../ (-5)', '55'=>$i18n->get('Infinity') ); $tabform->getTab("properties")->raw( ''.$i18n->get("Ancestor End Point").'' .WebGUI::Form::selectList({ name=>"ancestorEndPoint", value=>[$self->getValue("ancestorEndPoint")], options=>\%options }) .'' ); $tabform->getTab("properties")->readOnly( -label=>$i18n->get("Relatives To Include"), -hoverHelp=>$i18n->get("Relatives To Include description"), -value=>WebGUI::Form::checkbox({ checked=>$ancestorsChecked, name=>"assetsToInclude", extras=>'onChange="toggleAncestorEndPoint()"', value=>"ancestors" }).$i18n->get('Ancestors').'
' .WebGUI::Form::checkbox({ checked=>$selfChecked, name=>"assetsToInclude", value=>"self" }).$i18n->get('Self').'
' .WebGUI::Form::checkbox({ checked=>$siblingsChecked, name=>"assetsToInclude", value=>"siblings" }).$i18n->get('Siblings').'
' .WebGUI::Form::checkbox({ checked=>$descendantsChecked, name=>"assetsToInclude", value=>"descendants", extras=>'onChange="toggleDescendantEndPoint()"' }).$i18n->get('Descendants').'
' .WebGUI::Form::checkbox({ checked=>$pedigreeChecked, name=>"assetsToInclude", value=>"pedigree" }).$i18n->get('Pedigree').'
' ); %options = (); tie %options, 'Tie::IxHash'; %options = ( '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)', '55'=>$i18n->get('Infinity') ); $tabform->getTab("properties")->raw( ''.$i18n->get('Descendant End Point').'' .WebGUI::Form::selectList({ name=>"descendantEndPoint", value=>[$self->getValue("descendantEndPoint")], options=>\%options }) .'' ); $tabform->getTab("display")->yesNo( -name=>'showSystemPages', -label=>$i18n->get(30), -hoverHelp=>$i18n->get('30 description'), -value=>$self->getValue("showSystemPages") ); $tabform->getTab("display")->yesNo( -name=>'showHiddenPages', -label=>$i18n->get(31), -hoverHelp=>$i18n->get('31 description'), -value=>$self->getValue("showHiddenPages") ); $tabform->getTab("display")->yesNo( -name=>'showUnprivilegedPages', -label=>$i18n->get(32), -hoverHelp=>$i18n->get('32 description'), -value=>$self->getValue("showUnprivilegedPages") ); my $start = $self->getValue("startPoint"); $tabform->getTab("properties")->raw(""); my $previewButton;# = qq{ # }; my $saveButton = ' '; $tabform->{_submit} = $previewButton." ".$saveButton; return $tabform; } #------------------------------------------------------------------- =head2 getToolbar ( ) Returns a toolbar with a set of icons that hyperlink to functions that delete, edit, promote, demote, cut, and copy. =cut sub getToolbar { my $self = shift; if ($self->getToolbarState) { my $returnUrl; if (exists $session{asset}) { $returnUrl = "&proceed=goBackToPage&returnUrl=".WebGUI::URL::escape($session{asset}->getUrl); } my $toolbar; if (!$self->isLocked || $self->get("isLockedBy") eq $session{user}{userId}) { $toolbar = editIcon('func=edit'.$returnUrl,$self->get("url")); } my $i18n = WebGUI::International->new("Asset"); return ''.$toolbar; } return $self->SUPER::getToolbar(); } #------------------------------------------------------------------- sub view { my $self = shift; # we've got to determine what our start point is based upon user conditions my $start; $session{asset} = WebGUI::Asset->newByUrl unless (exists $session{asset}); my $current = $session{asset}; if ($self->get("startType") eq "specificUrl") { $start = WebGUI::Asset->newByUrl($self->get("startPoint")); } elsif ($self->get("startType") eq "relativeToRoot") { unless (($self->get("startPoint")+1) >= $current->getLineageLength) { $start = WebGUI::Asset->newByLineage(substr($current->get("lineage"),0, ($self->get("startPoint") + 1) * 6)); } } elsif ($self->get("startType") eq "relativeToCurrentUrl") { if ($self->get("startPoint") < 0) { $start = WebGUI::Asset->newByLineage(substr($current->get("lineage"),0, ($current->getLineageLength - $self->get("startPoint") + 1) * 6 )); } elsif ($self->get("startPoint") > 0) { my $lineage = $current->get("lineage"); for (1..$self->get("startPoint")) { $lineage .= $self->formatRank(1); } $start = WebGUI::Asset->newByLineage($lineage); } } $start = $current 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{returnObjects} = 1; $rules{endingLineageLength} = $start->getLineageLength+$self->get("descendantEndPoint"); $rules{assetToPedigree} = $current if (isIn("pedigree",@includedRelationships)); $rules{ancestorLimit} = $self->get("ancestorEndPoint"); my $assets = $start->getLineage(\@includedRelationships,\%rules); my $var = {'page_loop' => []}; my @interestingProperties = ('assetId', 'parentId', 'ownerUserId', 'synopsis', 'newWindow'); foreach my $property (@interestingProperties) { $var->{'currentPage.'.$property} = $current->get($property); } $var->{'currentPage.menuTitle'} = $current->getMenuTitle; $var->{'currentPage.title'} = $current->getTitle; $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 $lineageToSkip = "noskip"; my $absoluteDepthOfLastPage; foreach my $asset (@{$assets}) { # skip pages we shouldn't see my $pageLineage = $asset->get("lineage"); next if ($pageLineage =~ m/^$lineageToSkip/); if ($asset->get("isHidden") && !$self->get("showHiddenPages")) { $lineageToSkip = $pageLineage unless ($pageLineage eq "000001"); next; } if ($asset->get("isSystem") && !$self->get("showSystemPages")) { $lineageToSkip = $pageLineage unless ($pageLineage eq "000001"); next; } unless ($self->get("showUnprivilegedPages") || $asset->canView) { $lineageToSkip = $pageLineage unless ($pageLineage eq "000001"); next; } my $pageData = {}; foreach my $property (@interestingProperties) { $pageData->{"page.".$property} = $asset->get($property); } $pageData->{'page.menuTitle'} = $asset->getMenuTitle; $pageData->{'page.title'} = $asset->getTitle; # build nav variables $pageData->{"page.rank"} = $asset->getRank; $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"} = ( $pageLineage =~ m/^$currentLineage/ && !$pageData->{"page.isCurrent"}); $pageData->{"page.isAncestor"} = ( $currentLineage =~ m/^$pageLineage/ && !$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; $pageData->{"page.depthDiff"} = $depthDiff; $pageData->{"page.depthDiffIs".$depthDiff} = 1; if ($depthDiff > 0) { push(@{$pageData->{"page.depthDiff_loop"}},{}) for(1..$depthDiff); } $absoluteDepthOfLastPage = $pageData->{"page.absDepth"}; $pageData->{"page.hasChild"} = $asset->hasChildren; ++$var->{"currentPage.hasSibling"} if $pageData->{"page.isSibling"}; ++$var->{"currentPage.hasViewableSiblings"} if ($pageData->{"page.isSibling"} && $pageData->{"isViewable"}); ++$var->{"currentPage.hasViewableChildren"} if ($pageData->{"page.isChild"} && $pageData->{"isViewable"}); my $parent = $asset->getParent; if (defined $parent) { foreach my $property (@interestingProperties) { $pageData->{"page.parent.".$property} = $parent->get($property); } $pageData->{'page.parent.menuTitle'} = $parent->getMenuTitle; $pageData->{'page.parent.title'} = $parent->getTitle; $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 eq $parentsFirstChild->getId); } my $parentsLastChild = $parent->getLastChild; if (defined $parentsLastChild) { $pageData->{"page.isRankedLast"} = ($asset->getId eq $parentsLastChild->getId); } } push(@{$var->{page_loop}}, $pageData); } return $self->processTemplate($var,$self->get("templateId")); } #------------------------------------------------------------------- sub www_edit { my $self = shift; return WebGUI::Privilege::insufficient() unless $self->canEdit; $self->getAdminConsole->setHelp("navigation add/edit","Navigation"); return $self->getAdminConsole->render($self->getEditForm->print,WebGUI::International::get("22","Asset_Navigation")); } #------------------------------------------------------------------- sub www_goBackToPage { my $self = shift; WebGUI::HTTP::setRedirect($session{form}{returnUrl}) if ($session{form}{returnUrl}); return ""; } #------------------------------------------------------------------- # 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(
Configuration Output
Identifier: $session{form}{identifier}
startAt: $session{form}{startAt}
method: $session{form}{method}
stopAtLevel: $session{form}{stopAtLevel}
depth: $session{form}{depth}
templateId: $session{form}{templateId}
reverse: $session{form}{'reverse'}
showSystemPages: $session{form}{showSystemPages}
showHiddenPages: $session{form}{showHiddenPages}
showUnprivilegedPages: $session{form}{showUnprivilegedPages}
) . $nav->build . 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;