Komponenter som återges i en iframe har inte direktåtkomst till filen design.css. Istället finns det ett ytterligare steg för att hämta URL:en för design.css i komponenten och lägga till den på sidan. Du måste sedan uppdatera komponenten för att spegla det format som valts av användaren.
design.css ska kunna inkluderas och användas i komponenten krävs ändringar i filen render.html:
Leta reda på och inkludera URL:en till filen design.css
Hämta värdet för den valda formatklassen närhelst det ändras
Uppdatera mallen för att spegla vald styleClass
Spegla ändringar av den valda formatklassen i komponenten
Kontrollera att iframen ändrar storlek när formatet ändras
Här är de detaljerade instruktionerna för redigering av filen render.html:
Leta reda på och inkludera URL:en till filen design.css.
Lägg dynamiskt till filen design.css i sektionen <head> på sidan. När den har laddats anger du iframens höjd, eftersom den kan ha ändrats vid tillämpning av formaten.
Lägg till följande kod i objektet viewModel:
// Dynamically add any theme design URL to the <head> of the page
self.loadStyleSheet = function (url) {
var $style,
styleSheetDeferred = new $.Deferred(),
attempts = 100,
numAttempts = 0,
interval = 50,
pollFunction = function () {
// try to locate the style sheet
for (var i = 0; i < document.styleSheets.length; i++) {
try {
// locate the @import sheet that has an href based on our expected URL
var sheet = document.styleSheets[i],
rules = sheet && sheet.cssRules,
rule = rules && rules[0];
// check whether style sheet has been loaded
if (rule && (rule.href === url)) {
styleSheetDeferred.resolve();
return;
}
} catch (e) {}
}
if (numAttempts < attempts) {
numAttempts++;
setTimeout(pollFunction, interval);
} else {
// didn't find style sheet so complete anyway
styleSheetDeferred.resolve();
}
};
// add the themeDesign stylesheet to <head>
// use @import to avoid cross domain security issues when determining when the stylesheet is loaded
$style = $('<style type="text/css">@import url("' + url + '")</style>');
$style.appendTo('head');
// kickoff the polling
pollFunction();
// return the promise
return styleSheetDeferred.promise();
};
// update with the design.css from the Sites Page
SitesSDK.getSiteProperty('themeDesign', function (data) {
if (data && data.themeDesign && typeof data.themeDesign === 'string') {
// load the style sheet and then set the height
self.loadStyleSheet(data.themeDesign).done(self.setHeight);
}
});Hämta värdet för den valda formatklassen närhelst det ändras.
Skapa ett observerbart element för att bevaka när värdet för egenskapen styleClass ändras:
self.selectedStyleClass = ko.observable();
Observera att vi inte kan återge förrän vi har formatklassen. Ändra den här koden:
self.customSettingsDataInitialized = ko.observable(false);
self.initialized = ko.computed(function () {
return self.customSettingsDataInitialized();
}, self);
Använd den här koden istället:
self.customSettingsDataInitialized = ko.observable(false);
self.styleClassInitialized = ko.observable(false);
self.initialized = ko.computed(function () {
return self.customSettingsDataInitialized() && self.styleClassInitialized();
}, self);
Hämta det ursprungliga värdet för den valda formatklassen genom att lägga till:
self.updateStyleClass = function (styleClass) {
self.selectedStyleClass((typeof styleClass === 'string') ? styleClass : 'hello-world-default-style'); // note that this 'hello-world' prefix is based on the app name
self.styleClassInitialized(true);
};
SitesSDK.getProperty('styleClass', self.updateStyleClass);Uppdatera mallen för att spegla styleClass. Ändra den här koden:
<p data-bind="attr: {id: 'titleId'}, text: titleText"></p>
Använd den här koden istället:
<p data-bind="attr: {id: 'titleId'}, text: titleText, css: selectedStyleClass"></p>Spegla ändringar av den valda formatklassen i komponenten. Ändra den här koden:
if (settings.property === 'customSettingsData') {
self.updateCustomSettingsData(settings.value);
}
Använd den här koden istället:
if (settings.property === 'customSettingsData') {
self.updateCustomSettingsData(settings.value);
}
if (settings.property === 'styleClass') {
self.updateStyleClass(settings.value);
}Kontrollera att iframen ändrar storlek när formatet ändras. Ändra den här koden:
// create dependencies on any observables so this handler is called whenever it changes
var imageWidth = viewModel.imageWidth(),
imageUrl = viewModel.imageUrl(),
titleText = viewModel.titleText(),
userText = viewModel.userText();
Använd den här koden istället:
// create dependencies on any observables so this handler is called whenever it changes
var imageWidth = viewModel.imageWidth(),
imageUrl = viewModel.imageUrl(),
titleText = viewModel.titleText(),
userText = viewModel.userText(),
selectedStyleClass = viewModel.selectedStyleClass(); Spara och synkronisera filerna till servern för instansen av Oracle Content Management.
Kontrollera resultaten för steg 14
Förnya sidan på webbplatsen så att webbplatsverktyget kan hämta ändringar av komponenten.
Ta sidan till redigeringsläge.
Dra och släpp komponenten på sidan.
Öppna panelen Inställningar mot komponenten.
Gå till fliken Format.
Växla mellan formaten Gotiska och Normal som definierats i filen design.json.
Lägg märke till att teckenstorleken i komponenten justeras för att spegla ändringarna när den växlar mellan den tillämpade CSS-klassen för varje urval.
Fortsätt till Steg 15: Integrering med sidans beteende för Ångra och Gör om.