2010-03-26 5 views
5

Dans Salesforce, si je lie un champ de texte dans une page VisualForce, quel est un bon moyen de convertir les retours chariot dans le champ texte en HTML <br/> étiquettes?VisualForce: convertit les retours chariot aux sauts de ligne html dans un long champ de texte

par exemple. à partir de quelque chose comme ceci:

<apex:page standardController="Case"> 
    <apex:pageBlock title="Test"> 
     <p>{!case.Description}</p> 
    </apex:pageBlock>     
    <apex:detail relatedList="false" /> 
</apex:page> 

... si la description est longue avec beaucoup de retours chariot, comment puis-je HTML ifier?

(Je suppose que cela est une question assez facile, et je suis sûr que je pourrais google, mais pour obtenir la communauté Salesforce se passe ici je figure nous avons besoin de quelques questions faciles.)

edit: (Bounty ajouté pour essayer de générer une certaine excitation)

Répondre

4

essayez ceci:

<apex:outputField value="{!case.Description}"/> 

Utilisation des champs de sortie maintiendront le formatage automagiquement.

+0

Cela ne fonctionne pas pour moi. Lorsque j'utilise outputField, les retours chariot ne sont pas convertis. – codeulike

+0

Mais il semble fonctionner pour les autres! – codeulike

3

J'ai finalement été obtenu avec un code de longue haleine.

Dans le contrôleur personnalisé, ajouter des méthodes pour retourner le champ après la recherche manuelle et remplacer les sauts de ligne dans le domaine et les remplacer par <br/> tags:

public string getCaseDescriptionFormatted() 
{ 
    Case c = this.loadCaseFromDatabaseOrWhatever(); 
    return lineBreaks(c.Description); 
} 

private string lineBreaks(string inText) 
{ 
    if (inText == null) 
     return ''; 
    else 
     return inText.replaceAll('<','(').replaceAll('>',')').replaceAll('\n','<br/>'); 
} 

Puis, dans la page, utilisez le sommet: outputText avec échapper = "false":

<apex:outputText value="{!CaseDescriptionFormatted}" escape="false" /> 

Notez que échapper = "false" est nécessaire pour empêcher Visualforce de se soustraire aux balises HTML. Cela signifie également que vous vous laissez ouvert à des attaques par script qui pourraient être hypothétiquement intégrées dans les données. C'est pourquoi le lineBreaks() fn dans le contrôleur remplace également tous les caractères < et >.

(Il peut y avoir une meilleure façon de faire la chaîne en sécurité, suggestions bienvenues)

0

Vous pouvez essayer quelque chose comme:

{!substitute(Case.Description, '\n', '<br/>')} 
0

Pour moi, TehNrd clouée - je cherchais à afficher un cas "Description" dans un modèle de courrier électronique de notification VisualForce, et tous les CR/LF ont disparu et les lignes/paragraphes ont été exécutés ensemble. En en faisant une valeur OutputField totalement fixée.

1

TehNrd ci-dessus a répondu à la question pour moi.

Je développe une vue à onglets de cas semblable à l'exemple commun pour les comptes.Quand il s'agit d'afficher les commentaires de cas, vous ne pouvez pas les mettre dans une liste associée et vous devez les formater à la main. L'utilisation du standard pageBlockTable de l'apex aboutit à une table très compacte qui ne peut pas être lue par les utilisateurs, nous devons donc faire plus de codage à la main. Cette approche me permet également d'utiliser CSS pour formater le contenu de la table. Mais le problème était de formater les commentaires de cas avec des sauts de ligne et des messages électroniques formatés. La réponse de TehNrd a parfaitement fonctionné!

Pour les autres, voici le code pour afficher un onglet avec CaseComment formaté avec une action pour éditer le commentaire.

<apex:tab label="Comments" name="Comments" id="tabComments"> 
    <apex:form > 
     <apex:pageBlock id="commentsPageBlock"> 
      <apex:pageBlockButtons location="top"> 
       <apex:commandButton value="Toggle Sort" action="{!RequeryComments}" id="theButton" rerender="commentsPageBlock"></apex:commandButton> 
      </apex:pageBlockButtons> 
      <table border="0" class="commentsTable">  
      <tr> 
       <th class="commentsActionColumn">Action</th> 
       <th class="commentBodyClass">Comments</th> 
      </tr> 
      <!-- get the case comments from the controller --> 
      <apex:repeat value="{!comments}" var="c"> 
       <tr> 
       <td class="commentsActionColumn"> 
       <!-- open the case comment for edit --> 
       <apex:outputLink title="" value="/{!c.id}/e?parent_id={!c.parentId}&retURL=/apex/{!$CurrentPage.Name}%3Fid={!case.id}" style="font-weight:bold">Edit</apex:outputLink> 
       </td> 
       <td> 
       <!-- display the case comment formatted using the apex outputField --> 
       <div class="commentTdClass"> 
       <apex:outputField value="{!c.commentbody}"></apex:outputField> 
       </div> 
       </td> 
       </tr> 
      </apex:repeat> 
      </table> 
     </apex:pageBlock> 
    </apex:form> 
</apex:tab> 
+0

Mise à jour: l'action d'édition ne fonctionne que si l'utilisateur actuel possède le commentaire de cas. Je travaille sur une solution et mettra à jour. – Bryan

Questions connexes