diff --git a/code/model/VirtualPage.php b/code/model/VirtualPage.php
index d300a038..b2ae015e 100644
--- a/code/model/VirtualPage.php
+++ b/code/model/VirtualPage.php
@@ -458,6 +458,22 @@ class VirtualPage extends Page {
if(parent::hasMethod($method)) return true;
return $this->copyContentFrom()->hasMethod($method);
}
+
+ /**
+ * Return the "casting helper" (a piece of PHP code that when evaluated creates a casted value object) for a field
+ * on this object.
+ *
+ * @param string $field
+ * @return string
+ */
+ public function castingHelper($field) {
+ if($this->copyContentFrom()) {
+ return $this->copyContentFrom()->castingHelper($field);
+ } else {
+ return parent::castingHelper($field);
+ }
+ }
+
}
/**
diff --git a/javascript/CMSMain.EditForm.js b/javascript/CMSMain.EditForm.js
index 6e485750..fecce745 100644
--- a/javascript/CMSMain.EditForm.js
+++ b/javascript/CMSMain.EditForm.js
@@ -118,7 +118,7 @@
// update button
updateURLFromTitle = $('', {
'class': 'update ss-ui-button-small',
- 'text': 'Update URL',
+ 'text': ss.i18n._t('URLSEGMENT.UpdateURL'),
'click': function(e) {
e.preventDefault();
self.updateURLSegment(self.val());
diff --git a/javascript/lang/en.js b/javascript/lang/en.js
index da250d33..366e3aea 100644
--- a/javascript/lang/en.js
+++ b/javascript/lang/en.js
@@ -40,7 +40,8 @@ if(typeof(ss) == 'undefined' || typeof(ss.i18n) == 'undefined') {
"CMSMain.RollbackToVersion": "Do you really want to roll back to version #%s of this page?",
"URLSEGMENT.Edit": "Edit",
"URLSEGMENT.OK": "OK",
- "URLSEGMENT.Cancel": "Cancel"
+ "URLSEGMENT.Cancel": "Cancel",
+ "URLSEGMENT.UpdateURL": "Update URL"
}
);
}
\ No newline at end of file
diff --git a/javascript/lang/src/en.js b/javascript/lang/src/en.js
index 0e15de4d..ee521b58 100644
--- a/javascript/lang/src/en.js
+++ b/javascript/lang/src/en.js
@@ -35,5 +35,6 @@
"CMSMain.RollbackToVersion": "Do you really want to roll back to version #%s of this page?",
"URLSEGMENT.Edit": "Edit",
"URLSEGMENT.OK": "OK",
- "URLSEGMENT.Cancel": "Cancel"
+ "URLSEGMENT.Cancel": "Cancel",
+ "URLSEGMENT.UpdateURL": "Update URL"
}
diff --git a/javascript/lang/src/sv.js b/javascript/lang/src/sv.js
index c1a60e2b..2634e8c5 100644
--- a/javascript/lang/src/sv.js
+++ b/javascript/lang/src/sv.js
@@ -26,14 +26,14 @@
"AssetAdmin.ConfirmDelete": "Vill du verkligen radera denna mapp och alla filer i den?",
"Folder.Name": "Mappnamn",
"Tree.AddSubPage": "Lägg till ny sida här",
- "Tree.Duplicate": "Duplicate",
- "Tree.EditPage": "Editera",
- "Tree.ThisPageOnly": "This page only",
- "Tree.ThisPageAndSubpages": "This page and subpages",
- "Tree.ShowAsList": "Show children as list",
+ "Tree.Duplicate": "Duplicera",
+ "Tree.EditPage": "Redigera",
+ "Tree.ThisPageOnly": "Endast denna sida",
+ "Tree.ThisPageAndSubpages": "Denna sida och undersidor",
+ "Tree.ShowAsList": "Visa undersidor som lista",
"CMSMain.ConfirmRestoreFromLive": "Vill du verkligen kopiera det publicerade innehållet till utkastsajten?",
"CMSMain.RollbackToVersion": "Vill du verkligen gå tillbaka till version %s av denna sida?",
- "URLSEGMENT.Edit": "Edit",
+ "URLSEGMENT.Edit": "Redigera",
"URLSEGMENT.OK": "OK",
- "URLSEGMENT.Cancel": "Cancel"
+ "URLSEGMENT.Cancel": "Avbryt"
}
\ No newline at end of file
diff --git a/javascript/lang/sv.js b/javascript/lang/sv.js
index 3760a5a8..f46a7a51 100644
--- a/javascript/lang/sv.js
+++ b/javascript/lang/sv.js
@@ -31,15 +31,15 @@ if(typeof(ss) == 'undefined' || typeof(ss.i18n) == 'undefined') {
"AssetAdmin.ConfirmDelete": "Vill du verkligen radera denna mapp och alla filer i den?",
"Folder.Name": "Mappnamn",
"Tree.AddSubPage": "Lägg till ny sida här",
- "Tree.Duplicate": "Duplicate",
- "Tree.EditPage": "Editera",
- "Tree.ThisPageOnly": "This page only",
- "Tree.ThisPageAndSubpages": "This page and subpages",
- "Tree.ShowAsList": "Show children as list",
+ "Tree.Duplicate": "Duplicera",
+ "Tree.EditPage": "Redigera",
+ "Tree.ThisPageOnly": "Endast denna sida",
+ "Tree.ThisPageAndSubpages": "Denna sida och undersidor",
+ "Tree.ShowAsList": "Visa undersidor som lista",
"CMSMain.ConfirmRestoreFromLive": "Vill du verkligen kopiera det publicerade innehållet till utkastsajten?",
"CMSMain.RollbackToVersion": "Vill du verkligen gå tillbaka till version %s av denna sida?",
- "URLSEGMENT.Edit": "Edit",
+ "URLSEGMENT.Edit": "Redigera",
"URLSEGMENT.OK": "OK",
- "URLSEGMENT.Cancel": "Cancel"
+ "URLSEGMENT.Cancel": "Avbryt"
});
}
\ No newline at end of file
diff --git a/lang/sv.yml b/lang/sv.yml
index a0e3b69c..3e1cf47d 100644
--- a/lang/sv.yml
+++ b/lang/sv.yml
@@ -5,7 +5,9 @@ sv:
AppCategoryArchive: Arkivera
AppCategoryAudio: Ljud
AppCategoryDocument: Dokument
+ AppCategoryFlash: Flash
AppCategoryImage: Bild
+ AppCategoryVideo: Video
BackToFolder: 'Tillbaka till mappen'
CREATED: Datum
CurrentFolderOnly: 'Begränsa till aktuell mapp?'
@@ -43,6 +45,7 @@ sv:
ColumnDateLastModified: 'Datum vid senaste modifiering'
ColumnDateLastPublished: 'Datum vid senaste publicering'
ColumnProblemType: 'Problemtyp'
+ ColumnURL: URL
HasBrokenFile: 'har trasig fil'
HasBrokenLink: 'har trasig länk'
HasBrokenLinkAndFile: 'har trasig länk och fil'
@@ -72,6 +75,7 @@ sv:
AddNew: 'Skapa ny sida'
AddNewButton: 'Skapa ny'
AddPageRestriction: 'OBS: Vissa sidtyper är inte tillåtna här'
+ Cancel: Avbryt
ChoosePageParentMode: 'Välj var du vill skapa denna sida'
ChoosePageType: 'Välj sidtyp'
Create: Skapa
@@ -124,6 +128,7 @@ sv:
SHOWUNPUBLISHED: 'Visa opublicerade versioner'
SHOWVERSION: 'Visa version'
VIEW: Titta på
+ VIEWINGLATEST: 'Nu visas den senaste versionen.'
VIEWINGVERSION: 'Nu visas version {version}.'
MENUTITLE: Historia
CMSPageHistoryController_versions_ss:
@@ -139,6 +144,8 @@ sv:
TreeView: 'Trädvy'
CMSPagesController_ContentToolbar_ss:
MULTISELECT: Flerval
+ CMSPagesController_Tools_ss:
+ FILTER: Filter
CMSSearch:
FILTERDATEFROM: Från
FILTERDATEHEADING: Datum
@@ -155,6 +162,7 @@ sv:
ContentController:
ARCHIVEDSITE: 'Utkast version'
ARCHIVEDSITEFROM: 'Arkiverad sajt från'
+ CMS: CMS
DRAFT: Utkast
DRAFTSITE: 'Utkast'
DRAFT_SITE_ACCESS_RESTRICTION: 'Du måste logga med ditt CMS-lösenord för att kunna se utkast och arkiverat material. Klicka här för att gå tillbaks till den publicerade sajten.'
@@ -192,6 +200,8 @@ sv:
415: '415 - Mediatypen stöds inte'
416: '416 - Det efterfrågade intervallet går inte att leverera'
417: '417 - Förväntningen gick inte att infria'
+ 422: '422 - Obehandlingsbar entitet'
+ 429: '429 - För många anrop'
500: '500 - Internt serverfel'
501: '501 - Inte implementerad'
502: '502 - Felaktig gateway'
@@ -262,6 +272,7 @@ sv:
SilverStripeNavigator:
ARCHIVED: Arkiverad
SilverStripeNavigatorLink:
+ ShareInstructions: 'Kopiera och klistra in länken nedan för att dela den här sidan.'
ShareLink: 'Dela länk'
SilverStripeNavigatorLinkl:
CloseLink: Stäng
@@ -310,6 +321,7 @@ sv:
DEPENDENT_NOTE: 'Följande sidor berörs av den här sidan. Inklusive virtuella sidor, omdirigeringssidor, och sidor med innehållslänkar.'
DESCRIPTION: 'Generisk innehållssida'
DependtPageColumnLinkType: 'Länktyp'
+ DependtPageColumnURL: URL
EDITANYONE: 'Alla som kan logga in'
EDITHEADER: 'Vem kan redigera den här sidan?'
EDITONLYTHESE: 'Bara de här (välj från listan)'
@@ -332,6 +344,7 @@ sv:
METAEXTRAHELP: 'HTML taggar för övrig meta information. Till exempel <meta name="Namn" content="innehållet kommer här" />'
MODIFIEDONDRAFTHELP: 'Sidan har ej publicerade ändringar'
MODIFIEDONDRAFTSHORT: Ändrad
+ MetadataToggle: Metadata
MoreOptions: 'Fler alternativ'
NOTPUBLISHED: 'Ej publicerad'
OBSOLETECLASS: 'Denna sida är den föråldrade typen {type}. Att spara kommer att återställa dess typ och du kan förlora data'
@@ -375,12 +388,19 @@ sv:
SiteTreeURLSegmentField:
EMPTY: 'Ange ett URL-segment eller klicka på avbryt'
HelpChars: 'Specialtecken konverteras eller tas bort'
+ URLSegmentField:
+ Cancel: Avbryt
+ Edit: Redigera
+ OK: OK
ViewArchivedEmail_ss:
CANACCESS: 'Du kan komma åt den arkiverade sajten med denna länk:'
HAVEASKED: 'Du har efterfrågat att se innehållet på vår sajt på'
VirtualPage:
+ CHOOSE: 'Länkad sida'
DESCRIPTION: 'Visar innehåll från en annan sida'
+ EditLink: redigera
HEADER: 'Det här är en virutell sida'
+ HEADERWITHLINK: 'Det här är en virtuell sida som kopierar innehållet från "{title}" ({link})'
PLURALNAME: 'Virtuella sidor'
PageTypNotAllowedOnRoot: 'Ursprungliga sidan av typ "{type}" tillåts inte på rotnivå för denna virtuella sida'
SINGULARNAME: 'Virtuell sida'
@@ -392,3 +412,9 @@ sv:
MENUTITLE: 'Redigera sida'
CMSSettingsController:
MENUTITLE: Inställningar
+ CMSSiteTreeFilter_StatusDeletedPages:
+ Title: 'Raderade sidor'
+ CMSSiteTreeFilter_StatusDraftPages:
+ Title: 'Ej publicerade utkast'
+ CMSSiteTreeFilter_StatusRemovedFromDraftPages:
+ Title: 'Live men borttagen från utkast'
diff --git a/tests/model/VirtualPageTest.php b/tests/model/VirtualPageTest.php
index 5b61e2c0..c6de5b96 100644
--- a/tests/model/VirtualPageTest.php
+++ b/tests/model/VirtualPageTest.php
@@ -591,6 +591,19 @@ class VirtualPageTest extends SapphireTest {
'No field copying from previous original after page type changed'
);
}
+
+ public function testVirtualPageFindsCorrectCasting() {
+ $page = new VirtualPageTest_ClassA();
+ $page->CastingTest = "Some content";
+ $page->write();
+ $virtual = new VirtualPage();
+ $virtual->CopyContentFromID = $page->ID;
+ $virtual->write();
+
+ $this->assertEquals('VirtualPageTest_TestDBField', $virtual->castingHelper('CastingTest'));
+ $this->assertEquals('SOME CONTENT', $virtual->obj('CastingTest')->forTemplate());
+ }
+
}
class VirtualPageTest_ClassA extends Page implements TestOnly {
@@ -599,6 +612,7 @@ class VirtualPageTest_ClassA extends Page implements TestOnly {
'MyInitiallyCopiedField' => 'Text',
'MyVirtualField' => 'Text',
'MyNonVirtualField' => 'Text',
+ 'CastingTest' => 'VirtualPageTest_TestDBField'
);
private static $allowed_children = array('VirtualPageTest_ClassB');
@@ -616,6 +630,12 @@ class VirtualPageTest_NotRoot extends Page implements TestOnly {
private static $can_be_root = false;
}
+class VirtualPageTest_TestDBField extends Varchar implements TestOnly {
+ public function forTemplate() {
+ return strtoupper($this->XML());
+ }
+}
+
class VirtualPageTest_VirtualPageSub extends VirtualPage implements TestOnly {
private static $db = array(
'MyProperty' => 'Varchar',