Publication HTML du contenu de deux objets liés

Bonjour,

J’ai fait un test de publication HTML de devis, et je pouvais bien avoir les informations de Devis mais pas les informations de l’objet lié “Lignes de Devis”. Ce dernier servira à remplir le tableau de devis (Image en PJ).

Ma fonction d’impression et ma méthode de publication sont dans l’objet Devis. La méthode pour impression utilisée est celle mentionnée sur ce lien.

Avez-vous une idée de comment imprimer les informations venant d’un objet fils à partir de l’objet parent ?

Merci d’avance

Il y a énormément de façon de faire une publication.
Si vous faites du mustache, le JSON que vous utilisez pour alimenter le template mustache doit contenir toutes les lignes filles (via un search filtré sur le champ parent via setFilter…)), ensuite le template mustache doit contenir une simple boucle de <tr>.

var data = {
      field1: "xxx",
      list1: [
          { name: "Mustache", qty: 123, ...},
          { name: "Line2", qty: 456, ...}, 
           ...
      ]
  };
<table>
  {{#list1}}
  	<tr><td>{{name}}</td><td>{{qty}}</td><td>{{...}}</td></tr>
  {{/list1}}
</table>
1 Like

@HSE t’as pu t’en sortir avec les explications de François?

Merci @Francois et @scampano, c’était utile.
Toutefois je rencontre toujours un problème de duplication quand je veux importer des fields de deux objets différents mais qui sont liés.
La partie dupliquée est l’entête de la table de lignes de devis.

Le code java :

public String pubDevis(){
		BootstrapWebPage wp = new BootstrapWebPage(
			HTMLTool.getRoot(), 
			"Webpage publication pattern example", 
			true
		);
		
	// Ajout de valeurs de Devis
	    ObjectDB d = getGrant().getTmpObject("DF_Devis");
	    d.setFieldFilter("row_id",getRowId());
	    
		wp.append(MustacheTool.apply(
			this,
			"DF_Devis_HTML", 
			"{'rows':"+toJSON(d.search(), null, false, false)+"}"
		));
	
      // Ajout de valeurs de lignes Devis

		
		ObjectDB ld = getGrant().getTmpObject("DF_Ligne_Devis");
		ld.resetFilters();
		ld.setFieldFilter("DF_Ligne_Devis_DF_Devis_id",getRowId());
		
		List<String[]> rows_l = ld.search(false);
		if (rows_l.size() > 0){
			wp.append(MustacheTool.apply(
			this,
			"DF_Devis_HTML", 
			"{'rows_l':"+ld.toJSON(ld.search(), null, false, false)+"}"
			));
		}
		return wp.toString();
	}

HTML :

        <table cellpadding="0" cellspacing="0">
            <tr class="top">
                <td colspan="2">
                    <table>
                        <tr>
                            {{#rows}}
                            <td>
                                Devis #: {{defiDevisNumero}}<br>
                                Date Emission: {{defiDevisDateEmission}}<br>
                            </td>
                            {{/rows}}
                        </tr>
                    </table>
                </td>
            </tr>
            </table>
            
         <table id="tg-p6erB" class="tg">
			<thead>
				<tr style="background-color: #1abc9c;">
				    <th class="tg-ul38" >Réf<br></th>
				    <th class="tg-ul38">Type</th>
				    <th class="tg-ul38" width="40%">Désignation</th>
				    <th class="tg-ul38">Unité</th>
				    <th class="tg-ul38">Qté</th>
				    <th class="tg-ul38" ><br>Prix Rendu<br>Unitaire<br>Euros HT<br></th>
				    <th class="tg-ul38">TOTAL EUROS HT</th>
				</tr>
			</thead>
			
			<tbody>
				{{#rows_l}}
				<tr>
					<td>{{defiLigneDevisNPrix}}</td>
					<td>{{defiLigneDevisType]}</td>
					<td>{{defiLigneDevisDesignation}}</td>
					<td>{{defiLigneDevisUnite}}</td>
					<td>{{defiLigneDevisQuantite}}</td>
					<td>{{defiLigneDevisPrixVenteCalcule}}</td>
					<td>{{defiLigneDevisPrixVenteImpose}}</td>
				</tr>
				{{/rows_l}}
			</tbody>
		</table>

Bonjour,

Vous appelez 2 fois le parsing mustache sur un même template, donc forcement vous dupliquez le append dans la page.

Il faut le faire une seule fois avec toutes vos données dans un seul JSON, de plus votre code contient pas mal d’incohérences et votre template contient en ] au lieu d’un }.

public String pubDevis(){
		BootstrapWebPage wp = new BootstrapWebPage(
			HTMLTool.getRoot(), 
			"Webpage publication pattern example", 
			true
		);
		
	// Ajout de valeurs de Devis
	    ObjectDB d = getGrant().getTmpObject("DF_Devis");
	    
// pourquoi faire une recherfche sur un row_id qui ne ramenera qu'une seule ligne, puis l'afficher le résultat dans un tableau ?
// là il faut surement faire un select pour ramener les données de la base
		d.setFieldFilter("row_id",getRowId());

// trop tot, vous n'avez pas toutes vos données filles, ou alors utilisez 2 templates différents à concatener dans votre page
/*	    
		wp.append(MustacheTool.apply(
			this,
			"DF_Devis_HTML", 
			"{'rows':"+toJSON(d.search(), null, false, false)+"}"
		));
*/	
      // Ajout de valeurs de lignes Devis
		
		ObjectDB ld = getGrant().getTmpObject("DF_Ligne_Devis");
		ld.resetFilters();
		ld.setFieldFilter("DF_Ligne_Devis_DF_Devis_id",getRowId());
		
		List<String[]> rows_l = ld.search(false);
		if (rows_l.size() > 0){
			wp.append(MustacheTool.apply(
			this,
			"DF_Devis_HTML", 
// A priori il faut 2 listes dans votre template, donc :
			"{'rows':"+d.toJSON(d.search(), null, false, false)+
// inutile de refaire un  ld.search puisque vous avez déjà le résultat
			",'rows_l':"+ld.toJSON(rows_l, null, false, false)+"}"
			));
		}
		return wp.toString();
	}.

Merci @Francois, c’était bien ça la source de duplication.
Ça fonctionne correctement maintenant.