ofbiz-framework issueshttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues2019-11-15T16:46:37Zhttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/48Intégration du thème Yolande2019-11-15T16:46:37ZMathieu LirzinIntégration du thème Yolande# Yolande
Yolande - Le projet qui thème bien !
La branche du projet continent le merge des sous branches
Sous branches :
- Le thème https://labs.nereide.fr/10031/Communautaire/issues/112
- Le composant de gestion catalogue https://labs...# Yolande
Yolande - Le projet qui thème bien !
La branche du projet continent le merge des sous branches
Sous branches :
- Le thème https://labs.nereide.fr/10031/Communautaire/issues/112
- Le composant de gestion catalogue https://labs.nereide.fr/10031/Communautaire/issues/137
- Insérer des écrans raccourcie https://labs.nereide.fr/10031/Communautaire/issues/23
## Présentation du projet
Création d'une application OFBiz simplifiée et d'un thème moderne utilisant les nouvelles pratique du theme common-theme.
Les buts de ce projet sont multiple :
- Créer un nouveau thème
- Créer une application simplifiée
- Mettre en place des bonnes pratiques de développement au sein de Néréide
- Proposer le nouveau thème, l'application simplifiée et les nouvelles pratique de développement d'interface à la
communauté
## Installation de l'environnement
Le projet est simplement la branche yolande-simple du projet communautaire
## Méthodologie
Il n'y a pas de méthodologie définie pour le moment, pas de ressources affectées à ce projet de manière régulière et
permanente.
## Feuille de route
<p>
Les étapes suivantes sont des propositions qui peuvent être amenées à changer. En effet, si la première étape
nous appartient, l'échange avec la communauté risque de remettre en cause les suivantes.
</p>
<p>
L'agilité étant la fibre, l'adn des projets de Néréide, il est préférable de trouver les bons chemins aussi sinueux
soient-ils faut plus viser la destination se situant à l'horizon
et suivre
</p>
#### Étape 1 - Produit minimum viable
Cette première étape doit permettre de mettre en place une structure pour la création de nouveaux écrans permettant
d'embrasser de nouvelles pratiques.
Elle permettra également d'avoir de la matière à présenter à la communauté.
Dans ce but, il n'est pas nécessaire d'aller trop loin dans les fonctionnalités car il sera intéressant d'avoir les
retours des acteurs majeurs de la communauté.
1. Modifier le global-decorator du common-theme afin de le rendre vraiment générique
2. Mise en place de la structure d'un écran de type fiche utilisant les "decorator-section" et la maquette réalisée
par Marine
3. Modifier le code des maquettes pour l'intégrer dans OFBiz (rendre le contenu dynamique)
4. Mettre en place le premier exemple de recherche contextualisée
5. Afficher l'écran fiche de l'application simplifiée dans un ancien thème et s'assurer que l'affichage et
le fonctionnement sont correct
6. Vérifier que l'ensemble des items présents à l'écran sont fonctionnel (cloche, profil, changement de thème
, de langue, etc.)
7. Présenter le travail à la communauté pour la prochaine ApacheCon !
#### Étape 2 - Ajout de nouveaux gabaris d'écran
Après les échanges avec la communauté, il peut être intéressant de mettre en place de nouveaux gabaris (Recherche,
contact, arbre de dépendance, etc.)
#### Étape 3 - Ajout de dynamisme dans les écrans
Il existe des composants web primordiaux dans l'ERP qui mériteraient d'avoir plus d'outils. La table est un de ces
composants. Outre les différents type exports qui pourraient être définis par défaut, il peut être intéressant de
penser de nouvelles méthode de les remplirs. L'ajout d'un screen dans une cellule déjà réalisé par Nicolas est un bon
départ mais demande à être approfondis pour devenir un bon outils de productivité dans les tables.
#### Étape 4 - Ajout de la personnalisation du thème
<p>Pour que les utilisateurs puissent s'approprier l'ERP, il peut être intéressant d'ajouter des fonctionnalités qui
amélioreraient l'ergonomie des écrans en se basant sur les habitudes de l'utilisateur.
L'exemple des 4 premier onglets qui se positionnent en fonction du nombre de fois où ils sont ouverts est un bon
exemple.
</p>
<p>La gestion des icones d'application, des couleurs du thème, la personnalisation des zones d'entête de fiche (ajout
de bouton d'action, de dernier dossier, plus gros client, ect.), etc. peuvent-être autant de pistes à explorer pour que
le thème devienne incontournable et riche en fonctionnalités moderne.
</p>
<p>
La plus grande problématique peut se situer dans la récupération des informations de personnalisation. Plusieurs
pistes peuvent être explorées pour éviter d'avoir à soliciter la base de données principale.
<br>
La première pouvant être d'avoir une base de données dédiées pour ces personnalisations. Soit sur le même
serveur que la base de données principale, soit en utilisant des fonctionnalités du navigateur et donc en stockant
sur le poste client les préférences de l'interface.
</p>
<p>
Un autre point important à ne pas perdre de vue, c'est qu'un thème n'est pas obligé de surcharger le common-theme pour
fonctionner. Il doit être possible de réaliser un thème blanc qui reprend le common-theme.
</p>
## Structure d'écran
La gestion de la structure des écrans se divise en plusieurs sections principales :
1. Décorateur global du common-theme
2. Décorateur du thème en cours
3. Décorateur des gabaris (recherche, fiche, liste, contact, arborescence, étapes, etc.)
4. Décorateur global de la web application
5. Décorateur de la section
#### 1. Décorateur global du common-theme
<p>
Une des premières étapes du projet Yolande est de revoir ce décorateur.
<br>
Actuellement le "global-decorator" (GD) du common-theme contient trop d'élément structurant devant probablement être
relaigué à un sous décorateur pouvant être surchargé par le thème.
<br>
Il faut bien définir l'utilité du GD devrait être de définir les variables courantes du thème et d'inclure les resources
définies dans le theme.xml.
</p>
<p>
La proposition est de nettoyer le GD des éléments de structuration et de surcharger les vieux thèmes afin qu'ils
puissent continuer d'être utilisable. Le but étant de moderniser le GD sans poluer les nouveaux thèmes avec des
surcharges inutiles.
<br>
Par exemple, il serait intéressant de se dire que le GD n'incluse pas jquery par défaut et que jquery soit un ajout
fait par le thème si besoin. Le but étant d'être suffisamment souple pour s'adapter aux futures technologie et goût
des webdesigners jqueryphobes et/ou bootstrapophobe.
</p>
#### 2. Décorateur du thème en cours
<p>
le décorateur du thème en cours doit mettre en place les éléments de structuration qui seront globaux au thème,
comme la disposition du menu d'application, du sous menu, des éléments d'intéraction globales (choix du thème, de la
langue, des alertes, messages internes, etc.)
<br>
Ajouter les resources spécifiques et nécessaires au thème (ex : bootstrap, jquery, etc.), définir les variables
du thème.
</p>
#### 3. Décorateur des gabaris
<p>
Un point important est la possibilité de surcharger les gabaris (Recherche, fiche, etc.) qui seront disponibles
à l'ensemble des web applications.
<br>
Que ce soit au niveau structurel ou en allant plus loin en ajoutant des informations supplémentaires.
</p>
#### 4. Décorateur global de la web application
<p>
À ce niveau, il est probable qu'il n'y ai plus que des détails à mettre en forme. Des variables nécessaires pour
le fonctionnement des informations (ex : productId pour naviguer dans l'ensemble des écrans de produits)
</p>
#### 5. Décorateur de section
<p>
Le décorateur de section est une notion très importante. Il permet de définir des portions d'écrans qui pourront
être mises en forme dans les décorateurs supérieurs. Que ce soit au niveau du décorateur de thème ou au niveau du GD.
<br>
</p>
## Liste des gabaris à mettre en place
<p>
Les gabaris permettent de mettre en forme des types de pages en fonction des portions d'écrans défini par les
décorateurs de section.
</p>
- Recherche
- Fiche (en cours)
- Liste
- Contact
- Arborescence
- Étapes
la repriseMarine DesmarchelierMarine Desmarchelierhttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/55Revoir le systeme d'audit des entitées2020-04-01T11:28:04ZNicolas MalinRevoir le systeme d'audit des entitéesActuellement pour audité une entité il y a une configuration directement sur le champs de l'entité :
```xml
<field name="changeByUserLoginId" type="id-vlong" enable-audit-log="true"></field>
```
Il faut revoir la manière de faire c...Actuellement pour audité une entité il y a une configuration directement sur le champs de l'entité :
```xml
<field name="changeByUserLoginId" type="id-vlong" enable-audit-log="true"></field>
```
Il faut revoir la manière de faire car cela impose lorsque l'on souhaite activer ou désactivé une entitée de changer les fichier de model de donnée. Ce qui n'et pas correcte au vu de la diminution de spécific sur les sites clientsla reprisePierre GaudinPierre Gaudinhttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/56Reflexion sur les EntityLabels2019-04-11T13:54:23ZNicolas MalinReflexion sur les EntityLabelsLorsque l'on doit rajouter les descriptions labellisé sur des données (comme Enumeration ou StatusItem), il n'est pas possible de les rajouter dans les plugins.
```xml
<entity entity-name="ShipmentMethodType" default-resource-name="Pro...Lorsque l'on doit rajouter les descriptions labellisé sur des données (comme Enumeration ou StatusItem), il n'est pas possible de les rajouter dans les plugins.
```xml
<entity entity-name="ShipmentMethodType" default-resource-name="ProductEntityLabels"
```
```xml
<!-- DECATHLON specific -->
<property key="Uom.abbreviation.TF_day">
<value xml:lang="en">d</value>
<value xml:lang="fr">j</value>
</property>
<property key="Uom.abbreviation.TF_hr">
<value xml:lang="en">h</value>
<value xml:lang="fr">h</value>
</property>
<property key="Uom.abbreviation.TF_min">
<value xml:lang="en">min</value>
<value xml:lang="fr">min</value>
</property>
<!-- DECATHLON specific -->
```
Il faut dans un premier temps à réflechir comment surcharger la definition des entity labels pour ne plus à avoir à surcharger le standard et savoir comment pour alimenter les traductions dans le même esprithttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/57Amélioration HttpClient2019-04-11T13:46:46ZNicolas MalinAmélioration HttpClientAjout de la possibilité d'appeler getStream et postStream on utilisant l'overrideTrust) (voir HttpClient.java de Pro20200/ofbiz-framework)Ajout de la possibilité d'appeler getStream et postStream on utilisant l'overrideTrust) (voir HttpClient.java de Pro20200/ofbiz-framework)https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/58Escape Entity character dans StringUtil2019-04-11T13:49:24ZNicolas MalinEscape Entity character dans StringUtil```
public static String escapeEntityCharacters(String src) {
StringBuffer result = new StringBuffer();
if(src != null && src.length() != 0) {
int index = -1;
char c = (char)0;
Stri...```
public static String escapeEntityCharacters(String src) {
StringBuffer result = new StringBuffer();
if(src != null && src.length() != 0) {
int index = -1;
char c = (char)0;
String chars = "àâäéèêëîïôöùûüç'’_\"&";
String entitys = "à|â|ä|é|è|ê|ë|î|ï|" +
"ô|ö|ù|û|ü|ç|'|’|_|"|&";
String[] replace = entitys.split("\\|");
for(int i=0; i < src.length(); i++) {
c = src.charAt(i);
if((index = chars.indexOf(c)) != -1) {
result.append(replace[index]);
}else{
result.append(c);
}
}
}
return result.toString();
}
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/59Ajout de isHexInteger dans UtilValidate2019-04-11T13:51:33ZNicolas MalinAjout de isHexInteger dans UtilValidate```java
/* DECATHLON Specific*/
public static boolean isHexInteger(String s) {
if (isEmpty(s)) return defaultEmptyOK;
// Search through string's characters one by one
// until we find a non-numeric charac...```java
/* DECATHLON Specific*/
public static boolean isHexInteger(String s) {
if (isEmpty(s)) return defaultEmptyOK;
// Search through string's characters one by one
// until we find a non-numeric character.
// When we do, return false; if we don't, return true.
for (int i = 0; i < s.length(); i++) {
// Check that current character is number.
char c = s.charAt(i);
if (!isHexDigit(c)) return false;
}
// All characters are numbers.
return true;
}
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/61Affichage des retour de l'autocomplete2019-04-11T14:47:18ZNicolas MalinAffichage des retour de l'autocompletePouvoir définir un template d'affichage pour les retour de l'auto complete qui ne support actuelleent que {[pk] description}
En supplément: lors de l'itération des champs, bien prendre l'ensemble des searchField et pas que le premierPouvoir définir un template d'affichage pour les retour de l'auto complete qui ne support actuelleent que {[pk] description}
En supplément: lors de l'itération des champs, bien prendre l'ensemble des searchField et pas que le premierhttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/62Reflexion comment enlever les identification d'entité d'application de sendMa...2019-04-11T14:54:30ZNicolas MalinReflexion comment enlever les identification d'entité d'application de sendMailInterfaceActuellement l'interface ajoute orderId, returnId, custRequestId, ect qui ne semble pas une bonne façon de faire pour pouvoir géré chaque entité qui pourrait être associé à un commEvent par email.
Reflexion général de comment faire autr...Actuellement l'interface ajoute orderId, returnId, custRequestId, ect qui ne semble pas une bonne façon de faire pour pouvoir géré chaque entité qui pourrait être associé à un commEvent par email.
Reflexion général de comment faire autrementhttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/64Ajout de jsonUploadResponseFromRequestAttributes dans le standard2020-05-25T16:09:11ZNicolas MalinAjout de jsonUploadResponseFromRequestAttributes dans le standardSur CommonEvents.java
```
// ========= = DECATHLON specific = ==========
public static String jsonUploadResponseFromRequestAttributes(HttpServletRequest request, HttpServletResponse response) throws IOException {
// pull...Sur CommonEvents.java
```
// ========= = DECATHLON specific = ==========
public static String jsonUploadResponseFromRequestAttributes(HttpServletRequest request, HttpServletResponse response) throws IOException {
// pull out the service response from the request attribute
Map<String, Object> attrMap = UtilHttp.getJSONAttributeMap(request);
for (String ignoreAttr : ignoreAttrs) {
if (attrMap.containsKey(ignoreAttr)) {
attrMap.remove(ignoreAttr);
}
}
// create a JSON Object for return
JSON json = JSON.from(attrMap);
writeJSONtoResponse(json, request, response, "text/html"); //text-html since jquery.upload don't work wit contentType application/x-json : http://lagoscript.org/jquery/upload/documentation
return "success";
}
}
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/65Reflexion perfomFind Group condition2019-04-11T15:11:21ZNicolas MalinReflexion perfomFind Group conditionCe qui a était commité ne permet pas de faire fonctionner correctement les cas eu sur dktCe qui a était commité ne permet pas de faire fonctionner correctement les cas eu sur dkthttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/66Amélioration performFind, ajout du notEmpty2019-04-11T15:11:48ZNicolas MalinAmélioration performFind, ajout du notEmptyhttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/67Amélioration performFind, create SingleCondition, gestion du In avec des string2019-04-11T15:14:19ZNicolas MalinAmélioration performFind, create SingleCondition, gestion du In avec des string```
// ========= = DECATHLON specific = ==========
if ((fieldOp == EntityOperator.IN || fieldOp == EntityOperator.NOT_IN ) && fieldValue instanceof String) {
fieldObject = UtilMisc.toList(fieldValue);
...```
// ========= = DECATHLON specific = ==========
if ((fieldOp == EntityOperator.IN || fieldOp == EntityOperator.NOT_IN ) && fieldValue instanceof String) {
fieldObject = UtilMisc.toList(fieldValue);
}
// ========= = DECATHLON specific = ==========
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/68Amélioration EmailServices.java : envoi avec plusieurs contents associé au mail2019-04-11T15:20:09ZNicolas MalinAmélioration EmailServices.java : envoi avec plusieurs contents associé au mailLors d'un envoie email, on ne peux actuellement qu'envoyer un document attaché, amélioration proposée :
```
// check if attachment screen location passed in
// ========= = DECATHLON specific = ==========
/*
...Lors d'un envoie email, on ne peux actuellement qu'envoyer un document attaché, amélioration proposée :
```
// check if attachment screen location passed in
// ========= = DECATHLON specific = ==========
/*
if (UtilValidate.isNotEmpty(xslfoAttachScreenLocationList)) {
List<Map<String, ? extends Object>> bodyParts = new LinkedList<Map<String, ? extends Object>>();
*/
List<Map<String, ? extends Object>> bodyParts = new LinkedList<Map<String, ? extends Object>>();
List<Map<String, ? extends Object>> contents = UtilGenerics.checkList(bodyParameters.get("contents"));
if (UtilValidate.isNotEmpty(contents)) {
bodyParts.addAll(contents);
isMultiPart = true;
serviceContext.put("bodyParts", bodyParts);
}
if (UtilValidate.isNotEmpty(xslfoAttachScreenLocationList) || ! bodyParts.isEmpty()) {
// ========= = DECATHLON specific = ==========
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/69Amélioration EmailServices.java : forcer l'adresse de from pour tous les emai...2019-07-12T13:22:28ZNicolas MalinAmélioration EmailServices.java : forcer l'adresse de from pour tous les emails sortantAfin de forcer tous les email sortant sur l'adresse configurér dans les properties
```
// ========= = DECATHLON specific = ==========
if ("true".equalsIgnoreCase(EntityUtilProperties.getPropertyValue("general", "forceFro...Afin de forcer tous les email sortant sur l'adresse configurér dans les properties
```
// ========= = DECATHLON specific = ==========
if ("true".equalsIgnoreCase(EntityUtilProperties.getPropertyValue("general", "forceFromEmailAddressToDefault", "false", delegator))) {
sendFrom = EntityUtilProperties.getPropertyValue("general", "defaultFromEmailAddress", delegator);
}
// ========= = DECATHLON specific = ==========
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/70Correction LoginServices, la création des utilisateurs externe par createUser...2019-04-11T15:35:35ZNicolas MalinCorrection LoginServices, la création des utilisateurs externe par createUserLogin ne marche pasDu à la nom présente de hasLoggedOut à Y
```
GenericValue userLoginToCreate = delegator.makeValue("UserLogin", UtilMisc.toMap("userLoginId", userLoginId));
checkNewPassword(userLoginToCreate, null, currentPassword, curre...Du à la nom présente de hasLoggedOut à Y
```
GenericValue userLoginToCreate = delegator.makeValue("UserLogin", UtilMisc.toMap("userLoginId", userLoginId));
checkNewPassword(userLoginToCreate, null, currentPassword, currentPasswordVerify, passwordHint, errorMessageList, true, locale);
userLoginToCreate.set("externalAuthId", externalAuthId);
userLoginToCreate.set("passwordHint", passwordHint);
userLoginToCreate.set("enabled", enabled);
userLoginToCreate.set("hasLoggedOut", "Y");// ========= = DECATHLON specific = ==========
userLoginToCreate.set("requirePasswordChange", requirePasswordChange);
userLoginToCreate.set("currentPassword", useEncryption ? HashCrypt.cryptUTF8(getHashType(), null, currentPassword) : currentPassword);
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/71Correction LoginService: donner le format du pattern lors d'un nv mdp s'il ne...2019-04-11T15:38:03ZNicolas MalinCorrection LoginService: donner le format du pattern lors d'un nv mdp s'il ne le respecte pas```
Map<String, String> messageMap = UtilMisc.toMap("minPasswordLength", Integer.toString(minPasswordLength));
String passwordPatternMessage = EntityUtilProperties.getPropertyValue("security",
...```
Map<String, String> messageMap = UtilMisc.toMap("minPasswordLength", Integer.toString(minPasswordLength));
String passwordPatternMessage = EntityUtilProperties.getPropertyValue("security",
"security.login.password.pattern.description", "loginservices.password_must_be_least_characters_long", delegator);
errMsg = UtilProperties.getMessage(resource, passwordPatternMessage, messageMap, locale);
// ========= = DECATHLON specific = ==========
messageMap = UtilMisc.toMap("passwordPatternMessage", errMsg);
errMsg = UtilProperties.getMessage(resource,"loginservices.password.pattern.errmsg", messageMap, locale);
// ========= = DECATHLON specific = ==========
errorMessageList.add(errMsg);
}
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/72Amélioration dataField2019-04-11T15:42:12ZNicolas MalinAmélioration dataFieldAjout de fonction :
```
// ========= = DECATHLON specific = ==========
public Map<String, Object> getFields() {
return fields;
}
public Map<String, Object> getTrimedFields() {
for (Map.Entry<String, Obj...Ajout de fonction :
```
// ========= = DECATHLON specific = ==========
public Map<String, Object> getFields() {
return fields;
}
public Map<String, Object> getTrimedFields() {
for (Map.Entry<String, Object> field : fields.entrySet()) {
Object value = field.getValue();
if(value != null && value instanceof String){
field.setValue(((String)value).trim());
}
}
return fields;
}
// ========= = DECATHLON specific = ==========```
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/73Reflexion: Comment définir des "aggregate-function" multibase2019-04-12T08:33:19ZNicolas MalinReflexion: Comment définir des "aggregate-function" multibaseles fonctions d'agregation comme
```
<xs:simpleType name="aggregate-function">
<xs:restriction base="xs:token">
...
<xs:enumeration value="concat"/>
<xs:enumeration value="replace"/>
<xs...les fonctions d'agregation comme
```
<xs:simpleType name="aggregate-function">
<xs:restriction base="xs:token">
...
<xs:enumeration value="concat"/>
<xs:enumeration value="replace"/>
<xs:enumeration value="substring"/>
</xs:restriction>
</xs:simpleType>
```
Sont souvent dépendantes de la base de donnée, comment faire pourvoir les exploiters dans le framework de manière générique, voir comment en ajouter d'autre depuis les pluginshttps://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/75Amélioration: Ajout de makeEntityCondition sur les vue dynamique2021-04-14T06:23:34ZNicolas MalinAmélioration: Ajout de makeEntityCondition sur les vue dynamique```
// ========= = DECATHLON specific = ==========
public ViewEntityCondition makeViewEntityCondition(Delegator delegator, String entityAlias, String fieldName, String operator, String value) {
return makeViewEntityConditi...```
// ========= = DECATHLON specific = ==========
public ViewEntityCondition makeViewEntityCondition(Delegator delegator, String entityAlias, String fieldName, String operator, String value) {
return makeViewEntityCondition(delegator, entityAlias, fieldName, operator, value, "");
}
public ViewEntityCondition makeViewEntityCondition(Delegator delegator, String entityAlias, String fieldName, String operator, String value, String relEntityAlias) {
return makeViewEntityCondition(delegator, entityAlias, fieldName, operator, value, relEntityAlias, "");
}
public ViewEntityCondition makeViewEntityCondition(Delegator delegator, String entityAlias, String fieldName, String operator, String value, String relEntityAlias, String relFieldName) {
HashMap<String, Object> myElement = new HashMap<String, Object>() ;
HashMap<String, Object> whereConditionExpr = new HashMap<String, Object>() ;
if (UtilValidate.isNotEmpty(entityAlias)) {
whereConditionExpr.put("entity-alias",entityAlias) ;
}
if (UtilValidate.isNotEmpty(fieldName)) {
whereConditionExpr.put("field-name",fieldName) ;
}
if (UtilValidate.isNotEmpty(operator)) {
whereConditionExpr.put("operator",operator) ;
}
if (UtilValidate.isNotEmpty(value)) {
whereConditionExpr.put("value",value) ;
}
if (UtilValidate.isNotEmpty(relEntityAlias)) {
whereConditionExpr.put("rel-entity-alias",relEntityAlias) ;
}
if (UtilValidate.isNotEmpty(relFieldName)) {
whereConditionExpr.put("rel-field-name",relFieldName) ;
}
myElement.put("whereConditionExpr",whereConditionExpr) ;
return new ViewEntityCondition(this.makeModelViewEntity(delegator), null, myElement) ;
}
// ========= = DECATHLON specific = ==========
```https://labs.nereide.fr/10031/apache/ofbiz-framework/-/issues/76Réflexion: Comment surcharger des définitions de moteur de service depuis plu...2019-04-12T08:54:17ZNicolas MalinRéflexion: Comment surcharger des définitions de moteur de service depuis pluginsSi nous voulons ajouter un nouveau moteur (api) depuis un plugins il est nécessaire d'aller modifier serviceengine.xml
Il faudrait réfléchir comment modifier cela pour pouvoir ajouter de nouveau moteur depuis les pluginsSi nous voulons ajouter un nouveau moteur (api) depuis un plugins il est nécessaire d'aller modifier serviceengine.xml
Il faudrait réfléchir comment modifier cela pour pouvoir ajouter de nouveau moteur depuis les plugins