jeudi 7 mai 2015

Nouvelle version de io.js

JavaFX / IHM : programmative ou déclarative ?

En JavaFX, nous avons la possibilité de définir une IHM de deux façons à la fois différentes et complémentaires :

  • En exploitant des fichiers FXML (façon déclarative)
  • En "assemblant" dynamiquement tous les composants UI nécessaires (façon programmative)

Les fichiers FXML fournissent les informations sur les composants UI qui vont être utiliser.

Ces fichiers vont être considérés par JavaFX comme des objets sérialisés parfaitement utilisables par votre application.

JavaFX Scene Builder est une application WYSIWIG qui permet de générer ces fichiers FXML.

Vous pouvez bien sûr générer manuellement ces fichiers.

La façon programmative va s'appuyer strictement sur les API Java pour construire une IHM.

Certains développeurs adopteront (par confort, par habitude ou par "philosophie") une des deux approches.

Quelle est donc la meilleure approche : programmative ou déclarative ?

En fait il n'y a pas de meilleure approche.

Au début de cet article, nous avons considéré ces deux approches comme complémentaires.

Et c'est le cas !

JavaFX permet de construire une IHM en utilisant ces deux approches.

Nous pouvons par exemple construire une partie de notre IHM avec l'approche déclarative et construire l'autre partie avec l'approche programmative.

Une réflexion au préalable est souhaitable pour estimer la part du déclaratif / programmatif.

"L'estimation" sera peut être conditionnée par certaines contraintes (par exemple : volonté de ne pas externaliser une IHM).

Nous avons un palette d'outils : à nous de les utiliser au mieux !

Nouvelle version de PHP

Du nouveau pour PHP :

Après un PHP 6 avorté, voici PHP 7.
Affaire à suivre...

Transformation données XML et Encodage

Lorsque vous manipulez la chaine de traitement XML pour transformer vos données en un document exploitable, il faut tenir compte de l'encodage de vos données.

L'encodage pour faire simple est la "façon" de représenter vos données.

Il est donc nécessaire que chaque maillon de la chaine de traitement puisse analyser et comprendre les données transmises.

Pour éviter des données non comprises (et très souvent représentées dans ce cas par des caractères spéciaux), il faut s'assurer d'utiliser le même encodage sur toute la chaine de traitement.

Cela peut sembler évident mais cette "négligence" peut être la source de nombreux problèmes.

Voici quelques conseils.

Nous partirons du principe par exemple que l'encodage sélectionné soit l'UTF-8.

Commençons par les données.

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

Vous devez insérer cette balise en première ligne de votre fichier XML - vous pourrez ainsi utiliser les caractères accentués.

Assurez - vous que l'encodage du fichier soit aussi en UTF-8 - cela peut sembler évident mais dans la pratique nous constatons quelque fois une différence d'encodage entre le fichier et ses données.

Vos documents XSL / XSL:FO doivent aussi comporter :

<?xml version="1.0" encoding="UTF-8"?>

en première ligne.

La précédente remarque sur l'encodage du fichier s'applique aussi dans ce cas.

Une fois que vous êtes sûrs que vos données et fichiers soient bien en UTF-8, cela ne suffit pas.

Il faut s'assurer que lors du traitement de la chaine XML, vos données soient bien lues et écrites en UTF-8.

Exemple :

// données XML
Source sourceDATA = new StreamSource(tempFile);

// feuille de style XSL
FileInputStream stream = new FileInputStream(
templatesList.get(newValue).replace(
"\\", "\\\\"));

Reader reader = new InputStreamReader(stream,"UTF-8");

Source xsl = new StreamSource(reader);

// document HTML en sortie
File temp = File.createTempFile("mon_fichier_de_sortie", ".html");
OutputStream fos = new FileOutputStream(temp);
OutputStreamWriter bw = new OutputStreamWriter(fos, "UTF-8");

Result result = new StreamResult(bw);

// transformation
TransformerFactory factory = TransformerFactory.newInstance();

Transformer transformer = factory.newTransformer(xsl);

transformer.setParameter("encoding", "UTF-8");

transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

transformer.transform(sourceDATA, result);

Dans cette exemple, nous transformons (XSL / XSLT) des données XML en un document HTML.

Vous noterez les précautions à prendre pour s'assurer du bon encodage jusqu'au bout du traitement.

