CrossTab Impossible d'obtenir le HTML toHTML

Merci @david pour ta célérité.

Nouvelles questions :

  1. Est-ce normal que les colonnes “Total” ne soient pas dans le HTML ?
  2. Dans le HTML, serais-ce possible d’avoir au minima les classes ctrow et ctcell ?
  3. Est-ce possible de builder le cross tab dans une autre langue ?
    Dans mon cas, j’ai une alerte envoyée à un groupe d’utilisateurs. Certains sont anglais d’autres non. Dans ma méthode preAlert, je substitue le texte “[CROSSTAB]” par le HTML fourni par toHtml. Problème : je ne peux pas spécifier la langue. (Désolée de ne pas avoir vu ce point plus tôt) --> mon utilisateur qui lance l’alerte est en français, j’ai essayé de récupérer le HTML en utilisant le grant Grant.getSystemAdmin() qui lui est en anglais mais cela m’a retourné le HTML en français également.
  1. comme expliqué cette table “raw HTML” est à la base destinée à un import de donnée dans Excel, on n’y met donc que les données brutes du tableau croisé, pas ce qui peut être recalculé dans Excel

  2. Non pour la même raison que ci-dessus => cela doit impérativement rester du raw HTML, mais avec du CSS un peu malin vous devez pouvoir faire ce qu’il faut, ex:

table { margin: 10px; border-collapse: collapse; }
tr:first-child, td:first-child { font-weight: bold; }
tr:nth-child(even) { background: #EEE; }
tr:nth-child(odd) { background: #DDD; }
td { padding: 5px; border: dotted 1px #CCC; }

Qui donne:
image

  1. Le tableau est généré dans la langue du user qui a instancié l’objet à partir duquel le tableau croisé est généré

Merci pour tes retours.

Je souhaiterai avoir la possibilité de générer le tableau dans une autre langue d’après votre point 3 ce n’est pas possible.
Comment puis-je gérer mon besoin fonctionnel d’envoyer un alerte à groupe de personnes ?
Ma compréhension du système d’alerting pour un groupe était que chaque utilisateur recevait l’alerte dans la langue configurée dans son profil.
Si je fais une substitution de mon “[CROSSTAB]” par le code HTML, je vais me retrouver avec un tableau en français dans un mail en anglais.
Comment pourrais-je gérer ce cas ?

Cordialement

Je ne connait pas bien la mécanique interne des alertes…

@Francois si nous mettons en place ce tag de substitution dans le corps des alertes (genre [CROSSTAB:myCrosstab]) est-ce que celui-ci sera bien instancié depuis un objet du user qui reçoit l’alerte (et donc avec les éventuels filtres propres à ce user) ?

Ce n’est pas conçu pour ce genre d’usage multi-langues. Une alerte = 1 email ayant plusieurs destinataires to/cc/bcc, donc chacun ne reçoit pas le sien dans sa langue.

Bref le pre/postAlert est appelé une seule fois pour tous les destinataires (emails distincts) et dans la langue de la session qui l’émet. Il faudrait changer la logique interne, pour grouper les users par langue, ou ce qui se fait en général de concaténer toutes les langues dans l’email si les destinataires ont plusieurs langues.

Donc une solution simple serait de paramétrer une alerte dont le body contient toutes les langues à la suite / et de substituer plusieurs fois le tableau ([CROSTAB_FRA] [CROSTAB_ENU]) généré plusieurs fois (en changeant temporairement la langue getGrant().setLang("ENU" | "FRA") et en la remettant à sa valeur d’origine à la fin).

Ensuite si le besoin est trop spécifique il est toujours possible par code :

  • de faire un ‘select group by’ maison qui devient un HTML comme souhaité
  • d’envoyer des Alertes ou des Emails en boucle en changeant les destinataires et le body

Il y a toutes les helpers dans Simplicité pour envoyer des emails simplement.

PS : le sujet initial du post est loin derrière nous, il aurait fallu en faire un autre.

Bonjour François,
oui en effet, la pratique consistant à concaténer dans le corps du mail le contenu traduit dans plusieurs langues est couramment rencontrée (+1). C’est en lien avec un autre post sur le sujet (Permettre l'accès aux traductions d'un objet, d'un field dans une langue autre que celle de l'user).

Oui, je pense qu’on peut aller dans ce sens, le mail sortant devrait concaténer toutes les langues des destinataires une fois connus (donc après preAlert qui permet d’en changer par code).

A la différences des objects/fields instanciés par langue, une alerte contient toutes ses langues en mémoire, donc c’est plus simple de le faire comme suit :

public String preAlert(Alert a) {
	if (a!=null && "myAlert".equals(a.getName()) {
		Crosstab ct = getCrosstab("CT1");
		String lang = getGrant().getLang();

		getGrant().setLang("FRA");
		ct.build(this);
		String t = ct.toHTML(getGrant(), false);
		a.setContent("FRA", a.getContent("FRA").replace("[CROSSTAB]", t));

		getGrant().setLang("ENU");
		ct.build(this);
		t = ct.toHTML(getGrant(), false);
		a.setContent("ENU", a.getContent("ENU").replace("[CROSSTAB]", t));

		getGrant().setLang(lang); // restore user's language
	}
	return null; // no error
}

Je regarde pour que Simplicité concatène les langues des destinataires, ça devrait pas être compliqué.

En fait si, car une alerte peut être un SMS, une carte Trello… donc à étudier plus en détail.