JSFs: commandLink как параметр для outputFormat - PullRequest
4 голосов
/ 30 июля 2009

Я нахожусь в процессе интернационализации некоторых файлов JSF, поэтому экстернализирую строки (и объединяю строки с использованием заполнителей). У меня очень мало опыта работы с JSF (сегодня и вчера), поэтому извините, если на мой вопрос есть ответ obviuos!

Я успешно использовал тег h: outputFormat (и тег f: param) для простых заполнителей, но теперь я собираюсь заменить заполнитель компонентом commandLink.

т.е.

<h:outputFormat value="#{adminMsgs.scheduleUpdateLink} ">
    <h:commandLink value="#{adminMsgs.update}" action="refresh" />
</h:outputFormat>

Файл свойств:

scheduleUpdateLink = After waiting a few seconds, please {0} the page.
update = update

И вывод по этим линиям:

After waiting a few seconds, please <a href="#" class="..." onclick="...;return false;">update</a> the page.

Это не работает (ссылка на обновление появляется перед текстом scheduleUpdateLink), кто-нибудь знает, как я могу это сделать?

Заранее спасибо.

РЕДАКТИРОВАТЬ / ОБНОВИТЬ

Спасибо за ваш ответ, Макдауэлл - очень полезный, но все еще не полностью решил мою проблему. Мне также нужно будет сделать то же самое с полями ввода (h: inputText), а также могут быть случаи, когда в одной строке ресурса есть несколько заполнителей. Поэтому я не могу гарантировать, что порядок, скажем, на арабском, будет таким же.

Если бы я пошел с функцией Java; знаете ли вы, если есть способ, которым я могу передать в виде строки теги JSF, например, <h:outputFormat value=... и использовать контекст лица, чтобы получить визуализированный HTML-код, который я затем могу вставить в соответствующие заполнители и вернуть в виде простого HTML-кода? Или какие-нибудь другие идеи в этом направлении?

Приветствие.

Ответы [ 3 ]

6 голосов
/ 30 июля 2009

Тег h: outputFormat (насколько я знаю) будет использовать только f: param children в качестве параметров.

Если сообщение было ссылкой (вместо h: commandLink ), вы могли бы использовать литералы HTML:

<h:outputFormat escape="false" 
    value="...seconds, please &lt;a href='etc..." />.

Я бы не советовал пытаться эмулировать h: commandLink, делая это. Может быть возможно найти более богатую версию h: commandLink в сторонней библиотеке , которая делает именно то, что вы хотите.

Простое разбиение строки на две части возможно, но усложняет жизнь переводчикам, и качество перевода может пострадать (особенно если вы делаете это много).

Я бы посмотрел на использование пользовательской функции, подобной этой:

<f:loadBundle basename="i18n.I18n" var="bundle" />
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 0)}" />
<h:commandLink>
  <h:outputText value="#{bundle.update}" />
</h:commandLink>
<h:outputText value="#{i18n:fragment(bundle.scheduleUpdateLink, 1)}" />

Вывод имеет вид:

After waiting a few seconds, please <script type="text/javascript"><!--
    /*JavaScript elided*/
//-->
</script><a href="#"
      onclick="return oamSubmitForm('someClientId');">update</a> the page.

Функция поддерживается статическим методом, который разбивает строку и возвращает запрошенный фрагмент:

public static String fragment(String string, int index) {
  // TODO: regex probably not complete; ask stackoverflow!
  // see http://java.sun.com/javase/6/docs/api/java/text/MessageFormat.html
  final String regex = "\\{\\d.*?\\}";
  String[] fragments = string.split(regex, index + 2);
  return fragments[index];
  // TODO: error handling
}

В зависимости от вашей технологии просмотра (Facelets или JSP), объявление функции может немного отличаться:


РЕДАКТИРОВАТЬ: на основе дополнительной информации

JSF использует декларативный подход к созданию интерфейсов. Вам нужен динамический пользовательский интерфейс с упорядоченными дочерними элементами в порядке их появления в переведенной строке. Эти две вещи противоречат друг другу, но еще не все потеряно.

Есть несколько способов подойти к этому.

  • Перепроектируйте пользовательский интерфейс, чтобы использовать текст выше, таблицу ввода / управления ниже (популярный подход к форме). Это самое простое решение, но оно может не порадовать вашего дизайнера пользовательского интерфейса.
  • Используйте атрибут привязки на панели , чтобы создать и программно упорядочить все. Это может означать много повторяющегося кода в ваших компонентах.
  • Напишите пользовательский элемент управления многократного использования, который может выглядеть следующим образом:

.

<ed:formatPane string="click {0} after filling in forename {1} and surname {2}">
   <h:commandLink value="#{bundle.linkMsg}" />
   <h:inputText value="#{bean.prop1}" />
   <h:inputText value="#{bean.prop2}" />
</ed:formatPane>

Возможно, возможно (и меньше работы) просто заменить средство визуализации для h: outputFormat для поддержки произвольных дочерних элементов вместо создания полного пользовательского элемента управления, но я бы поспорил с этим, поскольку это может привести к путанице в течение длительного техническое обслуживание.

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

0 голосов
/ 30 июля 2009

Для решения вашей проблемы вы можете использовать вместо этого , как сказал Торбьерн.

В основном ваш код и файл свойств становятся такими:

<h:outputText value="#{adminMsgs.scheduleUpdateLink1}" />
<h:commandLink value="#{adminMsgs.update}" action="refresh" />
<h:outputText value0"#{adminMsgs.scheduleUpdateLink2}" />

и файл свойств, подобный этому:

scheduleUpdateLink1 = After waiting a few seconds, please
update = update
scheduleUpdateLink2 = the page.

Tbh Я не думаю, что outputFormat работает с UiComponents, а только с текстом.

0 голосов
/ 30 июля 2009

Для того, чтобы JSF правильно отображал простые тексты, он должен быть сгенерирован (есть неясная техническая причина) Я хотел бы сделать это с outputText, commandLink и outputText.

В общем, при работе с JSF все должно быть тегом, а не простым текстом.

Удобный справочник: http://exadel.com/tutorial/jsf/jsftags-guide.html

...