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) {