diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index 82bb0717a..44036385b 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -1,4 +1,6 @@ 7.5.11 + - add: Assets can now inherit their parent's URL, prepended. Check the + meta tab. - rfe: Not being limited to single-worded Tags - SQL Form no longer ships with WebGUI. Use Thingy instead. However, out of respect for those using it, we only uninstall it if you have no sites using diff --git a/docs/upgrades/upgrade_7.5.10-7.5.11.pl b/docs/upgrades/upgrade_7.5.10-7.5.11.pl index 67f5ccd53..9a8475781 100644 --- a/docs/upgrades/upgrade_7.5.10-7.5.11.pl +++ b/docs/upgrades/upgrade_7.5.10-7.5.11.pl @@ -68,6 +68,7 @@ removeSqlForm($session); migratePaymentPlugins( $session ); removeRecurringPaymentActivity( $session ); addUserListWobject( $session ); +addInheritUrlFromParent( $session ); finish($session); # this line required @@ -1501,6 +1502,15 @@ sub addUserListWobject { } +#---------------------------------------------------------------------------- +# Add the inheritUrlFromParent property for all assets +sub addInheritUrlFromParent { + my $session = shift; + print "\tAdding inheritUrlFromParent flag for all assets..." unless $quiet; + $session->db->write('alter table assetData add column inheritUrlFromParent int(11) not null default 0'); + print "DONE!\n" unless $quiet; +} + # -------------- DO NOT EDIT BELOW THIS LINE -------------------------------- #---------------------------------------------------------------------------- diff --git a/lib/WebGUI/Asset.pm b/lib/WebGUI/Asset.pm index c4207d966..f41e2d0b0 100644 --- a/lib/WebGUI/Asset.pm +++ b/lib/WebGUI/Asset.pm @@ -461,6 +461,14 @@ sub definition { uiLevel=>9, fieldType=>'yesNo', defaultValue=>1, + }, + inheritUrlFromParent=>{ + tab=>'meta', + label=>$i18n->get('does asset inherit URL from parent'), + hoverHelp=>$i18n->get('does asset inherit URL from parent description'), + uiLevel=>9, + fieldType=>'yesNo', + defaultValue=>0, }, status=>{ noFormPost=>1, @@ -1971,6 +1979,11 @@ sub update { } # check the definition of all properties against what was given to us + + # get a DB object for the two tight inner loops below, and the description + my $db = $self->session->db; + my $assetDataDescription = $db->buildHashRef('describe assetData'); + foreach my $definition (reverse @{$self->definition($self->session)}) { my %setPairs = (); @@ -1987,13 +2000,48 @@ sub update { # database field for it exists. if not, setting it will break, so # skip it. this facilitates updating from previous versions. if($property eq 'isExportable') { - my $db = $self->session->db; - my $assetDataDescription = $db->buildHashRef('describe assetData'); unless(grep { $_ =~ /^isExportable/ } keys %{$assetDataDescription}) { next; } } + # similarly, if this is the new-to-7.5 inheritUrlFromParent field, + # do the same. + elsif($property eq 'inheritUrlFromParent') { + unless(grep { $_ =~ /^inheritUrlFromParent/ } keys %{$assetDataDescription}) { + next; + } + + next unless $properties->{inheritUrlFromParent} == 1; + + # if we're still here, we have the property in the DB. so process it. + # only prepend the URL once + my $parentUrl = $self->getParent->getUrl; + + # handle either being passed a new URL or updating the current one + my $currentUrl; + if(exists $properties->{url}) { + $currentUrl = $properties->{url}; + } + else { + $currentUrl = $self->getUrl; + } + + # if there's only one / then leave it alone. + unless($currentUrl =~ tr{/}{} == 1) { + $currentUrl =~ s{/[^/]+$}{}; + } + + # prepend if it's not a match + my $newUrl = $currentUrl; + if($currentUrl ne $parentUrl) { + $newUrl = $parentUrl . '/' . $currentUrl; + } + + # replace the non-prepended value in the properties hash with this value + $self->{_properties}{url} = $newUrl; + } + # use the update value my $value = $properties->{$property}; @@ -2266,6 +2314,11 @@ sub www_editSave { } } + # handle inheritsUrlFromParent field + #if($self->session->form->process('inheritsUrlFromParent') == 1) { + # $object->update( { url => $self->getUrl . '/' . $object->getUrl } ); + #} + $object->updateHistory("edited"); # Handle Save & Commit button diff --git a/lib/WebGUI/i18n/English/Asset.pm b/lib/WebGUI/i18n/English/Asset.pm index 31dce68f7..bce69d864 100644 --- a/lib/WebGUI/i18n/English/Asset.pm +++ b/lib/WebGUI/i18n/English/Asset.pm @@ -1048,6 +1048,16 @@ Couldn't open %-s because %-s
lastUpdated => 0, }, + 'does asset inherit URL from parent' => { + message => q|Prepend URL from parent?|, + lastUpdated => 1212183809, + }, + + 'does asset inherit URL from parent description' => { + message => q|

Will this asset have its URL prepended with its parent URL?

|, + lastUpdated => 1212183809, + }, + 'search' => { message => q{Search}, lastUpdated => 0, diff --git a/t/Asset/Asset.t b/t/Asset/Asset.t index c6ef2e5f2..998a05fc0 100644 --- a/t/Asset/Asset.t +++ b/t/Asset/Asset.t @@ -146,7 +146,7 @@ $canViewMaker->prepare( }, ); -plan tests => 94 +plan tests => 97 + scalar(@fixIdTests) + scalar(@fixTitleTests) + 2*scalar(@getTitleTests) #same tests used for getTitle and getMenuTitle @@ -738,6 +738,57 @@ $product1->purge; $product2->purge; $product3->purge; +################################################################ +# +# inheritUrlFromParent +# +################################################################ + +my $versionTag4 = WebGUI::VersionTag->getWorking($session); +$versionTag4->set( { name => 'inheritUrlFromParent tests' } ); + +$properties = { + # '1234567890123456789012' + id => 'inheritUrlFromParent01', + title => 'inheritUrlFromParent01', + className => 'WebGUI::Asset::Wobject::Layout', + url => 'inheriturlfromparent01', +}; + +my $iufpAsset = $defaultAsset->addChild($properties, $properties->{id}); +$iufpAsset->commit; + +$properties2 = { + # '1234567890123456789012' + id => 'inheritUrlFromParent02', + title => 'inheritUrlFromParent02', + className => 'WebGUI::Asset::Wobject::Layout', + url => 'inheriturlfromparent02', +}; + + +my $iufpAsset2 = $iufpAsset->addChild($properties2, $properties2->{id}); +$iufpAsset2->update( { inheritUrlFromParent => 1 } ); +is($iufpAsset2->getUrl, '/inheriturlfromparent01/inheriturlfromparent02', 'inheritUrlFromParent works'); + +# works for setting, now try disabling. Should not change the URL. +$iufpAsset2->update( { inheritUrlFromParent => 0 } ); +is($iufpAsset2->getUrl, '/inheriturlfromparent01/inheriturlfromparent02', 'setting inheritUrlFromParent to 0 works'); + +# works for setting and disabling, now ensure it recurses + +my $properties3 = { + # '1234567890123456789012' + id => 'inheritUrlFromParent03', + title => 'inheritUrlFromParent03', + className => 'WebGUI::Asset::Wobject::Layout', + url => 'inheriturlfromparent03', +}; +my $iufpAsset3 = $iufpAsset2->addChild($properties3, $properties3->{id}); +$iufpAsset2->update( { inheritUrlFromParent => 1 } ); +$iufpAsset3->update( { inheritUrlFromParent => 1 } ); +is($iufpAsset3->getUrl, '/inheriturlfromparent01/inheriturlfromparent02/inheriturlfromparent03', 'inheritUrlFromParent recurses properly'); + END { $session->config->set( 'extrasURL', $origExtras); @@ -756,7 +807,7 @@ END { else { $session->config->delete('assetUiLevel'); } - foreach my $vTag ($versionTag, $versionTag2, $versionTag3, ) { + foreach my $vTag ($versionTag, $versionTag2, $versionTag3, $versionTag4, ) { $vTag->rollback; } foreach my $user (values %testUsers) {