Etape 14 : utilisation de styles personnalisés lorsque le composant est affiché dans un cadre incorporé

Les composants affichés dans un cadre incorporé ne disposent pas d'un accès direct au fichier design.css. A la place, vous devez effectuer une étape supplémentaire pour obtenir l'URL du fichier design.css dans votre composant et l'ajouter à la page. Vous devez ensuite mettre à jour votre composant pour refléter le style sélectionné par l'utilisateur.

Pour inclure et utiliser le fichier design.css dans votre composant, vous devez apporter des modifications au fichier render.html :
  1. Recherchez et incluez l'URL du fichier design.css.

  2. Obtenez la valeur de la classe de style sélectionnée chaque fois qu'elle change.

  3. Mettez à jour le modèle pour refléter la valeur styleClass sélectionnée.

  4. Reportez les modifications apportées à la classe de style sélectionnée dans votre composant.

  5. Vérifiez que le cadre incorporé est redimensionné lorsque le style est modifié.

Voici des instructions détaillées pour modifier le fichier render.html :

  1. Recherchez et incluez l'URL du fichier design.css.

    Ajoutez de façon dynamique le fichier design.css à la section <head> de la page. Une fois le chargement terminé, définissez la hauteur du cadre incorporé car celle-ci peut être modifiée lors de l'application des styles.

    Ajoutez le code suivant dans l'objet 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);
        }
    });
  2. Obtenez la valeur de la classe de style sélectionnée chaque fois qu'elle change.

    Créez un élément observable pour suivre les modifications de la valeur de propriété styleClass :

    self.selectedStyleClass = ko.observable();

    L'affichage est impossible sans la classe de style. Remplacez ce code :

    self.customSettingsDataInitialized = ko.observable(false);
    self.initialized = ko.computed(function () {
        return self.customSettingsDataInitialized();
    }, self);

    Par celui-ci :

    self.customSettingsDataInitialized = ko.observable(false);
    self.styleClassInitialized = ko.observable(false);
    self.initialized = ko.computed(function () {
        return self.customSettingsDataInitialized() && self.styleClassInitialized();
    }, self);

    Obtenez la valeur initiale de la classe de style sélectionnée en ajoutant ce qui suit :

    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);
  3. Mettez à jour le modèle pour refléter la valeur styleClass sélectionnée. Remplacez ce code :

    <p data-bind="attr: {id: 'titleId'}, text: titleText"></p>

    Par celui-ci :

    <p data-bind="attr: {id: 'titleId'}, text: titleText, css: selectedStyleClass"></p>
  4. Reportez les modifications apportées à la classe de style sélectionnée dans votre composant. Remplacez ce code :

    if (settings.property === 'customSettingsData') {
        self.updateCustomSettingsData(settings.value);
    }

    Par celui-ci :

    if (settings.property === 'customSettingsData') {
        self.updateCustomSettingsData(settings.value);
    }
    if (settings.property === 'styleClass') {
        self.updateStyleClass(settings.value);
    }
  5. Vérifiez que le cadre incorporé est redimensionné lorsque le style est modifié. Remplacez ce code :

    // 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();

    Par celui-ci :

    // 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();  
  6. Enregistrez vos fichiers et synchronisez-les avec l'instance de serveur Oracle Content Management.

Vérification des résultats de l'étape 14

  1. Actualisez la page de votre site pour que le générateur de site puisse récupérer les modifications apportées au composant.

  2. Passez la page en mode de modification.

  3. Faites glisser le composant vers la page.

  4. Affichez le panneau des paramètres pour votre composant.

  5. Accédez à l'onglet Style.

  6. Basculez entre les styles Gothique et Simple définis dans votre fichier design.json.

    Vous pouvez observer que la taille de la police dans votre composant est modifiée en réponse au basculement entre les classes CSS appliquées pour chaque sélection.

Passez à Etape 15 : intégration au comportement d'annulation et de rétablissement de la page.