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