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 :

template

Figure 119. template

donne le fichier :

résultat

Figure 120. résultat

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&amp;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.

×