17.11.4.2 Utilisation du contrôleur pour template ODT
17.11.4.2.1 Précautions d'usage
Les templates ODT manipulent des données XML. La syntaxe des template XML est plus rigoureuse que les template HTML. Les fichiers générés peuvent être invalides si les données insérées ne sont pas conformes aux contraintes imposées par le format XML.
Voir la liste des limitations des ODT.
17.11.4.2.2 Affectation de variables
La classe PHP de manipulation de template est la classe OooLayout
qui dérivé de la
classe Layout
.
Les précautions d'usages sont les suivantes :
-
lors de l'affectation d'une variable, il ne faut pas que celle-ci corrompe le XML pour ce faire, on peut :
-
utiliser la fonction d'affectation dédiée :
$this->lay->eSet("VAR", $var);
-
encoder par avance la valeur avant de l'insérer :
$society = $this->lay->xmlEntities("Bob & Compagnie"); $this->lay->set("SOCIETY",$society);
-
ou encore si la valeur provient d'un document :
$myAnimal = new_Doc("", "MY_ANIMAL"); $name = $myAnimal->getValue("animal_name"); $name = $myAnimal->getOooValue($myAnimal->getAttribute("the_name"), $name); $this->lay->set("MY_ATTR",$name);
-
Note : La méthode set
permet d'insérer du
XML dans l'ODT, comme dans l'exemple ci-dessous :
$society="Bob <text:line-break/> Compagnie" ; $this->lay->set("SOCIETY",$society) ; // insertion d'un retour à la ligne
Note : La valeur null
est considérée comme non-instanciée, comme dans
l'exemple ci-dessous :
$this->lay->set("KEY",null) ; // [KEY] non remplacé $this->lay->set("KEY",'') ; // [KEY] effacé
17.11.4.2.3 Affectation des répétables
Les templates ODT peuvent gérer les éléments multiples. Le chapitre répétables des vues ODT indique les différentes possibilités d'emplacement des répétables.
L'affectation de valeurs multiples passe par deux méthodes :
-
OOoLayout::setColumn
: Cette méthode prend en entrée une clef et un array. Si la clef est déclarée dans une liste ou un tableau alors une entrée est ajoutée par valeur dans le tableau, -
OOoLayout::setRepeatable
: Cette méthode prend une matrice en entrée (array de array). La méthode rend alors toutes les colonnes du tableau à la même taille que la plus grande des colonnes et ajoute les colonnes ainsi créées grâce àOOoLayout::setColumn
.
/** * @templateController */ public function viewtest() { $repeatable[] = array( "V_X1"=>'A', "V_X2"=>'1', "V_X3"=>"La" ); $repeatable[] = array( "V_X1"=>'B', "V_X4"=>'2', "V_X3"=>"Si" ); $repeatable[]=array( "V_X1"=>'C', "V_X2"=>'3', "V_X3"=>"Do" ); $this->lay->setRepeatable($repeatable); $columnsValue = array('a','b','c','d'); $this->lay->setColumn("V_XXX",$columnsValue); }
Le template :
donne le fichier :
17.11.4.2.4 Utilisation du type Htmltext
Il n'y a pas de concordances entre les balises HTML et l'openText. Seul un sous ensemble des balises HTML est supporté, ci-dessous est présentée la table d'équivalence présentant les balises supportées et leur équivalent ODT.
balise HTML | balise ODT | description | restriction |
---|---|---|---|
p |
text:p |
Insère un paragraphe | La balise <p> doit être au premier niveau. |
div |
text:p |
Insère un paragraphe | Pour les <div> de premier niveau. |
div > div |
text:span |
Insère un texte | Pour les <div> de niveau inférieur. |
br |
text:line-break |
Insère un retour à la ligne | Doit être dans une balise <p> ou <td>
|
em/i |
text:span |
Insèrent un texte avec le style "italique" | Doit être dans une balise <p> ou <td>
|
strong/b |
text:span |
Insèrent un texte avec le style "gras" | Doit être dans une balise <p> ou <td>
|
u |
text:span |
Insère un texte avec le style "souligné" | Doit être dans une balise <p> ou <td>
|
sup |
text:span |
Insère un texte avec le style "exposant" | Doit être dans une balise <p> ou <td>
|
sub |
text:span |
Insère un texte avec le style "index" | Doit être dans une balise <p>
|
a |
text:a |
Insère un hyperlien | Doit être dans une balise <p> ou <td>
|
h1 |
text:h |
Insère un titre de niveau 1 | Le style du texte sera celui de "Titre 1" |
h2 |
text:h |
Insère un titre de niveau 2 | Le style du texte sera celui de "Titre 2" |
h3 |
text:h |
Insère un titre de niveau 3 | Le style du texte sera celui de "Titre 3" |
h4 |
text:h |
Insère un titre de niveau 4 | Le style du texte sera celui de "Titre 4" |
li |
text:list-item |
Insère un élément de liste | Doit être dans une balise <ul> ou <ol>
|
ul |
text:list |
Insère une liste à puces non numérotée | Doit être dans une balise <p> ou <td>
|
ol |
text:list |
Insère une liste à puces numérotée | Doit être dans une balise <p> ou <td>
|
table |
table:table |
Insère un tableau | Les tables ne doivent pas contenir de rowspan et colspan, chaque rangée doit avoir le même nombre de cellule. |
tr |
table:table-row |
Insère une rangée tableau | |
th |
table:table-cell |
Insère une cellule entête de tableau | Les cellules de header doivent être dans la première rangée du tableau |
td |
table:table-cell |
Insère une cellule tableau | Les colspan et rowspan et autres attributs de l'attribut html ne sont pas pris en compte. |
img |
draw:frame |
Insère une image | Seules les images présentes sur les paragraphes de premier niveau sont prises en compte. Pas d'image dans les cellules de tableau. |
17.11.4.2.4.1 Restrictions supplémentaires pour les images
3.2.19
Seules les propriétés de style width
et height
sont prises en compte. Pour
ces deux propriétés de style, seules les unités "px", "mm" et "cm" sont prises
en compte.
La taille d'une image sur un document openDocument ne peut pas être exprimée en "px" (pixel). Les "px" seront convertis en "mm" avec le ratio suivant "1px => 0.1875 mm". Seule la partie entière des millimètres est conservées.
Les images sont ancrées au texte comme caractère.
Pour les images issues de fichiers internes (fichier image inséré dans un
attribut de type image
), ces images sont inclues dans le fichier
openDocument produit. Si au moment de la production du fichier, les images
internes n'existent plus ou si elles ne sont pas autorisées à la lecture pour
l'utilisateur courant une image de substitution sera affichée à la place.
Si l'image interne est modifiée, elle ne sera pas modifiée sur le fichier déjà produit. La nouvelle image ne pourra être visible sur le fichier résultat qu'en cas de regénération de celui-ci.
Pour les images dont la source est externe à Dynacase, l'image insérée est liée à l'image cible, elle n'est pas copiée. Cela induit que l'image doit être accessible depuis le poste où le fichier produit est lu.
De même, si le fichier résultat est utilisée pour une transformation PDF via le moteur de transformation. il est nécessaire que le serveur openOffice est accès à l'image externe pour l'insérer dans le fichier PDF produit.
17.11.4.2.4.2 Gestion des caractères de contrôle
Conformément à la spécification XML, certains caractères de contrôle ne sont pas supportés. Dynacase remplace ces caractères par le pictogramme unicode leur correspondant.
17.11.4.2.4.3 Exemple 1 - Paragraphe
Le code HTML
<p>Bonjour</p>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text" aid="txt_text"> <text:p>Bonjour</text:p> </text:section>
17.11.4.2.4.4 Exemple 2 - Liste à puces
Le code HTML
<ul> <li>élement 1</li> <li>élement 2</li> </ul>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text" aid="txt_text"> <text:list text:style-name="LU"> <text:list-item> <text:p text:style-name="L1">élement 1</text:p> </text:list-item> <text:list-item> <text:p text:style-name="L1">élement 2</text:p> </text:list-item> </text:list> </text:section>
17.11.4.2.4.5 Exemple 3 - Division
Le code HTML
<div>Bonjour</div>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text" aid="txt_text"> <text:p>Bonjour</text:p> </text:section>
17.11.4.2.4.6 Exemple 4 - Gras et italique
Le code HTML
<div> <strong>Bonjour</strong> <br/> <em>le monde</em> </div>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text" aid="txt_text"> <text:p> <text:span text:style-name="Tbold">Bonjour</text:span> <text:line-break/> <text:span text:style-name="Titalics">le monde</text:span> </text:p> </text:section>
17.11.4.2.4.7 Exemple 5 - Titre de niveau
Le code HTML
<h1>Titre 1</h1> <h2>Titre 2</h2> <p>Mon paragraphe</p>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text" aid="txt_text"> <text:h text:outline-level="1">Titre 1</text:h> <text:h text:outline-level="2">Titre 2</text:h> <text:p>Mon paragraphe</text:p> </text:section>
17.11.4.2.4.8 Exemple 6 - Tableau
Le code HTML
<table> <tbody> <tr> <td>Cellule un</td> <td>Cellule deux</td> </tr> </tbody> </table>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text" aid="txt_text"> <table:table table:name="Table1" table:style-name="Table1"> <table:table-column table:style-name="Table1.A" table:number-columns-repeated="2"/> <table:table-row> <table:table-cell table:style-name="Table1.A1"> <text:p>Cellule un</text:p> </table:table-cell> <table:table-cell table:style-name="Table1.A1"> <text:p>Cellule deux</text:p> </table:table-cell> </table:table-row> </table:table> </text:section>
17.11.4.2.4.9 Exemple 7 - Image
3.2.19 Le code HTML
<p>Début <img alt="" src="file/64367/4181/img_file/-1/dialog-yes.png?cache=no&inline=no" style="height:16px; width:16px" /> et fin. </p>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text"> <text:p text:style-name="P1">Début <draw:frame draw:style-name="fr1" draw:name="htmlgraphic" text:anchor-type="as-char" svg:width="3mm" svg:height="3mm" draw:z-index="0"> <draw:image xlink:href="Pictures/dcp4181.png" xlink:type="simple" xlink:show="embed" xlink:actuate="onLoad"/> </draw:frame>et fin. </text:p> </text:section>
17.11.4.2.4.10 Exemple 8 - Cas d'erreur
Le code HTML
<div> <div class="my-class">Bonjour</div> <div>le monde</div> </div>
donne le code XML suivant :
<text:section text:style-name="Secttxt_text" text:name="Sectiontxt_text" aid="txt_text"> <text:p> <text:p>Bonjour</text:p> <text:p>le monde</text:p> </text:p> </text:section>
Ce code XML n'est pas conforme au schéma d'un document openDocument Text. Un paragraphe ne peut pas contenir d'autres paragraphes.