Визуальная сила:преобразование возвратов каретки в html-переводы строк в длинном текстовом поле

StackOverflow https://stackoverflow.com/questions/2525707

Вопрос

В Salesforce, если я привязываю текстовое поле к странице VisualForce, какой хороший способ преобразовать возвраты каретки в текстовом поле в HTML <br/> метки?

например ,начиная с чего-то подобного этому:

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

...если описание длинное с большим количеством возвратов каретки, как мне оформить его в HTML-формате?

(Я предполагаю, что это довольно простой вопрос, и я уверен, что мог бы погуглить его, но чтобы привлечь сюда сообщество Salesforce, я полагаю, нам нужно несколько простых вопросов.)

Редактировать:(Баунти добавлен, чтобы попытаться вызвать некоторое волнение)

Это было полезно?

Решение

Попробуй это:

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

Использование выходных полей автоматически сохранит форматирование.

Другие советы

В конце концов я добился этого с помощью некоторого длинного кода.

В пользовательском контроллере добавьте методы для возврата поля после ручного поиска и замените разрывы строк в поле и замените их на <br/> Теги:

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/>');
}

Затем на странице используйте apex:outputText с escape="false".:

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

Обратите внимание, что escape="false" необходим для предотвращения экранирования VisualForce html-тегов.Это также означает, что вы оставляете себя открытым для скриптовых атак, которые гипотетически могут быть встроены в данные.Вот почему lineBreaks() fn в контроллере также заменяет любой < и > Персонажи.

(Возможно, есть лучший способ сделать строку безопасной, предложения приветствуются)

Технрд выше ответил на этот вопрос за меня.

Я разрабатываю представление обращений с вкладками, аналогичное обычному примеру для учетных записей.Когда дело доходит до отображения комментариев к обращению, вы не можете просто поместить их в связанный список, а вместо этого вам нужно отформатировать их вручную.Использование стандартной apex pageBlockTable приводит к получению плотно упакованной таблицы, которая не может быть прочитана пользователями, поэтому нам приходится больше кодировать вручную.Этот подход также позволяет мне использовать CSS для форматирования содержимого таблицы.Но проблема заключалась в форматировании комментариев к обращениям с помощью разрывов строк и форматирования сообщений электронной почты.Ответ Технрда сработал отлично!

Для других вот код для отображения вкладки с отформатированным комментарием CaseComment вместе с действием по редактированию комментария.

<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>

Вы пробовали использовать outputText?

ЕСЛИ это не сработает, проголосуйте за мою идею здесь: https://sites.secure.force.com/ideaexchange/ideaView?id=08730000000H4XDAA0 Поскольку у меня такая же проблема при попытке вернуть JSON на страницу.

Другие люди тоже хотят эту идею https://sites.secure.force.com/ideaexchange/apex/ideaview?id=08730000000BrhEAAS

Что касается меня, TehNrd справился с задачей - я пытался отобразить "Описание" обращения в шаблоне уведомления VisualForce по электронной почте, и все CR / LFS исчезли, а строки / абзацы были объединены.Придание ему значения OutputField полностью исправило это.

Вы могли бы попробовать что-то вроде:

{!substitute(Case.Description, '\n', '<br/>')}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top