Creating blocks

Dans la conception des sites web Easysite, il est possible de développer de nouveaux blocs.

La configuration va être très similaire à la création de composants de sites WEB.

Exemple

Il s’agit ici d’utiliser des clefs de traduction dans les modèles de bloc d’un site web.

XML de definition

<?xml version="1.0" encoding="UTF-8"?>
<package name="sdk.commons" provider="vdocsoftware.com" version="1.0">
    <layouts>
        <template name="sdk.commons.translation" type="block"><!-- On declare un nouveau bloc -->
            <block>
                <def>
                    <!-- Declaration de la classe de controller -->
                    <controller className="com.vdoc.sdk.commons.ui.easy.site.block.controller.TranslationBlockController"/>
                    <view>translationBlock.jsp</view> <!-- definition de la page JSP de rendu. -->
                    <accepts>
                        <ref type="element" value="*"/><!-- on accepte tous les composants -->
                        <ref type="template" value="*"/><!-- on accepte tous les blocs -->
                        <!-- au niveau de la value il faut utiliser les noms systèmes des composants ou blocs -->
                        <!-- le wildcard * peut être utilisé en complement d'un nom système par exemple sdk.commons.* -->
                        <!-- il est possible d'avoir une negation avec le caractère ! exemple !sdk.commons.*  -->
                    </accepts>
                    <configuration><!-- cf : documentation sur les composants -->
                        <section name="properties">
                            <fields>
                            </fields>
                        </section>
                    </configuration>
                </def>
            </block>
        </template>
    </layouts>
</package>

View

Dans cet exemple le bloc n’aura aucun rendu, il s’agira donc d’une JSP vide.

Si un exemple est nécessaire, il faut aller voir le fichier simple.jsp du standard Process.

Controller

package com.vdoc.sdk.commons.ui.easy.site.block.controller;

import java.util.Collection;
import java.util.List;

import com.axemble.easysite.dao.domain.impl.ContentNodeImpl;
import com.axemble.easysite.dao.domain.impl.PropertyImpl;

import com.axemble.vdoc.sdk.impl.EzsBlock;
import com.axemble.vdoc.sdk.impl.EzsContentComponent;
import com.axemble.vdoc.sdk.impl.EzsExecutionContext;
import com.axemble.vdoc.sdk.impl.base.BaseBlockController;
import com.axemble.vdoc.sdk.interfaces.IBlock;
import com.axemble.vdoc.sdk.interfaces.IRenderModel;
import com.axemble.vdoc.sdk.interfaces.SEO;
import com.axemble.vdoc.sdk.utils.StringUtils;

import com.vdoc.sdk.commons.utils.InternationalizationUtils;
//InternationalizationUtils fait partie du VDocSDK-commons disponible sous form d'apps

public class TranslationBlockController extends BaseBlockController {

    private static final long serialVersionUID = 1L;
    /** the default class logger */
    @SuppressWarnings("unused")
    private static final com.axemble.vdoc.sdk.utils.Logger LOG = com.axemble.vdoc.sdk.utils.Logger.getLogger(TranslationBlockController.class);

    @Override
    protected void prepareModel(IRenderModel renderModel) { }

    @Override
    protected void processEvent(String s, String s1) { }
	
    @Override
    protected int prepareBlock() {
        IBlock rootBlock = new EzsBlock(this.getSiteModule(), this.getBlockInstance());
        this.translateTitle();
        this.browseBlock(rootBlock.getContentComponents());
        return IRenderOptions.ONLY_CHILDREN;
    }

    /**
     * Traduction du titre de page.
     */
    private void translateTitle() {
        String uri = ((EzsExecutionContext) this.getSiteModule().getExecutionContext()).getContextHandler().getExecutionContext().getUri();
        if (this.getSiteModule().getExecutionContext().getSite() != null) {
            String prefix = this.getSiteModule().getExecutionContext().getSite().getLabel() + " - ";
            String translatedTitle = InternationalizationUtils.getTranslationPageTitle(this.getSiteModule(), prefix, uri);

            SEO seo = null;

            if (this.getSiteModule().getExecutionContext().getPageContainer() != null) { // dans le cas d'une page
                seo = this.getSiteModule().getExecutionContext().getPageContainer().getSEO();
            } else if (this.getSiteModule().getExecutionContext().getPlugin() != null) { // dans le cas d'une page de plugin
                seo = this.getSiteModule().getExecutionContext().getPlugin().getSEO();
            }

            if (seo != null) {
                seo.setTitle(translatedTitle);
            }
        }
    }

    /**
     * Parcourt des composants et des blocs pour chercher les signets à traduire
     */
    protected void browseBlock(Collection components) {
        for (Object contentComponent : components) {
            if (contentComponent instanceof EzsContentComponent) {
                // recherche dans les proprietés du composant
                ContentNodeImpl contentNodeImpl = (ContentNodeImpl) ((EzsContentComponent) contentComponent).getNativeObject();
                List<PropertyImpl> propertyList = contentNodeImpl.getProperties();
                for (PropertyImpl propertyImpl : propertyList) {
                    propertyImpl.setValue(this.doTranslate(propertyImpl.getValue()));
                }

                // parcourt recursif 
                if (contentComponent instanceof EzsBlock) {
                    EzsBlock subBlock = (EzsBlock) contentComponent;
                    this.browseBlock(subBlock.getContentComponents());
                }
            }
        }
    }

    /**
     * Traduction des signets au format @{signet}
     */
    private String doTranslate(String bookmark) {
        if (bookmark != null) {
            List<String> toTranslateList = StringUtils.findNoRegEx(bookmark, "@{", "}");
            for (String toTranslateItem : toTranslateList) {
                String translationKey = toTranslateItem.substring(toTranslateItem.indexOf("@{") + 2, toTranslateItem.lastIndexOf('}'));
                if (translationKey.length() > 0) {
                    bookmark = bookmark.replace(toTranslateItem, this.getSiteModule().getStaticString(translationKey));
                }
            }
        }
        return bookmark;
    }

}

Source : https://wiki.myvdoc.net/xwiki/bin/view/Dev+Floor/HowToBuildCustomSiteLayout