Ce principe s'applique pour toutes les technologies XML.

XSL:FO : gestion multi pages

XSL:FO permet de décrire les mises en forme de documents XML quel que soit le support (écran, papier, ...).

Par exemple, il est possible de générer ainsi un document PDF à partir de données XML.

Une des difficultés est de gérer correctement un document multi - pages.

Imaginez que vous deviez mettre en forme des lignes d'une facture et que vous souhaitiez faire un saut de page toutes les 15 lignes.

Voici un extrait d'un document XSL:FO type :

<fo:table table-layout="fixed" border-spacing="3px 3px">
...
<fo:table-body background-color="white" border-color="black"

border-width="1px" border-style="solid">
<xsl:for-each select="Ligne">

<fo:table-row space-before.optimum="0pt">
<!-- gestion des sauts de page -->
<xsl:if test="position() mod 15 = 0">
<xsl:attribute name="break-after">page</xsl:attribute>
</xsl:if>

<fo:table-cell padding="3px">
<fo:block text-align-last="center">
<xsl:value-of select="ref" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding="3px">
<fo:block text-align-last="center">
<xsl:value-of select="designation" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding="3px">
<fo:block text-align-last="center">
<xsl:value-of select="qte" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding="3px">
<fo:block text-align-last="right">
<xsl:value-of select="format-number(pu_ht, '### ###.00')" />
</fo:block>
</fo:table-cell>
<fo:table-cell padding="3px">
<fo:block text-align-last="right">
<xsl:if test="remise > 0">
<xsl:value-of select="format-number(remise, '### ###.00')" />
</xsl:if>
<xsl:if test="contains(remise, '%')">
<xsl:value-of select="remise" />
</xsl:if>
</fo:block>
</fo:table-cell>
<fo:table-cell padding="3px">
<fo:block text-align-last="right">
<xsl:value-of select="format-number(total_ht, '### ###.00')" />
</fo:block>
</fo:table-cell>
</fo:table-row>
</xsl:for-each>
</fo:table-body>
...
            </fo:table>

Un extrait des données XML associées :

<Lignes>
...
<Ligne>
<ref>XXXX_105</ref>
<designation>Carte mère</designation>
<qte>1</qte>
<pu_ht>160</pu_ht>
<remise>34.55</remise>
<total_ht>125.45</total_ht>
</Ligne>
<Ligne>
<ref>FORT1</ref>
<designation>Forfait maintenance</designation>
<qte>1</qte>
<pu_ht>60</pu_ht>
<remise>15%</remise>
<total_ht>51</total_ht>
</Ligne>
<Ligne>
<ref>FORT2</ref>
<designation>Forfait maintenance 2</designation>
<qte>1</qte>
<pu_ht>70</pu_ht>
<remise></remise>
<total_ht>60</total_ht>
</Ligne>
<Ligne>
<ref>FORT3</ref>
<designation>Forfait maintenance 3</designation>
<qte>1</qte>
<pu_ht>80</pu_ht>
<remise></remise>
<total_ht>60</total_ht>
</Ligne>
<Ligne>
<ref>FORT4</ref>
<designation>Forfait maintenance 2</designation>
<qte>1</qte>
<pu_ht>70</pu_ht>
<remise></remise>
<total_ht>60</total_ht>
</Ligne>
<Ligne>
<ref>FORT5</ref>
<designation>Forfait maintenance 3</designation>
<qte>1</qte>
<pu_ht>80</pu_ht>
<remise></remise>
<total_ht>60</total_ht>
</Ligne>
...
</Lignes>

Simple non ?

Oui, mais vous devez prendre une précaution importante sinon votre gestion multi - pages ne fonctionnera pas.

Votre <FO:TABLE> ne doit pas être dans un <FO:BLOCK-CONTAINER> qui est positionné en valeur absolue (propriété : position='absolute') -  d'après les spécifications XSL.

Si cela est le cas, votre gestion multi - pages sera ignorée.

Pour remédier à ce problème, la meilleure chose à faire est de supprimer le <FO:BLOCK-CONTAINER>.

Vous pouvez aussi modifier les propriétés de <FO:REGION-BODY> en y reportant les valeurs des propriétés précédemment initialisées dans le <FO:BLOCK-CONTAINER> (ex : "margin-top" de <FO:REGION-BODY> = valeur propriété "top" de <FO:BLOCK-CONTAINER).