Merge commit '41575d24bb' into webgui8. Some tests still failing.
Conflicts: docs/gotcha.txt lib/WebGUI.pm lib/WebGUI/Asset.pm lib/WebGUI/Asset/File/GalleryFile/Photo.pm lib/WebGUI/Asset/Post.pm lib/WebGUI/Asset/Template.pm lib/WebGUI/Asset/WikiPage.pm lib/WebGUI/Asset/Wobject/WikiMaster.pm lib/WebGUI/Cache.pm lib/WebGUI/Content/Setup.pm lib/WebGUI/Role/Asset/Subscribable.pm lib/WebGUI/Shop/Cart.pm lib/WebGUI/Shop/Pay.pm lib/WebGUI/Shop/PayDriver/ITransact.pm sbin/testEnvironment.pl t/Asset/WikiPage.t t/Shop/PayDriver.t t/Shop/PayDriver/ITransact.t t/Shop/PayDriver/Ogone.t t/Shop/TaxDriver/EU.t t/Shop/TaxDriver/Generic.t t/Workflow/Activity/RemoveOldCarts.t t/lib/WebGUI/Test.pm
This commit is contained in:
commit
5febc0ebbc
258 changed files with 5528 additions and 2230 deletions
|
|
@ -181,6 +181,14 @@ property filterCode => (
|
|||
label => ['filter code', 'Asset_WikiMaster'],
|
||||
hoverHelp => ['filter code description', 'Asset_WikiMaster'],
|
||||
);
|
||||
property topLevelKeywords => (
|
||||
fieldType => "keywords",
|
||||
default => '',
|
||||
tab => 'properties',
|
||||
label => ['top level keywords', 'Asset_WikiMaster'],
|
||||
hoverHelp => ['top level keywords description', 'Asset_WikiMaster'],
|
||||
);
|
||||
|
||||
with 'WebGUI::Role::Asset::Subscribable';
|
||||
with 'WebGUI::Role::Asset::RssFeed';
|
||||
|
||||
|
|
@ -213,13 +221,12 @@ sub appendFeaturedPageVars {
|
|||
|
||||
=head2 appendKeywordPageVars ( var )
|
||||
|
||||
Append the template variables to C<var> for keyword (catagory) pages.
|
||||
Append the template variables to C<var> for keyword (category) pages.
|
||||
|
||||
=cut
|
||||
|
||||
sub appendKeywordPageVars {
|
||||
my ( $self, $var ) = @_;
|
||||
my $session = $self->session;
|
||||
my $topKeywords = $self->getTopLevelKeywordsList;
|
||||
my $keywordHierarchy = $self->getKeywordHierarchy( $topKeywords, );
|
||||
$var->{keywords_loop} = $self->getKeywordVariables( $keywordHierarchy );
|
||||
|
|
@ -228,6 +235,7 @@ sub appendKeywordPageVars {
|
|||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
|
||||
=head2 appendMostPopular ($var, [ $limit ])
|
||||
|
||||
=head3 $var
|
||||
|
|
@ -242,10 +250,10 @@ If passed in, this will override the mostPopularCount set in the object.
|
|||
=cut
|
||||
|
||||
sub appendMostPopular {
|
||||
my $self = shift;
|
||||
my $var = shift;
|
||||
my $limit = shift || $self->mostPopularCount;
|
||||
foreach my $asset (@{$self->getLineage(["children"],{returnObjects=>1, limit=>$limit, includeOnlyClasses=>["WebGUI::Asset::WikiPage"]})}) {
|
||||
my $self = shift;
|
||||
my $var = shift;
|
||||
my $limit = shift || $self->get("mostPopularCount");
|
||||
foreach my $asset (@{$self->getLineage(["children"],{returnObjects=>1, limit=>$limit, includeOnlyClasses=>["WebGUI::Asset::WikiPage"], joinClass => 'WebGUI::Asset::WikiPage', orderByClause => 'WikiPage.views DESC'})}) {
|
||||
if (defined $asset) {
|
||||
push(@{$var->{mostPopular}}, {
|
||||
title=>$asset->getTitle,
|
||||
|
|
@ -461,177 +469,20 @@ sub canEditPages {
|
|||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
sub definition {
|
||||
my $class = shift;
|
||||
my $session = shift;
|
||||
my $definition = shift;
|
||||
my $i18n = WebGUI::International->new($session, 'Asset_WikiMaster');
|
||||
|
||||
my %properties;
|
||||
tie %properties, 'Tie::IxHash';
|
||||
%properties =
|
||||
(
|
||||
groupToEditPages => { fieldType => 'group',
|
||||
defaultValue => ['2'],
|
||||
tab => 'security',
|
||||
hoverHelp => $i18n->get('groupToEditPages hoverHelp'),
|
||||
label => $i18n->get('groupToEditPages label') },
|
||||
=head2 deleteSubKeywords ( $keyword )
|
||||
|
||||
groupToAdminister => { fieldType => 'group',
|
||||
defaultValue => ['3'],
|
||||
tab => 'security',
|
||||
hoverHelp => $i18n->get('groupToAdminister hoverHelp'),
|
||||
label => $i18n->get('groupToAdminister label') },
|
||||
Delete all keywords that are associated with a particular keyword for this wiki.
|
||||
|
||||
richEditor => { fieldType => 'selectRichEditor',
|
||||
defaultValue => 'PBrichedit000000000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('richEditor hoverHelp'),
|
||||
label => $i18n->get('richEditor label') },
|
||||
=head3 $keyword
|
||||
|
||||
frontPageTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiMaster_front',
|
||||
defaultValue => 'WikiFrontTmpl000000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('frontPageTemplateId hoverHelp'),
|
||||
label => $i18n->get('frontPageTemplateId label') },
|
||||
The main keyword to key off of.
|
||||
|
||||
pageTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiPage',
|
||||
defaultValue => 'WikiPageTmpl0000000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('pageTemplateId hoverHelp'),
|
||||
label => $i18n->get('pageTemplateId label') },
|
||||
=cut
|
||||
|
||||
pageHistoryTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiPage_pageHistory',
|
||||
defaultValue => 'WikiPHTmpl000000000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('pageHistoryTemplateId hoverHelp'),
|
||||
label => $i18n->get('pageHistoryTemplateId label') },
|
||||
|
||||
mostPopularTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiMaster_mostPopular',
|
||||
defaultValue => 'WikiMPTmpl000000000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('mostPopularTemplateId hoverHelp'),
|
||||
label => $i18n->get('mostPopularTemplateId label') },
|
||||
|
||||
recentChangesTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiMaster_recentChanges',
|
||||
defaultValue => 'WikiRCTmpl000000000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('recentChangesTemplateId hoverHelp'),
|
||||
label => $i18n->get('recentChangesTemplateId label') },
|
||||
|
||||
byKeywordTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiMaster_byKeyword',
|
||||
defaultValue => 'WikiKeyword00000000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('byKeywordTemplateId hoverHelp'),
|
||||
label => $i18n->get('byKeywordTemplateId label') },
|
||||
|
||||
searchTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiMaster_search',
|
||||
defaultValue => 'WikiSearchTmpl00000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('searchTemplateId hoverHelp'),
|
||||
label => $i18n->get('searchTemplateId label') },
|
||||
|
||||
pageEditTemplateId => { fieldType => 'template',
|
||||
namespace => 'WikiPage_edit',
|
||||
defaultValue => 'WikiPageEditTmpl000001',
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('pageEditTemplateId hoverHelp'),
|
||||
label => $i18n->get('pageEditTemplateId label') },
|
||||
|
||||
recentChangesCount => { fieldType => 'integer',
|
||||
defaultValue => 50,
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('recentChangesCount hoverHelp'),
|
||||
label => $i18n->get('recentChangesCount label') },
|
||||
|
||||
recentChangesCountFront => { fieldType => 'integer',
|
||||
defaultValue => 10,
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('recentChangesCountFront hoverHelp'),
|
||||
label => $i18n->get('recentChangesCountFront label') },
|
||||
|
||||
mostPopularCount => { fieldType => 'integer',
|
||||
defaultValue => 50,
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('mostPopularCount hoverHelp'),
|
||||
label => $i18n->get('mostPopularCount label') },
|
||||
|
||||
mostPopularCountFront => { fieldType => 'integer',
|
||||
defaultValue => 10,
|
||||
tab => 'display',
|
||||
hoverHelp => $i18n->get('mostPopularCountFront hoverHelp'),
|
||||
label => $i18n->get('mostPopularCountFront label') },
|
||||
approvalWorkflow =>{
|
||||
fieldType=>"workflow",
|
||||
defaultValue=>"pbworkflow000000000003",
|
||||
type=>'WebGUI::VersionTag',
|
||||
tab=>'security',
|
||||
label=>$i18n->get('approval workflow'),
|
||||
hoverHelp=>$i18n->get('approval workflow description'),
|
||||
},
|
||||
thumbnailSize => {
|
||||
fieldType => "integer",
|
||||
defaultValue => 0,
|
||||
tab => "display",
|
||||
label => $i18n->get("thumbnail size"),
|
||||
hoverHelp => $i18n->get("thumbnail size help")
|
||||
},
|
||||
maxImageSize => {
|
||||
fieldType => "integer",
|
||||
defaultValue => 0,
|
||||
tab => "display",
|
||||
label => $i18n->get("max image size"),
|
||||
hoverHelp => $i18n->get("max image size help")
|
||||
},
|
||||
allowAttachments => {
|
||||
fieldType => "integer",
|
||||
defaultValue => 0,
|
||||
tab => "security",
|
||||
label => $i18n->get("allow attachments"),
|
||||
hoverHelp => $i18n->get("allow attachments help"),
|
||||
},
|
||||
useContentFilter =>{
|
||||
fieldType=>"yesNo",
|
||||
defaultValue=>1,
|
||||
tab=>'display',
|
||||
label=>$i18n->get('content filter'),
|
||||
hoverHelp=>$i18n->get('content filter description'),
|
||||
},
|
||||
filterCode =>{
|
||||
fieldType=>"filterContent",
|
||||
defaultValue=>'javascript',
|
||||
tab=>'security',
|
||||
label=>$i18n->get('filter code'),
|
||||
hoverHelp=>$i18n->get('filter code description'),
|
||||
},
|
||||
topLevelKeywords =>{
|
||||
fieldType => "keywords",
|
||||
defaultValue => '',
|
||||
tab => 'properties',
|
||||
label => $i18n->get('top level keywords'),
|
||||
hoverHelp => $i18n->get('top level keywords description'),
|
||||
},
|
||||
);
|
||||
|
||||
push @$definition,
|
||||
{
|
||||
assetName => $i18n->get('assetName'),
|
||||
icon => 'wikiMaster.gif',
|
||||
autoGenerateForms => 1,
|
||||
tableName => 'WikiMaster',
|
||||
className => 'WebGUI::Asset::Wobject::WikiMaster',
|
||||
properties => \%properties,
|
||||
};
|
||||
|
||||
return $class->next::method($session, $definition);
|
||||
>>>>>>> 808a866c8b2a426e4958d38c34e8753a8555fc90
|
||||
sub deleteSubKeywords {
|
||||
my ( $self, $keyword ) = @_;
|
||||
return $self->session->db->write('delete from WikiMasterKeywords where assetId=? and keyword=?', [$self->getId, $keyword]);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
|
@ -664,14 +515,15 @@ The hierarchy data structure that looks like this:
|
|||
|
||||
[
|
||||
{
|
||||
title => 'title', # same as the keyword, since this is a keyword (category) page
|
||||
url => 'url', # url from the keyword page, via getUrl so it contains the gateway URL
|
||||
# If a keyword page does not exist for the keyword, this key/value pair will not be present.
|
||||
children => [ # Array reference of sub-categories referenced by this category
|
||||
{ # If there are no children, this key/value pair will not be present
|
||||
keyword => 'keyword', # same as the keyword, since this is a keyword (category) page
|
||||
url => 'url', # url from the keyword page, via getUrl so it contains the gateway URL
|
||||
children => [ # Array reference of sub-categories referenced by this category
|
||||
{ # If there are no children, this key/value pair will not be present
|
||||
...
|
||||
}
|
||||
]
|
||||
],
|
||||
descendants => 25, # The total number of wiki pages that this keyword, and any other sub-keywords
|
||||
# of this keyword, refer to.
|
||||
}
|
||||
]
|
||||
|
||||
|
|
@ -693,25 +545,21 @@ sub getKeywordHierarchy {
|
|||
my $hierarchy = [];
|
||||
$keywords ||= $self->getTopLevelKeywordsList;
|
||||
$seen ||= {};
|
||||
my $assetKeyword = WebGUI::Keyword->new($session);
|
||||
KEYWORD: foreach my $keyword (sort @{ $keywords }) {
|
||||
my $page = $self->getLineage(['children'], {
|
||||
returnObjects => 1,
|
||||
whereClause => 'assetData.title = '.$session->db->quote($keyword),
|
||||
limit => 1,
|
||||
includeOnlyClasses => [qw/WebGUI::Asset::WikiPage/],
|
||||
})->[0];
|
||||
if (! $page) {
|
||||
push @{ $hierarchy }, { title => $keyword, url => '', };
|
||||
next KEYWORD;
|
||||
}
|
||||
my $datum = {
|
||||
title => $keyword, ##Note, same as keyword
|
||||
url => $page->getUrl,
|
||||
title => $keyword, ##Note, same as keyword
|
||||
url => $self->getUrl('func=byKeyword;keyword='.$keyword),
|
||||
descendants => scalar @{ $assetKeyword->getMatchingAssets( { startAsset => $self, keyword => $keyword, }) },
|
||||
};
|
||||
##Prevent recursion if seen again
|
||||
if (! $seen->{$keyword}++) {
|
||||
my $children = $self->getKeywordHierarchy(WebGUI::Keyword::string2list($page->get('keywords')), $seen, );
|
||||
##Replace this with a call to getSubKeywords.
|
||||
my $children = $self->getKeywordHierarchy($self->getSubKeywords($keyword), $seen, );
|
||||
if (@{ $children } ) {
|
||||
foreach my $child (@{ $children }) {
|
||||
$datum->{descendants} += $child->{descendants};
|
||||
}
|
||||
$datum->{children} = $children;
|
||||
}
|
||||
}
|
||||
|
|
@ -722,6 +570,26 @@ sub getKeywordHierarchy {
|
|||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 getSubKeywords ( $keyword )
|
||||
|
||||
Return all keywords that are associated with a particular keyword for this wiki.
|
||||
|
||||
=head3 $keyword
|
||||
|
||||
The main keyword to key off of.
|
||||
|
||||
=cut
|
||||
|
||||
sub getSubKeywords {
|
||||
my ( $self, $keyword ) = @_;
|
||||
return $self->session->db->buildArrayRef(
|
||||
'select subKeyword from WikiMasterKeywords where assetId=? and keyword=?',
|
||||
[$self->getId, $keyword]
|
||||
);
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 getKeywordVariables ( $hierarchy, $level )
|
||||
|
||||
Take a data structure representing a hierarchy of keywords, and append template variables
|
||||
|
|
@ -745,6 +613,7 @@ sub getKeywordVariables {
|
|||
KEYWORD: foreach my $member (@{ $hierarchy }) {
|
||||
my $varBlock = clone $member;
|
||||
$varBlock->{level} = $level;
|
||||
$varBlock->{isTopLevel} = $level == 0;
|
||||
$varBlock->{indent_loop} = [ map { { indent => $_ } } 1..$level ];
|
||||
delete $varBlock->{children};
|
||||
push @{$variables}, $varBlock;
|
||||
|
|
@ -877,6 +746,48 @@ sub processPropertiesFromFormPost {
|
|||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 purge
|
||||
|
||||
Extend the master method to delete all keyword entries.
|
||||
|
||||
=cut
|
||||
|
||||
sub purge {
|
||||
my $self = shift;
|
||||
$self->session->db->write('delete from WikiMasterKeywords where assetId=?',[$self->getId]);
|
||||
return $self->SUPER::purge;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 setSubKeywords ( $keyword, @keywords )
|
||||
|
||||
Store the set of keywords for this WikiMaster in the db. Returns true.
|
||||
|
||||
=head3 $keyword
|
||||
|
||||
The keyword that gets the new keywords.
|
||||
|
||||
=head3 @keywords
|
||||
|
||||
The new set of keywords.
|
||||
|
||||
=cut
|
||||
|
||||
sub setSubKeywords {
|
||||
my ( $self, $keyword, @subKeywords ) = @_;
|
||||
$self->deleteSubKeywords($keyword);
|
||||
my $stuffIt = $self->session->db->prepare('insert into WikiMasterKeywords (assetId, keyword, subKeyword) values (?,?,?)');
|
||||
KEYWORD: foreach my $subKeyword (@subKeywords) {
|
||||
next unless $keyword;
|
||||
$stuffIt->execute([$self->getId, $keyword, $subKeyword]);
|
||||
}
|
||||
$stuffIt->finish;
|
||||
return 1;
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 shouldSkipNotification ( )
|
||||
|
||||
WikiMasters do not send notification
|
||||
|
|
@ -933,30 +844,55 @@ Return search results that match the keyword from the form variable C<keyword>.
|
|||
=cut
|
||||
|
||||
sub www_byKeyword {
|
||||
my $self = shift;
|
||||
my $keyword = $self->session->form->process("keyword");
|
||||
my @pages = ();
|
||||
my $p = WebGUI::Keyword->new($self->session)->getMatchingAssets({
|
||||
my $self = shift;
|
||||
my $session = $self->session;
|
||||
my $keyword = $session->form->process("keyword");
|
||||
|
||||
my $p = WebGUI::Keyword->new($session)->getMatchingAssets({
|
||||
startAsset => $self,
|
||||
keyword => $keyword,
|
||||
usePaginator => 1,
|
||||
});
|
||||
});
|
||||
$p->setBaseUrl($self->getUrl("func=byKeyword;keyword=".$keyword));
|
||||
|
||||
my @pages = ();
|
||||
foreach my $assetData (@{$p->getPageData}) {
|
||||
my $asset = WebGUI::Asset->newById($self->session, $assetData->{assetId});
|
||||
next unless defined $asset;
|
||||
push(@pages, {
|
||||
title => $asset->getTitle,
|
||||
url => $asset->getUrl,
|
||||
title => $asset->getTitle,
|
||||
url => $asset->getUrl,
|
||||
synopsis => $asset->get('synopsis'),
|
||||
});
|
||||
}
|
||||
@pages = sort { lc($a->{title}) cmp lc($b->{title}) } @pages;
|
||||
my $var = {
|
||||
keyword => $keyword,
|
||||
pagesLoop => \@pages,
|
||||
};
|
||||
keyword => $keyword,
|
||||
pagesLoop => \@pages,
|
||||
canAdminister => $self->canAdminister,
|
||||
recentChangesUrl => $self->getUrl("func=recentChanges"),
|
||||
mostPopularUrl => $self->getUrl("func=mostPopular"),
|
||||
wikiHomeUrl => $self->getUrl,
|
||||
};
|
||||
$p->appendTemplateVars($var);
|
||||
return $self->processStyle($self->processTemplate($var, $self->byKeywordTemplateId));
|
||||
|
||||
my $subKeywords = $self->getSubKeywords($keyword);
|
||||
my $keywordHierarchy = $self->getKeywordHierarchy($subKeywords);
|
||||
$var->{keywords_loop} = $self->getKeywordVariables($keywordHierarchy);
|
||||
|
||||
if ($var->{canAdminister}) {
|
||||
$var->{formHeader} = WebGUI::Form::formHeader($session, {action => $self->getUrl})
|
||||
. WebGUI::Form::hidden($session, { name => 'func', value => 'subKeywordSave',})
|
||||
. WebGUI::Form::hidden($session, { name => 'keyword', value => $keyword,});
|
||||
my $subKeywords = join ', ', @{ $self->getSubKeywords($keyword) };
|
||||
$var->{keywordForm} = WebGUI::Form::keywords($session, {
|
||||
name => 'subKeywords',
|
||||
value => $session->form->get('subKeywords') || $subKeywords,
|
||||
});
|
||||
$var->{submitForm} = WebGUI::Form::submit($session, {});
|
||||
$var->{formFooter} = WebGUI::Form::formFooter($session);
|
||||
}
|
||||
return $self->processStyle($self->processTemplate($var, $self->get('byKeywordTemplateId')));
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1061,5 +997,25 @@ sub www_search {
|
|||
return $self->processStyle($self->processTemplate($var, $self->searchTemplateId));
|
||||
}
|
||||
|
||||
#-------------------------------------------------------------------
|
||||
|
||||
=head2 www_subKeywordSave
|
||||
|
||||
Process the form from www_byKeyword and update the subkeywords for a keyword in this wiki.
|
||||
|
||||
=cut
|
||||
|
||||
sub www_subKeywordSave {
|
||||
my $self = shift;
|
||||
my $form = $self->session->form;
|
||||
|
||||
my $subKeywords = $form->process('subKeywords', 'keywords');
|
||||
my $keyword = $form->process('keyword');
|
||||
my @subKeywords = @{ WebGUI::Keyword::string2list($subKeywords) };
|
||||
$self->setSubKeywords($keyword, @subKeywords);
|
||||
|
||||
return $self->www_byKeyword;
|
||||
}
|
||||
|
||||
__PACKAGE__->meta->make_immutable;
|
||||
1;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue